{"file_path":"contracts/MTokenMessenger.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.24;\n\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {Client} from \"@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol\";\nimport {CCIPReceiver} from \"@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol\";\nimport {IRouterClient} from \"@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol\";\nimport {Ownable} from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport {MTokenMessengerLZ} from \"./MTokenMessengerLZ.sol\";\nimport {ICCClient} from \"./interfaces/ICCClient.sol\";\n\n/*\n\n   CCIP                                |   LayerZero\n---------------------------------------+--------------------------------\nsetAllowedPeer                         | lzSetPeer\nsendTokenToChain                       | lzSendTokenToChain\nsendMintBudgetToChain                  | lzSendMintBudgetToChain\ncalculateCCSendTokenFeeAndMessage      | lzCalculateSendTokenFee\ncalculateCcSendMintBudgetFeeAndMessage | lzCalculateSendMintBudgetFee\n\n*/\n\n/// @custom:oz-upgrades-unsafe-allow constructor\n/// @custom:oz-upgrades-unsafe-allow state-variable-immutable\ncontract MTokenMessenger is CCIPReceiver, MTokenMessengerLZ {\n    using Address for address payable;\n\n    struct PeerInfo {\n        bool allowed;\n        uint8 addrLen; // 0 means no address length check\n    }\n\n    // messenger must be 32 bytes (left padded with 0) if chainSelector points to an EVM chain\n    mapping(uint64 chainSelector => mapping(bytes messenger => PeerInfo))\n        public allowedPeer;\n\n    event AllowedPeer(uint64 chainSelector, bytes messenger, bool allowed);\n    event CCReceive(bytes32 indexed messageID, bytes messageData);\n    event CCSendToken(bytes32 indexed messageID, bytes messageData);\n    event CCSendMintBudget(bytes32 indexed messageID, bytes messageData);\n\n    error NotInAllowListed(uint64 chainSelector, bytes messenger);\n    error InsufficientFee(uint256 required, uint256 actual);\n\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address _ccipRouter,\n        address _lzEndpoint\n    ) CCIPReceiver(_ccipRouter) MTokenMessengerLZ(_lzEndpoint) {}\n\n    // CCIP related config.\n    function setAllowedPeer(\n        uint64 chainSelector,\n        bytes calldata messenger,\n        bool allowed,\n        uint8 addrLen\n    ) external onlyOwner {\n        allowedPeer[chainSelector][messenger] = PeerInfo({\n            allowed: allowed,\n            addrLen: addrLen\n        });\n        emit AllowedPeer(chainSelector, messenger, allowed);\n    }\n\n    function _ccipReceive(\n        Client.Any2EVMMessage memory any2EvmMessage\n    ) internal override {\n        uint64 chainSelector = any2EvmMessage.sourceChainSelector;\n        bytes memory sender = any2EvmMessage.sender;\n        if (!allowedPeer[chainSelector][sender].allowed) {\n            revert NotInAllowListed(chainSelector, sender);\n        }\n\n        ICCClient(ccClient).ccReceive(any2EvmMessage.data);\n        emit CCReceive(any2EvmMessage.messageId, any2EvmMessage.data);\n    }\n\n    function calculateCCSendTokenFeeAndMessage(\n        uint64 destinationChainSelector,\n        bytes calldata messageReceiver,\n        address sender,\n        bytes calldata recipient,\n        uint256 value,\n        bytes calldata extraArgs\n    )\n        public\n        view\n        returns (uint256 fee, Client.EVM2AnyMessage memory evm2AnyMessage)\n    {\n        bytes memory data = ICCClient(ccClient).msgOfCcSendToken(\n            sender,\n            recipient,\n            value\n        );\n        (fee, evm2AnyMessage) = getFeeAndMessage(\n            destinationChainSelector,\n            messageReceiver,\n            extraArgs,\n            data\n        );\n    }\n\n    function calculateCcSendMintBudgetFeeAndMessage(\n        uint64 destinationChainSelector,\n        bytes calldata messageReceiver,\n        uint112 value,\n        bytes calldata extraArgs\n    )\n        public\n        view\n        returns (uint256 fee, Client.EVM2AnyMessage memory evm2AnyMessage)\n    {\n        bytes memory data = ICCClient(ccClient).msgOfCcSendMintBudget(value);\n        (fee, evm2AnyMessage) = getFeeAndMessage(\n            destinationChainSelector,\n            messageReceiver,\n            extraArgs,\n            data\n        );\n    }\n\n    // note: unlike LayerZero component, there is no way to specifically pause CCIP\n    // send transactions. To pause CCIP requires enabling disableCcSend which will\n    // pause both CCIP & LayerZero send txns. We are gradually deprecating CCIP\n    function sendTokenToChain(\n        uint64 destinationChainSelector,\n        bytes calldata messageReceiver,\n        bytes calldata recipient,\n        uint256 value,\n        bytes calldata extraArgs\n    ) external payable returns (bytes32 messageId) {\n        PeerInfo memory peer = allowedPeer[destinationChainSelector][messageReceiver];\n        if (!peer.allowed) {\n            revert NotInAllowListed(destinationChainSelector, messageReceiver);\n        }\n        if (peer.addrLen != 0 && recipient.length != peer.addrLen) {\n            revert InvalidRecipientLength(peer.addrLen, uint8(recipient.length));\n        }\n        bytes memory data = ICCClient(ccClient).ccSendToken(\n            msg.sender,\n            recipient,\n            value\n        );\n        messageId = sendDataToChain(\n            destinationChainSelector,\n            messageReceiver,\n            extraArgs,\n            data\n        );\n        emit CCSendToken(messageId, data);\n    }\n\n    function sendMintBudgetToChain(\n        uint64 destinationChainSelector,\n        bytes calldata messageReceiver,\n        uint112 value,\n        bytes calldata extraArgs\n    ) external payable returns (bytes32 messageId) {\n        if (!allowedPeer[destinationChainSelector][messageReceiver].allowed) {\n            revert NotInAllowListed(destinationChainSelector, messageReceiver);\n        }\n        bytes memory data = ICCClient(ccClient).ccSendMintBudget(value);\n        messageId = sendDataToChain(\n            destinationChainSelector,\n            messageReceiver,\n            extraArgs,\n            data\n        );\n        emit CCSendMintBudget(messageId, data);\n    }\n\n    function getFeeAndMessage(\n        uint64 destinationChainSelector,\n        bytes calldata messageReceiver,\n        bytes calldata extraArgs,\n        bytes memory data\n    )\n        public\n        view\n        returns (uint256 fee, Client.EVM2AnyMessage memory evm2AnyMessage)\n    {\n        evm2AnyMessage = Client.EVM2AnyMessage({\n            receiver: messageReceiver,\n            data: data,\n            tokenAmounts: new Client.EVMTokenAmount[](0),\n            extraArgs: extraArgs,\n            feeToken: address(0)\n        });\n        fee = IRouterClient(getRouter()).getFee(\n            destinationChainSelector,\n            evm2AnyMessage\n        );\n    }\n\n    function sendDataToChain(\n        uint64 destinationChainSelector,\n        bytes calldata messageReceiver,\n        bytes calldata extraArgs,\n        bytes memory data\n    ) internal returns (bytes32 messageId) {\n        (\n            uint256 fee,\n            Client.EVM2AnyMessage memory evm2AnyMessage\n        ) = getFeeAndMessage(\n                destinationChainSelector,\n                messageReceiver,\n                extraArgs,\n                data\n            );\n        if (msg.value < fee) {\n            revert InsufficientFee(fee, msg.value);\n        }\n        messageId = IRouterClient(getRouter()).ccipSend{value: fee}(\n            destinationChainSelector,\n            evm2AnyMessage\n        );\n        if (msg.value - fee > 0) {\n            payable(msg.sender).sendValue(msg.value - fee);\n        }\n    }\n}\n","deployed_bytecode":"0x6080604052600436106102dc5760003560e01c80636feb121311610184578063ad3cb1cc116100d6578063bb0b6a531161008a578063e9555a7a11610064578063e9555a7a146108f3578063f2fde38b1461092a578063ff7bd03d1461094a57600080fd5b8063bb0b6a5314610861578063c1073302146108b3578063ca5eb5e1146108d357600080fd5b8063af47ef51116100bb578063af47ef51146107e7578063b0f479a114610807578063b703567f1461083a57600080fd5b8063ad3cb1cc14610769578063ae8bd784146107bf57600080fd5b806382413eac11610138578063950e61c611610112578063950e61c6146107205780639f04099214610741578063a0941d0c1461075457600080fd5b806382413eac1461069457806385572ffb146106c35780638da5cb5b146106e357600080fd5b806373ac7c931161016957806373ac7c93146105db5780637478015c146106495780637d25a05e1461067157600080fd5b80636feb1213146105a6578063715018a6146105c657600080fd5b80633286738a1161023d5780634a506553116101f15780635e280f11116101cb5780635e280f111461051857806361a0cdd61461054c5780636a42b8f81461056c57600080fd5b80634a506553146104d05780634f1ef286146104f057806352d1902d1461050357600080fd5b806340bb80b21161022257806340bb80b214610470578063485cc9551461049057806349345bfc146104b057600080fd5b80633286738a146104305780633400288b1461045057600080fd5b806313137d65116102945780631b13bff3116102795780631b13bff3146103ea5780632d9773031461040a5780632f9454801461041d57600080fd5b806313137d65146103b357806317442b70146103c857600080fd5b80630711896e116102c55780630711896e1461033757806309ff18f01461036557806311532e771461039d57600080fd5b806301ffc9a7146102e1578063044ac38714610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612fc8565b61096a565b60405190151581526020015b60405180910390f35b61032961032436600461306c565b610a03565b60405190815260200161030d565b34801561034357600080fd5b50610357610352366004613228565b610bde565b60405161030d9291906133e0565b34801561037157600080fd5b50600054610385906001600160a01b031681565b6040516001600160a01b03909116815260200161030d565b3480156103a957600080fd5b5061032960015481565b6103c66103c136600461342e565b610da9565b005b3480156103d457600080fd5b506040805160018152600260208201520161030d565b3480156103f657600080fd5b506103c66104053660046134de565b610e96565b610329610418366004613517565b610f05565b61032961042b366004613578565b611045565b34801561043c57600080fd5b5061035761044b366004613578565b611183565b34801561045c57600080fd5b506103c661046b3660046135ef565b611268565b34801561047c57600080fd5b5061035761048b366004613619565b6112e7565b34801561049c57600080fd5b506103c66104ab3660046136e6565b6113ca565b3480156104bc57600080fd5b506103296104cb366004613517565b6114ea565b3480156104dc57600080fd5b506103c66104eb36600461371f565b6115c6565b6103c66104fe36600461371f565b611674565b34801561050f57600080fd5b5061032961176d565b34801561052457600080fd5b506103857f0000000000000000000000001a44076050125825900e736c501f859c50fe728c81565b34801561055857600080fd5b506103c6610567366004613780565b61179c565b34801561057857600080fd5b5060035461058d9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030d565b3480156105b257600080fd5b506103c66105c13660046137f8565b611872565b3480156105d257600080fd5b506103c66118cf565b3480156105e757600080fd5b506106306105f6366004613834565b6004602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff8082169161010090041682565b60408051921515835260ff90911660208301520161030d565b34801561065557600080fd5b5060035461058d90600160401b900467ffffffffffffffff1681565b34801561067d57600080fd5b5061058d61068c3660046135ef565b600092915050565b3480156106a057600080fd5b506103016106af366004613852565b6001600160a01b0381163014949350505050565b3480156106cf57600080fd5b506103c66106de3660046138b9565b6118e3565b3480156106ef57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610385565b34801561072c57600080fd5b5060025461058d9067ffffffffffffffff1681565b61032961074f3660046138f4565b61195b565b34801561076057600080fd5b506103c6611b08565b34801561077557600080fd5b506107b26040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161030d91906139aa565b3480156107cb57600080fd5b5060035461058d90600160801b900467ffffffffffffffff1681565b3480156107f357600080fd5b506103296108023660046139bd565b611b23565b34801561081357600080fd5b507f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d610385565b34801561084657600080fd5b5060025461038590600160401b90046001600160a01b031681565b34801561086d57600080fd5b5061032961087c366004613a3a565b63ffffffff1660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602052604090205490565b3480156108bf57600080fd5b506103c66108ce366004613a55565b611bfd565b3480156108df57600080fd5b506103c66108ee366004613a72565b611e0e565b3480156108ff57600080fd5b507fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a92005460ff16610301565b34801561093657600080fd5b506103c6610945366004613a72565b611ead565b34801561095657600080fd5b50610301610965366004613a8f565b611f01565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb0000000000000000000000000000000000000000000000000000000014806109fd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b7fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920080546000919060ff1615610a6b5760405162461bcd60e51b8152602060048201526009602482015268131697d4105554d15160ba1b60448201526064015b60405180910390fd5b63ffffffff881660009081527fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920160205260409020547fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a92009060ff168015801590610ad7575060ff81168814155b15610b0257604051630608c54560e41b815260ff808316600483015289166024820152604401610a62565b6002546040516313e2d16d60e21b8152600091600160401b90046001600160a01b031690634f8b45b490610b409033908e908e908e90600401613ad4565b6000604051808303816000875af1158015610b5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b879190810190613b08565b9050610b968b82898934611f1f565b9450847f807c60b9fea886cff0b1e19b617c1dcec7abd65fc5f749bc0088ab90b161cb9982604051610bc891906139aa565b60405180910390a2505050509695505050505050565b6000610c1b6040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b6040518060a0016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018790526040805183815291820181529092019190610ca3565b6040805180820190915260008082526020820152815260200190600190039081610c7c5790505b50815260200160006001600160a01b0316815260200186868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517f20487ded0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d16906320487ded90610d5b908b908590600401613b76565b602060405180830381865afa158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9c9190613b99565b9150965096945050505050565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b03163314610e0d576040517f91ac5e4f000000000000000000000000000000000000000000000000000000008152336004820152602401610a62565b60208701803590610e2790610e22908a613a3a565b61201e565b14610e7e57610e396020880188613a3a565b6040517fc26bebcc00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260208801356024820152604401610a62565b610e8d8787878787878761209b565b50505050505050565b610e9e612148565b7fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a9200805460ff191682151590811782556040519081527f9d5bdd1bf7642eb0b282e29b5238683a20705993486eb9f3f03624dd22ef35c0906020015b60405180910390a15050565b7fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920080546000919060ff1615610f685760405162461bcd60e51b8152602060048201526009602482015268131697d4105554d15160ba1b6044820152606401610a62565b60025460405163515743fd60e11b81526dffffffffffffffffffffffffffff87166004820152600091600160401b90046001600160a01b03169063a2ae87fa906024016000604051808303816000875af1158015610fca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ff29190810190613b08565b90506110018782878734611f1f565b9250827f72e13b8c38191bb144d7db8a06b965d7ee0baff0951c98c27bb7d1efba85e3418260405161103391906139aa565b60405180910390a25050949350505050565b67ffffffffffffffff8616600090815260046020526040808220905161106e9088908890613bb2565b9081526040519081900360200190205460ff166110a457868686604051637a0fd12f60e11b8152600401610a6293929190613bc2565b60025460405163515743fd60e11b81526dffffffffffffffffffffffffffff86166004820152600091600160401b90046001600160a01b03169063a2ae87fa906024016000604051808303816000875af1158015611106573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261112e9190810190613b08565b905061113e8888888787866121bc565b9150817ffded04ddd0bd554dd80207f5cf62753799df9161f2d830a74804c9adc4b0c7418260405161117091906139aa565b60405180910390a2509695505050505050565b60006111c06040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b600254604051633f95de0760e11b81526dffffffffffffffffffffffffffff87166004820152600091600160401b90046001600160a01b031690637f2bbc0e90602401600060405180830381865afa158015611220573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112489190810190613b08565b9050611258898989888886610bde565b909a909950975050505050505050565b611270612148565b63ffffffff821660008181527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602081815260409283902085905582519384528301849052815190927f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b92908290030190a1505050565b60006113246040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b60025460405163d017abed60e01b8152600091600160401b90046001600160a01b03169063d017abed90611362908c908c908c908c90600401613ad4565b600060405180830381865afa15801561137f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a79190810190613b08565b90506113b78c8c8c888886610bde565b909d909c509a5050505050505050505050565b60006113d46122f6565b805490915060ff600160401b820416159067ffffffffffffffff166000811580156113fc5750825b905060008267ffffffffffffffff1660011480156114195750303b155b905081158015611427575080155b1561145e576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561148d57845468ff00000000000000001916600160401b1785555b611497878761231f565b8315610e8d57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b600254604051633f95de0760e11b81526dffffffffffffffffffffffffffff851660048201526000918291600160401b9091046001600160a01b031690637f2bbc0e90602401600060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115759190810190613b08565b905060006115ba878387878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061233a915050565b51979650505050505050565b6115ce612148565b6115d78261241b565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790558051602082012060015560035467ffffffffffffffff166116209042613bfc565b6002805467ffffffffffffffff191667ffffffffffffffff929092169190911790556040517fcc54b42f78b332711d2d2b40bd7edb325a1fef0124753b0689728b7209ca1e2e90610ef99084908490613c1d565b61167c61245b565b6000546001600160a01b038381169116146116c3576040517f9ab1811500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001548151602083012014611704576040517fefac8be100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025467ffffffffffffffff168015806117275750428167ffffffffffffffff16115b1561175e576040517f260343ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117688383612512565b505050565b600061177761252d565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6117a4612148565b604051806040016040528083151581526020018260ff16815250600460008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002085856040516117f5929190613bb2565b908152604051908190036020908101822083518154949092015160ff166101000261ff00199215159290921661ffff1990941693909317179091557fa36487e92bca51221cf341d7435763a17245d774855df7206cc354c3db192c1490611863908790879087908790613c3f565b60405180910390a15050505050565b61187a612148565b6118848383611268565b63ffffffff9290921660009081527fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920160205260409020805460ff191660ff9093169290921790915550565b6118d7612148565b6118e16000612576565b565b336001600160a01b037f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d1614611947576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610a62565b61195861195382613d23565b6125f4565b50565b67ffffffffffffffff88166000908152600460205260408082209051829190611987908b908b90613bb2565b9081526040805160209281900383018120818301909252905460ff8082161515808452610100909204169282019290925291506119dd57898989604051637a0fd12f60e11b8152600401610a6293929190613bc2565b602081015160ff16158015906119fa5750602081015160ff168614155b15611a2b576020810151604051630608c54560e41b815260ff91821660048201529087166024820152604401610a62565b6002546040516313e2d16d60e21b8152600091600160401b90046001600160a01b031690634f8b45b490611a699033908c908c908c90600401613ad4565b6000604051808303816000875af1158015611a88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ab09190810190613b08565b9050611ac08b8b8b8888866121bc565b9250827f33025ba6b00deb9d8b01d53d63796788e0e248ae9499e54610fe38bce2444e5882604051611af291906139aa565b60405180910390a2505098975050505050505050565b611b10612148565b6002805467ffffffffffffffff19169055565b60025460405163d017abed60e01b81526000918291600160401b9091046001600160a01b03169063d017abed90611b64908b908b908b908b90600401613ad4565b600060405180830381865afa158015611b81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ba99190810190613b08565b90506000611bee8a8387878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061233a915050565b519a9950505050505050505050565b611c05612148565b610e1067ffffffffffffffff82161015611c4b576040517fed75f3c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6202a30067ffffffffffffffff82161115611c92576040517f1bc4dde000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600160801b810467ffffffffffffffff90811691600160401b90048116908316148015611ccb575067ffffffffffffffff811615155b8015611ce05750428167ffffffffffffffff16105b15611d35576003805467ffffffffffffffff191667ffffffffffffffff84169081179091556040519081527f0ed594aee59a2d00c8a1183779743ed2c0f8e413f761a48b181a72cb86e1a05a90602001610ef9565b60035467ffffffffffffffff166000611d4e8242613bfc565b600380547fffffffffffffffff00000000000000000000000000000000ffffffffffffffff16600160401b67ffffffffffffffff8881169182027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1692909217600160801b8584169081029190911790935560408051928716835260208301919091528101919091529091507f8189ce093e30309b5e2dffeabdf7adf977853585d6b56995e8c8098342f6546f9060600160405180910390a150505b5050565b611e16612148565b6040517fca5eb5e10000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000001a44076050125825900e736c501f859c50fe728c169063ca5eb5e190602401600060405180830381600087803b158015611e9257600080fd5b505af1158015611ea6573d6000803e3d6000fd5b5050505050565b611eb5612148565b6001600160a01b038116611ef8576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610a62565b61195881612576565b600060208201803590611f189061087c9085613a3a565b1492915050565b600080611f63878787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061233a915050565b8051909150831015611fb75760405162461bcd60e51b815260206004820152601360248201527f4c5a5f494e53554646494349454e545f464545000000000000000000000000006044820152606401610a62565b6000612011888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604080518082019091528c81526020810191909152925033915061270d9050565b5198975050505050505050565b63ffffffff811660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f9006020819052604082205480612094576040517ff6ff4fb700000000000000000000000000000000000000000000000000000000815263ffffffff85166004820152602401610a62565b9392505050565b60025460405163f6ec1c4d60e01b8152600160401b9091046001600160a01b03169063f6ec1c4d906120d39088908890600401613dd0565b600060405180830381600087803b1580156120ed57600080fd5b505af1158015612101573d6000803e3d6000fd5b50505050857fcb469615696db7ded9e04049076cc20ba6156f4aea9a21ad1db7a94ddf8ff3a08686604051612137929190613dd0565b60405180910390a250505050505050565b3361217a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146118e1576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610a62565b60008060006121cf898989898989610bde565b9150915081341015612216576040517fa458261b00000000000000000000000000000000000000000000000000000000815260048101839052346024820152604401610a62565b6040517f96f4e9f90000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d16906396f4e9f990849061227f908d908690600401613b76565b60206040518083038185885af115801561229d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122c29190613b99565b925060006122d08334613de4565b11156122ea576122ea6122e38334613de4565b3390612818565b50509695505050505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109fd565b6123276128c7565b61233081612905565b611e0a8282612926565b60408051808201909152600080825260208201527f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b031663ddc28c586040518060a001604052808863ffffffff16815260200161239d8961201e565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016123d2929190613df7565b6040805180830381865afa1580156123ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124129190613ea0565b95945050505050565b6001600160a01b038116611958576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b306001600160a01b037f000000000000000000000000815cd16c1e3a8e1e0e9fc2fc5bcba5d48e7d6f761614806124f457507f000000000000000000000000815cd16c1e3a8e1e0e9fc2fc5bcba5d48e7d6f766001600160a01b03166124e87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b156118e15760405163703e46dd60e11b815260040160405180910390fd5b61251a61245b565b61252382612979565b611e0a8282612981565b306001600160a01b037f000000000000000000000000815cd16c1e3a8e1e0e9fc2fc5bcba5d48e7d6f7616146118e15760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60208082015160408084015167ffffffffffffffff831660009081526004909452928190209051919291612629908390613ebc565b9081526040519081900360200190205460ff1661265d578181604051637a0fd12f60e11b8152600401610a62929190613ed8565b600254606084015160405163f6ec1c4d60e01b8152600160401b9092046001600160a01b03169163f6ec1c4d91612696916004016139aa565b600060405180830381600087803b1580156126b057600080fd5b505af11580156126c4573d6000803e3d6000fd5b5050505082600001517fa76e8bfca7bc12668a76418f51e4b6a884e03734335e3ad93d4d6355af649770846060015160405161270091906139aa565b60405180910390a2505050565b612715612f80565b60006127248460000151612a69565b60208501519091501561273e5761273e8460200151612aaa565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b0316632637a450826040518060a001604052808b63ffffffff16815260200161278e8c61201e565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b81526004016127ca929190613df7565b60806040518083038185885af11580156127e8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061280d9190613efb565b979650505050505050565b8047101561285b576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610a62565b600080836001600160a01b03168360405160006040518083038185875af1925050503d80600081146128a9576040519150601f19603f3d011682016040523d82523d6000602084013e6128ae565b606091505b5091509150816128c1576128c181612ba5565b50505050565b6128cf612be6565b6118e1576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61290d6128c7565b61291681612c00565b61291e612c11565b611958612c11565b61292e6128c7565b61293781612c19565b50600280546001600160a01b03909216600160401b027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055565b611958612148565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129db575060408051601f3d908101601f191682019092526129d891810190613b99565b60015b612a0357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610a62565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612a5f576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a62565b6117688383612c2a565b6000813414612aa6576040517f9f704120000000000000000000000000000000000000000000000000000000008152346004820152602401610a62565b5090565b60007f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2e9190613f63565b90506001600160a01b038116612b70576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e0a6001600160a01b038216337f0000000000000000000000001a44076050125825900e736c501f859c50fe728c85612c80565b805115612bb457805160208201fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bf06122f6565b54600160401b900460ff16919050565b612c086128c7565b61195881612d08565b6118e16128c7565b612c216128c7565b61195881612d50565b612c3382612d58565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612c78576117688282612ddc565b611e0a612e49565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526128c1908590612e81565b612d106128c7565b6001600160a01b038116611e16576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb56128c7565b806001600160a01b03163b600003612d8e57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610a62565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612df99190613ebc565b600060405180830381855af49150503d8060008114612e34576040519150601f19603f3d011682016040523d82523d6000602084013e612e39565b606091505b5091509150612412858383612f0b565b34156118e1576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080602060008451602086016000885af180612ea4576040513d6000823e3d81fd5b50506000513d91508115612ebc578060011415612ec9565b6001600160a01b0384163b155b156128c1576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a62565b606082612f2057612f1b82612ba5565b612094565b8151158015612f3757506001600160a01b0384163b155b15612f79576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a62565b5092915050565b604051806060016040528060008019168152602001600067ffffffffffffffff168152602001612fc3604051806040016040528060008152602001600081525090565b905290565b600060208284031215612fda57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461209457600080fd5b803563ffffffff8116811461301e57600080fd5b919050565b60008083601f84011261303557600080fd5b50813567ffffffffffffffff81111561304d57600080fd5b60208301915083602082850101111561306557600080fd5b9250929050565b6000806000806000806080878903121561308557600080fd5b61308e8761300a565b9550602087013567ffffffffffffffff808211156130ab57600080fd5b6130b78a838b01613023565b90975095506040890135945060608901359150808211156130d757600080fd5b506130e489828a01613023565b979a9699509497509295939492505050565b67ffffffffffffffff8116811461195857600080fd5b803561301e816130f6565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561315057613150613117565b60405290565b60405160a0810167ffffffffffffffff8111828210171561315057613150613117565b604051601f8201601f1916810167ffffffffffffffff811182821017156131a2576131a2613117565b604052919050565b600067ffffffffffffffff8211156131c4576131c4613117565b50601f01601f191660200190565b600082601f8301126131e357600080fd5b81356131f66131f1826131aa565b613179565b81815284602083860101111561320b57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806080878903121561324157600080fd5b863561324c816130f6565b9550602087013567ffffffffffffffff8082111561326957600080fd5b6132758a838b01613023565b9097509550604089013591508082111561328e57600080fd5b61329a8a838b01613023565b909550935060608901359150808211156132b357600080fd5b506132c089828a016131d2565b9150509295509295509295565b60005b838110156132e85781810151838201526020016132d0565b50506000910152565b600081518084526133098160208601602086016132cd565b601f01601f19169290920160200192915050565b6000815160a0845261333260a08501826132f1565b90506020808401518583038287015261334b83826132f1565b60408681015188830389830152805180845290850195509092506000918401905b8083101561339e57855180516001600160a01b031683528501518583015294840194600192909201919083019061336c565b50606087015194506133bb60608901866001600160a01b03169052565b6080870151945087810360808901526133d481866132f1565b98975050505050505050565b8281526040602082015260006133f9604083018461331d565b949350505050565b60006060828403121561341357600080fd5b50919050565b6001600160a01b038116811461195857600080fd5b600080600080600080600060e0888a03121561344957600080fd5b6134538989613401565b965060608801359550608088013567ffffffffffffffff8082111561347757600080fd5b6134838b838c01613023565b909750955060a08a0135915061349882613419565b90935060c089013590808211156134ae57600080fd5b506134bb8a828b01613023565b989b979a50959850939692959293505050565b8035801515811461301e57600080fd5b6000602082840312156134f057600080fd5b612094826134ce565b80356dffffffffffffffffffffffffffff8116811461301e57600080fd5b6000806000806060858703121561352d57600080fd5b6135368561300a565b9350613544602086016134f9565b9250604085013567ffffffffffffffff81111561356057600080fd5b61356c87828801613023565b95989497509550505050565b6000806000806000806080878903121561359157600080fd5b863561359c816130f6565b9550602087013567ffffffffffffffff808211156135b957600080fd5b6135c58a838b01613023565b90975095508591506135d960408a016134f9565b945060608901359150808211156130d757600080fd5b6000806040838503121561360257600080fd5b61360b8361300a565b946020939093013593505050565b600080600080600080600080600060c08a8c03121561363757600080fd5b8935613642816130f6565b985060208a013567ffffffffffffffff8082111561365f57600080fd5b61366b8d838e01613023565b909a50985060408c0135915061368082613419565b90965060608b0135908082111561369657600080fd5b6136a28d838e01613023565b909750955060808c0135945060a08c01359150808211156136c257600080fd5b506136cf8c828d01613023565b915080935050809150509295985092959850929598565b600080604083850312156136f957600080fd5b823561370481613419565b9150602083013561371481613419565b809150509250929050565b6000806040838503121561373257600080fd5b823561373d81613419565b9150602083013567ffffffffffffffff81111561375957600080fd5b613765858286016131d2565b9150509250929050565b803560ff8116811461301e57600080fd5b60008060008060006080868803121561379857600080fd5b85356137a3816130f6565b9450602086013567ffffffffffffffff8111156137bf57600080fd5b6137cb88828901613023565b90955093506137de9050604087016134ce565b91506137ec6060870161376f565b90509295509295909350565b60008060006060848603121561380d57600080fd5b6138168461300a565b92506020840135915061382b6040850161376f565b90509250925092565b6000806040838503121561384757600080fd5b823561373d816130f6565b60008060008060a0858703121561386857600080fd5b6138728686613401565b9350606085013567ffffffffffffffff81111561388e57600080fd5b61389a87828801613023565b90945092505060808501356138ae81613419565b939692955090935050565b6000602082840312156138cb57600080fd5b813567ffffffffffffffff8111156138e257600080fd5b820160a0818503121561209457600080fd5b60008060008060008060008060a0898b03121561391057600080fd5b883561391b816130f6565b9750602089013567ffffffffffffffff8082111561393857600080fd5b6139448c838d01613023565b909950975060408b013591508082111561395d57600080fd5b6139698c838d01613023565b909750955060608b0135945060808b013591508082111561398957600080fd5b506139968b828c01613023565b999c989b5096995094979396929594505050565b60208152600061209460208301846132f1565b600080600080600080600060a0888a0312156139d857600080fd5b6139e18861300a565b965060208801356139f181613419565b9550604088013567ffffffffffffffff80821115613a0e57600080fd5b613a1a8b838c01613023565b909750955060608a0135945060808a01359150808211156134ae57600080fd5b600060208284031215613a4c57600080fd5b6120948261300a565b600060208284031215613a6757600080fd5b8135612094816130f6565b600060208284031215613a8457600080fd5b813561209481613419565b600060608284031215613aa157600080fd5b6120948383613401565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385168152606060208201526000613af7606083018587613aab565b905082604083015295945050505050565b600060208284031215613b1a57600080fd5b815167ffffffffffffffff811115613b3157600080fd5b8201601f81018413613b4257600080fd5b8051613b506131f1826131aa565b818152856020838501011115613b6557600080fd5b6124128260208301602086016132cd565b67ffffffffffffffff831681526040602082015260006133f9604083018461331d565b600060208284031215613bab57600080fd5b5051919050565b8183823760009101908152919050565b67ffffffffffffffff84168152604060208201526000612412604083018486613aab565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115612f7957612f79613be6565b6001600160a01b03831681526040602082015260006133f960408301846132f1565b67ffffffffffffffff85168152606060208201526000613c63606083018587613aab565b9050821515604083015295945050505050565b600082601f830112613c8757600080fd5b8135602067ffffffffffffffff821115613ca357613ca3613117565b613cb1818360051b01613179565b82815260069290921b84018101918181019086841115613cd057600080fd5b8286015b84811015613d185760408189031215613ced5760008081fd5b613cf561312d565b8135613d0081613419565b81528185013585820152835291830191604001613cd4565b509695505050505050565b600060a08236031215613d3557600080fd5b613d3d613156565b82358152613d4d6020840161310c565b6020820152604083013567ffffffffffffffff80821115613d6d57600080fd5b613d79368387016131d2565b60408401526060850135915080821115613d9257600080fd5b613d9e368387016131d2565b60608401526080850135915080821115613db757600080fd5b50613dc436828601613c76565b60808301525092915050565b6020815260006133f9602083018486613aab565b818103818111156109fd576109fd613be6565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a06080840152613e2d60e08401826132f1565b90506060850151603f198483030160a0850152613e4a82826132f1565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b600060408284031215613e8257600080fd5b613e8a61312d565b9050815181526020820151602082015292915050565b600060408284031215613eb257600080fd5b6120948383613e70565b60008251613ece8184602087016132cd565b9190910192915050565b67ffffffffffffffff831681526040602082015260006133f960408301846132f1565b600060808284031215613f0d57600080fd5b6040516060810181811067ffffffffffffffff82111715613f3057613f30613117565b604052825181526020830151613f45816130f6565b6020820152613f578460408501613e70565b60408201529392505050565b600060208284031215613f7557600080fd5b81516120948161341956fea2646970667358221220eb725e65f501c41757962d62f771b3764ac19e3bd39c1f2a2e348f5534778ec764736f6c63430008180033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":1000},"remappings":[]},"optimization_runs":1000,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/1/0x815cD16c1E3a8E1E0e9FC2Fc5BcBa5d48e7d6f76/","decoded_constructor_args":[["0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D",{"internalType":"address","name":"_ccipRouter","type":"address"}],["0x1a44076050125825900e736c501f859c50fE728c",{"internalType":"address","name":"_lzEndpoint","type":"address"}]],"compiler_version":"0.8.24+commit.e11b9ed9","is_verified_via_verifier_alliance":false,"verified_at":"2026-05-20T06:27:49.666602Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60e06040523060a0523480156200001557600080fd5b5060405162004110380380620041108339810160408190526200003891620000a5565b808080846001600160a01b0381166200006b576040516335fdcccd60e21b81526000600482015260240160405180910390fd5b6001600160a01b039081166080521660c05250620000dd92505050565b80516001600160a01b0381168114620000a057600080fd5b919050565b60008060408385031215620000b957600080fd5b620000c48362000088565b9150620000d46020840162000088565b90509250929050565b60805160a05160c051613fb66200015a6000396000818161052a01528181610dab01528181611e4e015281816123500152818161274001528181612aae0152612b800152600081816124660152818161248f015261253801526000818161081601528181610d24015281816118ee01526122460152613fb66000f3fe6080604052600436106102dc5760003560e01c80636feb121311610184578063ad3cb1cc116100d6578063bb0b6a531161008a578063e9555a7a11610064578063e9555a7a146108f3578063f2fde38b1461092a578063ff7bd03d1461094a57600080fd5b8063bb0b6a5314610861578063c1073302146108b3578063ca5eb5e1146108d357600080fd5b8063af47ef51116100bb578063af47ef51146107e7578063b0f479a114610807578063b703567f1461083a57600080fd5b8063ad3cb1cc14610769578063ae8bd784146107bf57600080fd5b806382413eac11610138578063950e61c611610112578063950e61c6146107205780639f04099214610741578063a0941d0c1461075457600080fd5b806382413eac1461069457806385572ffb146106c35780638da5cb5b146106e357600080fd5b806373ac7c931161016957806373ac7c93146105db5780637478015c146106495780637d25a05e1461067157600080fd5b80636feb1213146105a6578063715018a6146105c657600080fd5b80633286738a1161023d5780634a506553116101f15780635e280f11116101cb5780635e280f111461051857806361a0cdd61461054c5780636a42b8f81461056c57600080fd5b80634a506553146104d05780634f1ef286146104f057806352d1902d1461050357600080fd5b806340bb80b21161022257806340bb80b214610470578063485cc9551461049057806349345bfc146104b057600080fd5b80633286738a146104305780633400288b1461045057600080fd5b806313137d65116102945780631b13bff3116102795780631b13bff3146103ea5780632d9773031461040a5780632f9454801461041d57600080fd5b806313137d65146103b357806317442b70146103c857600080fd5b80630711896e116102c55780630711896e1461033757806309ff18f01461036557806311532e771461039d57600080fd5b806301ffc9a7146102e1578063044ac38714610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612fc8565b61096a565b60405190151581526020015b60405180910390f35b61032961032436600461306c565b610a03565b60405190815260200161030d565b34801561034357600080fd5b50610357610352366004613228565b610bde565b60405161030d9291906133e0565b34801561037157600080fd5b50600054610385906001600160a01b031681565b6040516001600160a01b03909116815260200161030d565b3480156103a957600080fd5b5061032960015481565b6103c66103c136600461342e565b610da9565b005b3480156103d457600080fd5b506040805160018152600260208201520161030d565b3480156103f657600080fd5b506103c66104053660046134de565b610e96565b610329610418366004613517565b610f05565b61032961042b366004613578565b611045565b34801561043c57600080fd5b5061035761044b366004613578565b611183565b34801561045c57600080fd5b506103c661046b3660046135ef565b611268565b34801561047c57600080fd5b5061035761048b366004613619565b6112e7565b34801561049c57600080fd5b506103c66104ab3660046136e6565b6113ca565b3480156104bc57600080fd5b506103296104cb366004613517565b6114ea565b3480156104dc57600080fd5b506103c66104eb36600461371f565b6115c6565b6103c66104fe36600461371f565b611674565b34801561050f57600080fd5b5061032961176d565b34801561052457600080fd5b506103857f000000000000000000000000000000000000000000000000000000000000000081565b34801561055857600080fd5b506103c6610567366004613780565b61179c565b34801561057857600080fd5b5060035461058d9067ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030d565b3480156105b257600080fd5b506103c66105c13660046137f8565b611872565b3480156105d257600080fd5b506103c66118cf565b3480156105e757600080fd5b506106306105f6366004613834565b6004602090815260009283526040909220815180830184018051928152908401929093019190912091525460ff8082169161010090041682565b60408051921515835260ff90911660208301520161030d565b34801561065557600080fd5b5060035461058d90600160401b900467ffffffffffffffff1681565b34801561067d57600080fd5b5061058d61068c3660046135ef565b600092915050565b3480156106a057600080fd5b506103016106af366004613852565b6001600160a01b0381163014949350505050565b3480156106cf57600080fd5b506103c66106de3660046138b9565b6118e3565b3480156106ef57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610385565b34801561072c57600080fd5b5060025461058d9067ffffffffffffffff1681565b61032961074f3660046138f4565b61195b565b34801561076057600080fd5b506103c6611b08565b34801561077557600080fd5b506107b26040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161030d91906139aa565b3480156107cb57600080fd5b5060035461058d90600160801b900467ffffffffffffffff1681565b3480156107f357600080fd5b506103296108023660046139bd565b611b23565b34801561081357600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610385565b34801561084657600080fd5b5060025461038590600160401b90046001600160a01b031681565b34801561086d57600080fd5b5061032961087c366004613a3a565b63ffffffff1660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602052604090205490565b3480156108bf57600080fd5b506103c66108ce366004613a55565b611bfd565b3480156108df57600080fd5b506103c66108ee366004613a72565b611e0e565b3480156108ff57600080fd5b507fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a92005460ff16610301565b34801561093657600080fd5b506103c6610945366004613a72565b611ead565b34801561095657600080fd5b50610301610965366004613a8f565b611f01565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f85572ffb0000000000000000000000000000000000000000000000000000000014806109fd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b7fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920080546000919060ff1615610a6b5760405162461bcd60e51b8152602060048201526009602482015268131697d4105554d15160ba1b60448201526064015b60405180910390fd5b63ffffffff881660009081527fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920160205260409020547fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a92009060ff168015801590610ad7575060ff81168814155b15610b0257604051630608c54560e41b815260ff808316600483015289166024820152604401610a62565b6002546040516313e2d16d60e21b8152600091600160401b90046001600160a01b031690634f8b45b490610b409033908e908e908e90600401613ad4565b6000604051808303816000875af1158015610b5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b879190810190613b08565b9050610b968b82898934611f1f565b9450847f807c60b9fea886cff0b1e19b617c1dcec7abd65fc5f749bc0088ab90b161cb9982604051610bc891906139aa565b60405180910390a2505050509695505050505050565b6000610c1b6040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b6040518060a0016040528088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018790526040805183815291820181529092019190610ca3565b6040805180820190915260008082526020820152815260200190600190039081610c7c5790505b50815260200160006001600160a01b0316815260200186868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517f20487ded0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906320487ded90610d5b908b908590600401613b76565b602060405180830381865afa158015610d78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9c9190613b99565b9150965096945050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610e0d576040517f91ac5e4f000000000000000000000000000000000000000000000000000000008152336004820152602401610a62565b60208701803590610e2790610e22908a613a3a565b61201e565b14610e7e57610e396020880188613a3a565b6040517fc26bebcc00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260208801356024820152604401610a62565b610e8d8787878787878761209b565b50505050505050565b610e9e612148565b7fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a9200805460ff191682151590811782556040519081527f9d5bdd1bf7642eb0b282e29b5238683a20705993486eb9f3f03624dd22ef35c0906020015b60405180910390a15050565b7fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920080546000919060ff1615610f685760405162461bcd60e51b8152602060048201526009602482015268131697d4105554d15160ba1b6044820152606401610a62565b60025460405163515743fd60e11b81526dffffffffffffffffffffffffffff87166004820152600091600160401b90046001600160a01b03169063a2ae87fa906024016000604051808303816000875af1158015610fca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ff29190810190613b08565b90506110018782878734611f1f565b9250827f72e13b8c38191bb144d7db8a06b965d7ee0baff0951c98c27bb7d1efba85e3418260405161103391906139aa565b60405180910390a25050949350505050565b67ffffffffffffffff8616600090815260046020526040808220905161106e9088908890613bb2565b9081526040519081900360200190205460ff166110a457868686604051637a0fd12f60e11b8152600401610a6293929190613bc2565b60025460405163515743fd60e11b81526dffffffffffffffffffffffffffff86166004820152600091600160401b90046001600160a01b03169063a2ae87fa906024016000604051808303816000875af1158015611106573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261112e9190810190613b08565b905061113e8888888787866121bc565b9150817ffded04ddd0bd554dd80207f5cf62753799df9161f2d830a74804c9adc4b0c7418260405161117091906139aa565b60405180910390a2509695505050505050565b60006111c06040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b600254604051633f95de0760e11b81526dffffffffffffffffffffffffffff87166004820152600091600160401b90046001600160a01b031690637f2bbc0e90602401600060405180830381865afa158015611220573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112489190810190613b08565b9050611258898989888886610bde565b909a909950975050505050505050565b611270612148565b63ffffffff821660008181527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900602081815260409283902085905582519384528301849052815190927f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b92908290030190a1505050565b60006113246040518060a0016040528060608152602001606081526020016060815260200160006001600160a01b03168152602001606081525090565b60025460405163d017abed60e01b8152600091600160401b90046001600160a01b03169063d017abed90611362908c908c908c908c90600401613ad4565b600060405180830381865afa15801561137f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a79190810190613b08565b90506113b78c8c8c888886610bde565b909d909c509a5050505050505050505050565b60006113d46122f6565b805490915060ff600160401b820416159067ffffffffffffffff166000811580156113fc5750825b905060008267ffffffffffffffff1660011480156114195750303b155b905081158015611427575080155b1561145e576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561148d57845468ff00000000000000001916600160401b1785555b611497878761231f565b8315610e8d57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b600254604051633f95de0760e11b81526dffffffffffffffffffffffffffff851660048201526000918291600160401b9091046001600160a01b031690637f2bbc0e90602401600060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115759190810190613b08565b905060006115ba878387878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061233a915050565b51979650505050505050565b6115ce612148565b6115d78261241b565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790558051602082012060015560035467ffffffffffffffff166116209042613bfc565b6002805467ffffffffffffffff191667ffffffffffffffff929092169190911790556040517fcc54b42f78b332711d2d2b40bd7edb325a1fef0124753b0689728b7209ca1e2e90610ef99084908490613c1d565b61167c61245b565b6000546001600160a01b038381169116146116c3576040517f9ab1811500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001548151602083012014611704576040517fefac8be100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025467ffffffffffffffff168015806117275750428167ffffffffffffffff16115b1561175e576040517f260343ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117688383612512565b505050565b600061177761252d565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b6117a4612148565b604051806040016040528083151581526020018260ff16815250600460008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002085856040516117f5929190613bb2565b908152604051908190036020908101822083518154949092015160ff166101000261ff00199215159290921661ffff1990941693909317179091557fa36487e92bca51221cf341d7435763a17245d774855df7206cc354c3db192c1490611863908790879087908790613c3f565b60405180910390a15050505050565b61187a612148565b6118848383611268565b63ffffffff9290921660009081527fa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a920160205260409020805460ff191660ff9093169290921790915550565b6118d7612148565b6118e16000612576565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611947576040517fd7f73334000000000000000000000000000000000000000000000000000000008152336004820152602401610a62565b61195861195382613d23565b6125f4565b50565b67ffffffffffffffff88166000908152600460205260408082209051829190611987908b908b90613bb2565b9081526040805160209281900383018120818301909252905460ff8082161515808452610100909204169282019290925291506119dd57898989604051637a0fd12f60e11b8152600401610a6293929190613bc2565b602081015160ff16158015906119fa5750602081015160ff168614155b15611a2b576020810151604051630608c54560e41b815260ff91821660048201529087166024820152604401610a62565b6002546040516313e2d16d60e21b8152600091600160401b90046001600160a01b031690634f8b45b490611a699033908c908c908c90600401613ad4565b6000604051808303816000875af1158015611a88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ab09190810190613b08565b9050611ac08b8b8b8888866121bc565b9250827f33025ba6b00deb9d8b01d53d63796788e0e248ae9499e54610fe38bce2444e5882604051611af291906139aa565b60405180910390a2505098975050505050505050565b611b10612148565b6002805467ffffffffffffffff19169055565b60025460405163d017abed60e01b81526000918291600160401b9091046001600160a01b03169063d017abed90611b64908b908b908b908b90600401613ad4565b600060405180830381865afa158015611b81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ba99190810190613b08565b90506000611bee8a8387878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061233a915050565b519a9950505050505050505050565b611c05612148565b610e1067ffffffffffffffff82161015611c4b576040517fed75f3c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6202a30067ffffffffffffffff82161115611c92576040517f1bc4dde000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600354600160801b810467ffffffffffffffff90811691600160401b90048116908316148015611ccb575067ffffffffffffffff811615155b8015611ce05750428167ffffffffffffffff16105b15611d35576003805467ffffffffffffffff191667ffffffffffffffff84169081179091556040519081527f0ed594aee59a2d00c8a1183779743ed2c0f8e413f761a48b181a72cb86e1a05a90602001610ef9565b60035467ffffffffffffffff166000611d4e8242613bfc565b600380547fffffffffffffffff00000000000000000000000000000000ffffffffffffffff16600160401b67ffffffffffffffff8881169182027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1692909217600160801b8584169081029190911790935560408051928716835260208301919091528101919091529091507f8189ce093e30309b5e2dffeabdf7adf977853585d6b56995e8c8098342f6546f9060600160405180910390a150505b5050565b611e16612148565b6040517fca5eb5e10000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b158015611e9257600080fd5b505af1158015611ea6573d6000803e3d6000fd5b5050505050565b611eb5612148565b6001600160a01b038116611ef8576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610a62565b61195881612576565b600060208201803590611f189061087c9085613a3a565b1492915050565b600080611f63878787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061233a915050565b8051909150831015611fb75760405162461bcd60e51b815260206004820152601360248201527f4c5a5f494e53554646494349454e545f464545000000000000000000000000006044820152606401610a62565b6000612011888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604080518082019091528c81526020810191909152925033915061270d9050565b5198975050505050505050565b63ffffffff811660009081527f72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f9006020819052604082205480612094576040517ff6ff4fb700000000000000000000000000000000000000000000000000000000815263ffffffff85166004820152602401610a62565b9392505050565b60025460405163f6ec1c4d60e01b8152600160401b9091046001600160a01b03169063f6ec1c4d906120d39088908890600401613dd0565b600060405180830381600087803b1580156120ed57600080fd5b505af1158015612101573d6000803e3d6000fd5b50505050857fcb469615696db7ded9e04049076cc20ba6156f4aea9a21ad1db7a94ddf8ff3a08686604051612137929190613dd0565b60405180910390a250505050505050565b3361217a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146118e1576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610a62565b60008060006121cf898989898989610bde565b9150915081341015612216576040517fa458261b00000000000000000000000000000000000000000000000000000000815260048101839052346024820152604401610a62565b6040517f96f4e9f90000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906396f4e9f990849061227f908d908690600401613b76565b60206040518083038185885af115801561229d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122c29190613b99565b925060006122d08334613de4565b11156122ea576122ea6122e38334613de4565b3390612818565b50509695505050505050565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006109fd565b6123276128c7565b61233081612905565b611e0a8282612926565b60408051808201909152600080825260208201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff16815260200161239d8961201e565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016123d2929190613df7565b6040805180830381865afa1580156123ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124129190613ea0565b95945050505050565b6001600160a01b038116611958576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806124f457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166124e87f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b156118e15760405163703e46dd60e11b815260040160405180910390fd5b61251a61245b565b61252382612979565b611e0a8282612981565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118e15760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60208082015160408084015167ffffffffffffffff831660009081526004909452928190209051919291612629908390613ebc565b9081526040519081900360200190205460ff1661265d578181604051637a0fd12f60e11b8152600401610a62929190613ed8565b600254606084015160405163f6ec1c4d60e01b8152600160401b9092046001600160a01b03169163f6ec1c4d91612696916004016139aa565b600060405180830381600087803b1580156126b057600080fd5b505af11580156126c4573d6000803e3d6000fd5b5050505082600001517fa76e8bfca7bc12668a76418f51e4b6a884e03734335e3ad93d4d6355af649770846060015160405161270091906139aa565b60405180910390a2505050565b612715612f80565b60006127248460000151612a69565b60208501519091501561273e5761273e8460200151612aaa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff16815260200161278e8c61201e565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b81526004016127ca929190613df7565b60806040518083038185885af11580156127e8573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061280d9190613efb565b979650505050505050565b8047101561285b576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610a62565b600080836001600160a01b03168360405160006040518083038185875af1925050503d80600081146128a9576040519150601f19603f3d011682016040523d82523d6000602084013e6128ae565b606091505b5091509150816128c1576128c181612ba5565b50505050565b6128cf612be6565b6118e1576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61290d6128c7565b61291681612c00565b61291e612c11565b611958612c11565b61292e6128c7565b61293781612c19565b50600280546001600160a01b03909216600160401b027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055565b611958612148565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129db575060408051601f3d908101601f191682019092526129d891810190613b99565b60015b612a0357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610a62565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612a5f576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610a62565b6117688383612c2a565b6000813414612aa6576040517f9f704120000000000000000000000000000000000000000000000000000000008152346004820152602401610a62565b5090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2e9190613f63565b90506001600160a01b038116612b70576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e0a6001600160a01b038216337f000000000000000000000000000000000000000000000000000000000000000085612c80565b805115612bb457805160208201fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bf06122f6565b54600160401b900460ff16919050565b612c086128c7565b61195881612d08565b6118e16128c7565b612c216128c7565b61195881612d50565b612c3382612d58565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115612c78576117688282612ddc565b611e0a612e49565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526128c1908590612e81565b612d106128c7565b6001600160a01b038116611e16576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb56128c7565b806001600160a01b03163b600003612d8e57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610a62565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051612df99190613ebc565b600060405180830381855af49150503d8060008114612e34576040519150601f19603f3d011682016040523d82523d6000602084013e612e39565b606091505b5091509150612412858383612f0b565b34156118e1576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080602060008451602086016000885af180612ea4576040513d6000823e3d81fd5b50506000513d91508115612ebc578060011415612ec9565b6001600160a01b0384163b155b156128c1576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a62565b606082612f2057612f1b82612ba5565b612094565b8151158015612f3757506001600160a01b0384163b155b15612f79576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610a62565b5092915050565b604051806060016040528060008019168152602001600067ffffffffffffffff168152602001612fc3604051806040016040528060008152602001600081525090565b905290565b600060208284031215612fda57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461209457600080fd5b803563ffffffff8116811461301e57600080fd5b919050565b60008083601f84011261303557600080fd5b50813567ffffffffffffffff81111561304d57600080fd5b60208301915083602082850101111561306557600080fd5b9250929050565b6000806000806000806080878903121561308557600080fd5b61308e8761300a565b9550602087013567ffffffffffffffff808211156130ab57600080fd5b6130b78a838b01613023565b90975095506040890135945060608901359150808211156130d757600080fd5b506130e489828a01613023565b979a9699509497509295939492505050565b67ffffffffffffffff8116811461195857600080fd5b803561301e816130f6565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561315057613150613117565b60405290565b60405160a0810167ffffffffffffffff8111828210171561315057613150613117565b604051601f8201601f1916810167ffffffffffffffff811182821017156131a2576131a2613117565b604052919050565b600067ffffffffffffffff8211156131c4576131c4613117565b50601f01601f191660200190565b600082601f8301126131e357600080fd5b81356131f66131f1826131aa565b613179565b81815284602083860101111561320b57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806080878903121561324157600080fd5b863561324c816130f6565b9550602087013567ffffffffffffffff8082111561326957600080fd5b6132758a838b01613023565b9097509550604089013591508082111561328e57600080fd5b61329a8a838b01613023565b909550935060608901359150808211156132b357600080fd5b506132c089828a016131d2565b9150509295509295509295565b60005b838110156132e85781810151838201526020016132d0565b50506000910152565b600081518084526133098160208601602086016132cd565b601f01601f19169290920160200192915050565b6000815160a0845261333260a08501826132f1565b90506020808401518583038287015261334b83826132f1565b60408681015188830389830152805180845290850195509092506000918401905b8083101561339e57855180516001600160a01b031683528501518583015294840194600192909201919083019061336c565b50606087015194506133bb60608901866001600160a01b03169052565b6080870151945087810360808901526133d481866132f1565b98975050505050505050565b8281526040602082015260006133f9604083018461331d565b949350505050565b60006060828403121561341357600080fd5b50919050565b6001600160a01b038116811461195857600080fd5b600080600080600080600060e0888a03121561344957600080fd5b6134538989613401565b965060608801359550608088013567ffffffffffffffff8082111561347757600080fd5b6134838b838c01613023565b909750955060a08a0135915061349882613419565b90935060c089013590808211156134ae57600080fd5b506134bb8a828b01613023565b989b979a50959850939692959293505050565b8035801515811461301e57600080fd5b6000602082840312156134f057600080fd5b612094826134ce565b80356dffffffffffffffffffffffffffff8116811461301e57600080fd5b6000806000806060858703121561352d57600080fd5b6135368561300a565b9350613544602086016134f9565b9250604085013567ffffffffffffffff81111561356057600080fd5b61356c87828801613023565b95989497509550505050565b6000806000806000806080878903121561359157600080fd5b863561359c816130f6565b9550602087013567ffffffffffffffff808211156135b957600080fd5b6135c58a838b01613023565b90975095508591506135d960408a016134f9565b945060608901359150808211156130d757600080fd5b6000806040838503121561360257600080fd5b61360b8361300a565b946020939093013593505050565b600080600080600080600080600060c08a8c03121561363757600080fd5b8935613642816130f6565b985060208a013567ffffffffffffffff8082111561365f57600080fd5b61366b8d838e01613023565b909a50985060408c0135915061368082613419565b90965060608b0135908082111561369657600080fd5b6136a28d838e01613023565b909750955060808c0135945060a08c01359150808211156136c257600080fd5b506136cf8c828d01613023565b915080935050809150509295985092959850929598565b600080604083850312156136f957600080fd5b823561370481613419565b9150602083013561371481613419565b809150509250929050565b6000806040838503121561373257600080fd5b823561373d81613419565b9150602083013567ffffffffffffffff81111561375957600080fd5b613765858286016131d2565b9150509250929050565b803560ff8116811461301e57600080fd5b60008060008060006080868803121561379857600080fd5b85356137a3816130f6565b9450602086013567ffffffffffffffff8111156137bf57600080fd5b6137cb88828901613023565b90955093506137de9050604087016134ce565b91506137ec6060870161376f565b90509295509295909350565b60008060006060848603121561380d57600080fd5b6138168461300a565b92506020840135915061382b6040850161376f565b90509250925092565b6000806040838503121561384757600080fd5b823561373d816130f6565b60008060008060a0858703121561386857600080fd5b6138728686613401565b9350606085013567ffffffffffffffff81111561388e57600080fd5b61389a87828801613023565b90945092505060808501356138ae81613419565b939692955090935050565b6000602082840312156138cb57600080fd5b813567ffffffffffffffff8111156138e257600080fd5b820160a0818503121561209457600080fd5b60008060008060008060008060a0898b03121561391057600080fd5b883561391b816130f6565b9750602089013567ffffffffffffffff8082111561393857600080fd5b6139448c838d01613023565b909950975060408b013591508082111561395d57600080fd5b6139698c838d01613023565b909750955060608b0135945060808b013591508082111561398957600080fd5b506139968b828c01613023565b999c989b5096995094979396929594505050565b60208152600061209460208301846132f1565b600080600080600080600060a0888a0312156139d857600080fd5b6139e18861300a565b965060208801356139f181613419565b9550604088013567ffffffffffffffff80821115613a0e57600080fd5b613a1a8b838c01613023565b909750955060608a0135945060808a01359150808211156134ae57600080fd5b600060208284031215613a4c57600080fd5b6120948261300a565b600060208284031215613a6757600080fd5b8135612094816130f6565b600060208284031215613a8457600080fd5b813561209481613419565b600060608284031215613aa157600080fd5b6120948383613401565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0385168152606060208201526000613af7606083018587613aab565b905082604083015295945050505050565b600060208284031215613b1a57600080fd5b815167ffffffffffffffff811115613b3157600080fd5b8201601f81018413613b4257600080fd5b8051613b506131f1826131aa565b818152856020838501011115613b6557600080fd5b6124128260208301602086016132cd565b67ffffffffffffffff831681526040602082015260006133f9604083018461331d565b600060208284031215613bab57600080fd5b5051919050565b8183823760009101908152919050565b67ffffffffffffffff84168152604060208201526000612412604083018486613aab565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115612f7957612f79613be6565b6001600160a01b03831681526040602082015260006133f960408301846132f1565b67ffffffffffffffff85168152606060208201526000613c63606083018587613aab565b9050821515604083015295945050505050565b600082601f830112613c8757600080fd5b8135602067ffffffffffffffff821115613ca357613ca3613117565b613cb1818360051b01613179565b82815260069290921b84018101918181019086841115613cd057600080fd5b8286015b84811015613d185760408189031215613ced5760008081fd5b613cf561312d565b8135613d0081613419565b81528185013585820152835291830191604001613cd4565b509695505050505050565b600060a08236031215613d3557600080fd5b613d3d613156565b82358152613d4d6020840161310c565b6020820152604083013567ffffffffffffffff80821115613d6d57600080fd5b613d79368387016131d2565b60408401526060850135915080821115613d9257600080fd5b613d9e368387016131d2565b60608401526080850135915080821115613db757600080fd5b50613dc436828601613c76565b60808301525092915050565b6020815260006133f9602083018486613aab565b818103818111156109fd576109fd613be6565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a06080840152613e2d60e08401826132f1565b90506060850151603f198483030160a0850152613e4a82826132f1565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b600060408284031215613e8257600080fd5b613e8a61312d565b9050815181526020820151602082015292915050565b600060408284031215613eb257600080fd5b6120948383613e70565b60008251613ece8184602087016132cd565b9190910192915050565b67ffffffffffffffff831681526040602082015260006133f960408301846132f1565b600060808284031215613f0d57600080fd5b6040516060810181811067ffffffffffffffff82111715613f3057613f30613117565b604052825181526020830151613f45816130f6565b6020820152613f578460408501613e70565b60408201529392505050565b600060208284031215613f7557600080fd5b81516120948161341956fea2646970667358221220eb725e65f501c41757962d62f771b3764ac19e3bd39c1f2a2e348f5534778ec764736f6c6343000818003300000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d0000000000000000000000001a44076050125825900e736c501f859c50fe728c","name":"MTokenMessenger","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"contracts/interfaces/ICCClient.sol","source_code":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.24;\n\ninterface ICCClient {\n    function ccReceive(bytes calldata message) external;\n\n    function msgOfCcSendToken(\n        address sender,\n        bytes calldata receiver,\n        uint256 value\n    ) external view returns (bytes memory message);\n\n    function ccSendToken(\n        address sender,\n        bytes calldata receiver,\n        uint256 value\n    ) external returns (bytes memory message);\n\n    function msgOfCcSendMintBudget(\n        uint112 value\n    ) external view returns (bytes memory message);\n\n    function ccSendMintBudget(\n        uint112 value\n    ) external returns (bytes memory message);\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC1967.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1967.sol)\n\npragma solidity >=0.4.11;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n"},{"file_path":"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.22;\n\nimport {IERC1822Proxiable} from \"../../interfaces/draft-IERC1822.sol\";\nimport {ERC1967Utils} from \"../ERC1967/ERC1967Utils.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n */\nabstract contract UUPSUpgradeable is IERC1822Proxiable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address private immutable __self = address(this);\n\n    /**\n     * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\n     * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\n     * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\n     * If the getter returns `\"5.0.0\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\n     * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n     * during an upgrade.\n     */\n    string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n    /**\n     * @dev The call is from an unauthorized context.\n     */\n    error UUPSUnauthorizedCallContext();\n\n    /**\n     * @dev The storage `slot` is unsupported as a UUID.\n     */\n    error UUPSUnsupportedProxiableUUID(bytes32 slot);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        _checkProxy();\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        _checkNotDelegated();\n        _;\n    }\n\n    /**\n     * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual notDelegated returns (bytes32) {\n        return ERC1967Utils.IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data);\n    }\n\n    /**\n     * @dev Reverts if the execution is not performed via delegatecall or the execution\n     * context is not of a proxy with an ERC-1967 compliant implementation pointing to self.\n     */\n    function _checkProxy() internal view virtual {\n        if (\n            address(this) == __self || // Must be called through delegatecall\n            ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\n        ) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Reverts if the execution is performed via delegatecall.\n     * See {notDelegated}.\n     */\n    function _checkNotDelegated() internal view virtual {\n        if (address(this) != __self) {\n            // Must not be called through delegatecall\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\n     *\n     * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\n     * is expected to be the implementation slot in ERC-1967.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\n        try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n            if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\n                revert UUPSUnsupportedProxiableUUID(slot);\n            }\n            ERC1967Utils.upgradeToAndCall(newImplementation, data);\n        } catch {\n            // The implementation is not UUPS\n            revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)\n\npragma solidity >=0.4.16;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},{"file_path":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.21;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev The `implementation` of the proxy is invalid.\n     */\n    error ERC1967InvalidImplementation(address implementation);\n\n    /**\n     * @dev The `admin` of the proxy is invalid.\n     */\n    error ERC1967InvalidAdmin(address admin);\n\n    /**\n     * @dev The `beacon` of the proxy is invalid.\n     */\n    error ERC1967InvalidBeacon(address beacon);\n\n    /**\n     * @dev An upgrade function sees `msg.value > 0` that may be lost.\n     */\n    error ERC1967NonPayable();\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        if (newImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(newImplementation);\n        }\n        StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n        _setImplementation(newImplementation);\n        emit IERC1967.Upgraded(newImplementation);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(newImplementation, data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     *\n     * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n     * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n     */\n    function getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        if (newAdmin == address(0)) {\n            revert ERC1967InvalidAdmin(address(0));\n        }\n        StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {IERC1967-AdminChanged} event.\n     */\n    function changeAdmin(address newAdmin) internal {\n        emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the ERC-1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        if (newBeacon.code.length == 0) {\n            revert ERC1967InvalidBeacon(newBeacon);\n        }\n\n        StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n        address beaconImplementation = IBeacon(newBeacon).implementation();\n        if (beaconImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(beaconImplementation);\n        }\n    }\n\n    /**\n     * @dev Change the beacon and trigger a setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-BeaconUpgraded} event.\n     *\n     * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n     * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n     * efficiency.\n     */\n    function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n        _setBeacon(newBeacon);\n        emit IERC1967.BeaconUpgraded(newBeacon);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n     * if an upgrade doesn't perform an initialization call.\n     */\n    function _checkNonPayable() private {\n        if (msg.value > 0) {\n            revert ERC1967NonPayable();\n        }\n    }\n}\n"},{"file_path":"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\nstruct SetConfigParam {\n    uint32 eid;\n    uint32 configType;\n    bytes config;\n}\n\ninterface IMessageLibManager {\n    struct Timeout {\n        address lib;\n        uint256 expiry;\n    }\n\n    event LibraryRegistered(address newLib);\n    event DefaultSendLibrarySet(uint32 eid, address newLib);\n    event DefaultReceiveLibrarySet(uint32 eid, address newLib);\n    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);\n    event SendLibrarySet(address sender, uint32 eid, address newLib);\n    event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);\n    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);\n\n    function registerLibrary(address _lib) external;\n\n    function isRegisteredLibrary(address _lib) external view returns (bool);\n\n    function getRegisteredLibraries() external view returns (address[] memory);\n\n    function setDefaultSendLibrary(uint32 _eid, address _newLib) external;\n\n    function defaultSendLibrary(uint32 _eid) external view returns (address);\n\n    function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _gracePeriod) external;\n\n    function defaultReceiveLibrary(uint32 _eid) external view returns (address);\n\n    function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;\n\n    function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);\n\n    function isSupportedEid(uint32 _eid) external view returns (bool);\n\n    function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);\n\n    /// ------------------- OApp interfaces -------------------\n    function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;\n\n    function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);\n\n    function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);\n\n    function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;\n\n    function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);\n\n    function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _expiry) external;\n\n    function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);\n\n    function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;\n\n    function getConfig(\n        address _oapp,\n        address _lib,\n        uint32 _eid,\n        uint32 _configType\n    ) external view returns (bytes memory config);\n}\n"},{"file_path":"contracts/MTokenMessengerLZ.sol","source_code":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.24;\n\nimport {Ownable} from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport {OAppUpgradeable, Origin, MessagingFee} from \"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppUpgradeable.sol\";\nimport {MessagingReceipt} from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\nimport {MTokenMessengerBaseUpgradeable} from \"./MTokenMessengerBaseUpgradeable.sol\";\nimport {ICCClient} from \"./interfaces/ICCClient.sol\";\n\n/// @custom:oz-upgrades-unsafe-allow constructor\n/// @custom:oz-upgrades-unsafe-allow state-variable-immutable\ncontract MTokenMessengerLZ is MTokenMessengerBaseUpgradeable, OAppUpgradeable {\n    struct MsgLzStorage {\n        bool lzPaused;\n        mapping(uint64 eid => uint8 addrLen) eidToAddrLen;\n    }\n\n    // namespace=\"mtokenmessengerlz.storage.eidtoaddrlen\"\n    // keccak256(abi.encode(uint256(keccak256(abi.encodePacked(namespace))) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant MSGLZ_STORAGE_LOCATION =\n        0xa7de46fd53e49d8e70fc58b68ffbf0484ff2aefa7464a0e32d9992ae843a9200;\n\n    function _getMsgLzStorage() internal pure returns (MsgLzStorage storage $) {\n        assembly {\n            $.slot := MSGLZ_STORAGE_LOCATION\n        }\n    }\n\n    event CCReceiveLZ(bytes32 indexed messageID, bytes messageData);\n    event CCSendTokenLZ(bytes32 indexed messageID, bytes messageData);\n    event CCSendMintBudgetLZ(bytes32 indexed messageID, bytes messageData);\n    event LZPaused(bool isPaused);\n\n    error InvalidRecipientLength(uint8 expected, uint8 actual);\n\n    modifier onlyLZNotPaused() {\n        MsgLzStorage storage $ = _getMsgLzStorage();\n        require(!$.lzPaused, \"LZ_PAUSED\");\n        _;\n    }\n\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(address _endpoint) OAppUpgradeable(_endpoint) {}\n\n    /// @custom:oz-upgrades-unsafe-allow missing-initializer-call\n    function initialize(\n        address _ccClient,\n        address _initialOwner\n    ) public initializer {\n        __MTokenMessengerLZ_init(_ccClient, _initialOwner);\n    }\n\n    /// @custom:oz-upgrades-unsafe-allow missing-initializer-call\n    function __MTokenMessengerLZ_init(\n        address _ccClient,\n        address _initialOwner\n    ) internal onlyInitializing {\n        __OApp_init(_initialOwner);\n        __MTokenMessengerBase_init(_ccClient, _initialOwner);\n    }\n\n    function lzPaused() public view returns (bool) {\n        MsgLzStorage storage $ = _getMsgLzStorage();\n        return $.lzPaused;\n    }\n\n    function setLZPaused(bool isPaused) public onlyOwner {\n        MsgLzStorage storage $ = _getMsgLzStorage();\n        $.lzPaused = isPaused;\n        emit LZPaused(isPaused);\n    }\n\n    // to differentiate from setAllowedPeer in MTokenMessenger\n    function lzSetPeer(\n        uint32 _eid,\n        bytes32 _peer,\n        uint8 _addrLen\n    ) public onlyOwner {\n        setPeer(_eid, _peer);\n        MsgLzStorage storage $ = _getMsgLzStorage();\n        $.eidToAddrLen[_eid] = _addrLen;\n    }\n\n    // lz OApp receive implementation\n    function _lzReceive(\n        Origin calldata, // _origin\n        bytes32 _guid,\n        bytes calldata payload,\n        address, // Executor address as specified by the OApp.\n        bytes calldata // Any extra data or options to trigger on receipt.\n    ) internal override {\n        // src sender check already made in OApp.\n        ICCClient(ccClient).ccReceive(payload);\n        emit CCReceiveLZ(_guid, payload);\n    }\n\n    function lzSendTokenToChain(\n        uint32 _dstEid,\n        bytes calldata recipient,\n        uint256 value,\n        bytes calldata _options\n    ) external payable onlyLZNotPaused returns (bytes32 messageId) {\n        MsgLzStorage storage $ = _getMsgLzStorage();\n        uint8 dstAddrLen = $.eidToAddrLen[_dstEid];\n        if (dstAddrLen != 0 && recipient.length != dstAddrLen) {\n            revert InvalidRecipientLength(dstAddrLen, uint8(recipient.length));\n        }\n\n        bytes memory _data = ICCClient(ccClient).ccSendToken(\n            msg.sender,\n            recipient,\n            value\n        );\n        messageId = sendThroughLZ(_dstEid, _data, _options, msg.value);\n        emit CCSendTokenLZ(messageId, _data);\n    }\n\n    function lzSendMintBudgetToChain(\n        uint32 _dstEid,\n        uint112 value,\n        bytes calldata _options\n    ) external payable onlyLZNotPaused returns (bytes32 messageId) {\n        bytes memory _data = ICCClient(ccClient).ccSendMintBudget(value);\n        messageId = sendThroughLZ(_dstEid, _data, _options, msg.value);\n        emit CCSendMintBudgetLZ(messageId, _data);\n    }\n\n    // lz OApp send implementation\n    function sendThroughLZ(\n        uint32 _dstEid,\n        bytes memory _payload,\n        bytes calldata _options,\n        uint256 msgValue\n    ) internal returns (bytes32 guid) {\n        MessagingFee memory fee = _quote(_dstEid, _payload, _options, false);\n        require(msgValue >= fee.nativeFee, \"LZ_INSUFFICIENT_FEE\");\n        MessagingReceipt memory receipt = _lzSend(\n            _dstEid,\n            _payload,\n            _options,\n            MessagingFee(msgValue, 0), // Fee in native gas and ZRO token.\n            payable(msg.sender) // Refund address in case of failed source message.\n        );\n        return receipt.guid;\n    }\n\n    // --------------- query functions -----------------\n\n    function lzCalculateSendTokenFee(\n        uint32 _dstEid, // Destination chain's endpoint ID.\n        address sender,\n        bytes calldata recipient,\n        uint256 value,\n        bytes calldata _options // Message execution options\n    ) public view returns (uint256 nativeFee) {\n        bytes memory _data = ICCClient(ccClient).msgOfCcSendToken(\n            sender,\n            recipient,\n            value\n        );\n        MessagingFee memory fee = _quote(_dstEid, _data, _options, false);\n        return fee.nativeFee;\n    }\n\n    function lzCalculateSendMintBudgetFee(\n        uint32 _dstEid, // Destination chain's endpoint ID.\n        uint112 value,\n        bytes calldata _options\n    ) public view returns (uint256 nativeFee) {\n        bytes memory _data = ICCClient(ccClient).msgOfCcSendMintBudget(value);\n        MessagingFee memory fee = _quote(_dstEid, _data, _options, false);\n        return fee.nativeFee;\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Address.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert Errors.InsufficientBalance(address(this).balance, amount);\n        }\n\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            _revert(returndata);\n        }\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {Errors.FailedCall} error.\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert Errors.InsufficientBalance(address(this).balance, value);\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n     * of an unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {Errors.FailedCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n     */\n    function _revert(bytes memory returndata) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            assembly (\"memory-safe\") {\n                revert(add(returndata, 0x20), mload(returndata))\n            }\n        } else {\n            revert Errors.FailedCall();\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},{"file_path":"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppReceiver.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { ILayerZeroReceiver, Origin } from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol\";\n\ninterface IOAppReceiver is ILayerZeroReceiver {\n    /**\n     * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.\n     * @param _origin The origin information containing the source endpoint and sender address.\n     *  - srcEid: The source chain endpoint ID.\n     *  - sender: The sender address on the src chain.\n     *  - nonce: The nonce of the message.\n     * @param _message The lzReceive payload.\n     * @param _sender The sender address.\n     * @return isSender Is a valid sender.\n     *\n     * @dev Applications can optionally choose to implement a separate composeMsg sender that is NOT the bridging layer.\n     * @dev The default sender IS the OAppReceiver implementer.\n     */\n    function isComposeMsgSender(\n        Origin calldata _origin,\n        bytes calldata _message,\n        address _sender\n    ) external view returns (bool isSender);\n}\n"},{"file_path":"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppReceiverUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { IOAppReceiver, Origin } from \"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppReceiver.sol\";\nimport { OAppCoreUpgradeable } from \"./OAppCoreUpgradeable.sol\";\n\n/**\n * @title OAppReceiver\n * @dev Abstract contract implementing the ILayerZeroReceiver interface and extending OAppCore for OApp receivers.\n */\nabstract contract OAppReceiverUpgradeable is IOAppReceiver, OAppCoreUpgradeable {\n    // Custom error message for when the caller is not the registered endpoint/\n    error OnlyEndpoint(address addr);\n\n    // @dev The version of the OAppReceiver implementation.\n    // @dev Version is bumped when changes are made to this contract.\n    uint64 internal constant RECEIVER_VERSION = 2;\n\n    /**\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\n     * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to\n     * accommodate the different version of Ownable.\n     */\n    function __OAppReceiver_init(address _delegate) internal onlyInitializing {\n        __OAppCore_init(_delegate);\n    }\n\n    function __OAppReceiver_init_unchained() internal onlyInitializing {}\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol contract.\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\n     *\n     * @dev Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented.\n     * ie. this is a RECEIVE only OApp.\n     * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.\n     */\n    function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {\n        return (0, RECEIVER_VERSION);\n    }\n\n    /**\n     * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.\n     * @dev _origin The origin information containing the source endpoint and sender address.\n     *  - srcEid: The source chain endpoint ID.\n     *  - sender: The sender address on the src chain.\n     *  - nonce: The nonce of the message.\n     * @dev _message The lzReceive payload.\n     * @param _sender The sender address.\n     * @return isSender Is a valid sender.\n     *\n     * @dev Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.\n     * @dev The default sender IS the OAppReceiver implementer.\n     */\n    function isComposeMsgSender(\n        Origin calldata /*_origin*/,\n        bytes calldata /*_message*/,\n        address _sender\n    ) public view virtual returns (bool) {\n        return _sender == address(this);\n    }\n\n    /**\n     * @notice Checks if the path initialization is allowed based on the provided origin.\n     * @param origin The origin information containing the source endpoint and sender address.\n     * @return Whether the path has been initialized.\n     *\n     * @dev This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.\n     * @dev This defaults to assuming if a peer has been set, its initialized.\n     * Can be overridden by the OApp if there is other logic to determine this.\n     */\n    function allowInitializePath(Origin calldata origin) public view virtual returns (bool) {\n        return peers(origin.srcEid) == origin.sender;\n    }\n\n    /**\n     * @notice Retrieves the next nonce for a given source endpoint and sender address.\n     * @dev _srcEid The source endpoint ID.\n     * @dev _sender The sender address.\n     * @return nonce The next nonce.\n     *\n     * @dev The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.\n     * @dev Is required by the off-chain executor to determine the OApp expects msg execution is ordered.\n     * @dev This is also enforced by the OApp.\n     * @dev By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.\n     */\n    function nextNonce(uint32, /*_srcEid*/ bytes32 /*_sender*/) public view virtual returns (uint64 nonce) {\n        return 0;\n    }\n\n    /**\n     * @dev Entry point for receiving messages or packets from the endpoint.\n     * @param _origin The origin information containing the source endpoint and sender address.\n     *  - srcEid: The source chain endpoint ID.\n     *  - sender: The sender address on the src chain.\n     *  - nonce: The nonce of the message.\n     * @param _guid The unique identifier for the received LayerZero message.\n     * @param _message The payload of the received message.\n     * @param _executor The address of the executor for the received message.\n     * @param _extraData Additional arbitrary data provided by the corresponding executor.\n     *\n     * @dev Entry point for receiving msg/packet from the LayerZero endpoint.\n     */\n    function lzReceive(\n        Origin calldata _origin,\n        bytes32 _guid,\n        bytes calldata _message,\n        address _executor,\n        bytes calldata _extraData\n    ) public payable virtual {\n        // Ensures that only the endpoint can attempt to lzReceive() messages to this OApp.\n        if (address(endpoint) != msg.sender) revert OnlyEndpoint(msg.sender);\n\n        // Ensure that the sender matches the expected peer for the source endpoint.\n        if (_getPeerOrRevert(_origin.srcEid) != _origin.sender) revert OnlyPeer(_origin.srcEid, _origin.sender);\n\n        // Call the internal OApp implementation of lzReceive.\n        _lzReceive(_origin, _guid, _message, _executor, _extraData);\n    }\n\n    /**\n     * @dev Internal function to implement lzReceive logic without needing to copy the basic parameter validation.\n     */\n    function _lzReceive(\n        Origin calldata _origin,\n        bytes32 _guid,\n        bytes calldata _message,\n        address _executor,\n        bytes calldata _extraData\n    ) internal virtual;\n}\n"},{"file_path":"contracts/MTokenMessengerBaseUpgradeable.sol","source_code":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.24;\n\nimport {DelayedUpgradeable} from \"./DelayedUpgradeable.sol\";\n\nabstract contract MTokenMessengerBaseUpgradeable is DelayedUpgradeable {\n    uint64 constant MIN_DELAY = 1 hours;\n    uint64 constant MAX_DELAY = 48 hours;\n\n    address public ccClient;\n\n    uint64 public delay;\n    uint64 public nextDelay;\n    uint64 public etNextDelay; // effective time\n\n    event SetDelayRequest(uint64 oldDelay, uint64 newDelay, uint64 et);\n    event SetDelayEffected(uint64 newDelay);\n    error DelayTooSmall();\n    error DelayTooLarge();\n\n    function __MTokenMessengerBase_init(\n        address _ccClient,\n        address _initialOwner\n    ) internal onlyInitializing {\n        __Ownable_init(_initialOwner);\n        ccClient = _ccClient;\n    }\n\n    function getDelay() internal view override returns (uint64) {\n        return delay;\n    }\n\n    function setDelay(uint64 _delay) public onlyOwner {\n        if (_delay < MIN_DELAY) {\n            revert DelayTooSmall();\n        }\n        if (_delay > MAX_DELAY) {\n            revert DelayTooLarge();\n        }\n\n        uint64 et = etNextDelay;\n        if (_delay == nextDelay && et != 0 && et < block.timestamp) {\n            delay = _delay;\n            emit SetDelayEffected(_delay);\n        } else {\n            uint64 _currDelay = delay;\n            uint64 _etNextDelay = uint64(block.timestamp) + _currDelay;\n            nextDelay = _delay;\n            etNextDelay = _etNextDelay;\n            emit SetDelayRequest(_currDelay, _delay, _etNextDelay);\n        }\n    }\n\n    function revokeNextUpgrade() public onlyOwner {\n        // note: missing event to be added in future update\n        etNextUpgradeToAndCall = 0;\n    }\n}\n"},{"file_path":"@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// End consumer library.\nlibrary Client {\n  /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers.\n  struct EVMTokenAmount {\n    address token; // token address on the local chain.\n    uint256 amount; // Amount of tokens.\n  }\n\n  struct Any2EVMMessage {\n    bytes32 messageId; // MessageId corresponding to ccipSend on source.\n    uint64 sourceChainSelector; // Source chain selector.\n    bytes sender; // abi.decode(sender) if coming from an EVM chain.\n    bytes data; // payload sent in original message.\n    EVMTokenAmount[] destTokenAmounts; // Tokens and their amounts in their destination chain representation.\n  }\n\n  // If extraArgs is empty bytes, the default is 200k gas limit.\n  struct EVM2AnyMessage {\n    bytes receiver; // abi.encode(receiver address) for dest EVM chains\n    bytes data; // Data payload\n    EVMTokenAmount[] tokenAmounts; // Token transfers\n    address feeToken; // Address of feeToken. address(0) means you will send msg.value.\n    bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV1)\n  }\n\n  // bytes4(keccak256(\"CCIP EVMExtraArgsV1\"));\n  bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;\n  struct EVMExtraArgsV1 {\n    uint256 gasLimit;\n  }\n\n  function _argsToBytes(EVMExtraArgsV1 memory extraArgs) internal pure returns (bytes memory bts) {\n    return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);\n  }\n}\n"},{"file_path":"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingComposer.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingComposer {\n    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);\n    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);\n    event LzComposeAlert(\n        address indexed from,\n        address indexed to,\n        address indexed executor,\n        bytes32 guid,\n        uint16 index,\n        uint256 gas,\n        uint256 value,\n        bytes message,\n        bytes extraData,\n        bytes reason\n    );\n\n    function composeQueue(\n        address _from,\n        address _to,\n        bytes32 _guid,\n        uint16 _index\n    ) external view returns (bytes32 messageHash);\n\n    function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;\n\n    function lzCompose(\n        address _from,\n        address _to,\n        bytes32 _guid,\n        uint16 _index,\n        bytes calldata _message,\n        bytes calldata _extraData\n    ) external payable;\n}\n"},{"file_path":"@openzeppelin/contracts/proxy/beacon/IBeacon.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {UpgradeableBeacon} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},{"file_path":"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingContext.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingContext {\n    function isSendingMessage() external view returns (bool);\n\n    function getSendContext() external view returns (uint32 dstEid, address sender);\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},{"file_path":"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppCoreUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { IOAppCore, ILayerZeroEndpointV2 } from \"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol\";\n\n/**\n * @title OAppCore\n * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.\n */\nabstract contract OAppCoreUpgradeable is IOAppCore, OwnableUpgradeable {\n    struct OAppCoreStorage {\n        mapping(uint32 => bytes32) peers;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"layerzerov2.storage.oappcore\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant OAPP_CORE_STORAGE_LOCATION =\n        0x72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900;\n\n    function _getOAppCoreStorage() internal pure returns (OAppCoreStorage storage $) {\n        assembly {\n            $.slot := OAPP_CORE_STORAGE_LOCATION\n        }\n    }\n\n    // The LayerZero endpoint associated with the given OApp\n    ILayerZeroEndpointV2 public immutable endpoint;\n\n    /**\n     * @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.\n     * @param _endpoint The address of the LOCAL Layer Zero endpoint.\n     */\n    constructor(address _endpoint) {\n        endpoint = ILayerZeroEndpointV2(_endpoint);\n    }\n\n    /**\n     * @dev Initializes the OAppCore with the provided delegate.\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\n     *\n     * @dev The delegate typically should be set as the owner of the contract.\n     * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to\n     * accommodate the different version of Ownable.\n     */\n    function __OAppCore_init(address _delegate) internal onlyInitializing {\n        __OAppCore_init_unchained(_delegate);\n    }\n\n    function __OAppCore_init_unchained(address _delegate) internal onlyInitializing {\n        if (_delegate == address(0)) revert InvalidDelegate();\n        endpoint.setDelegate(_delegate);\n    }\n\n    /**\n     * @notice Returns the peer address (OApp instance) associated with a specific endpoint.\n     * @param _eid The endpoint ID.\n     * @return peer The address of the peer associated with the specified endpoint.\n     */\n    function peers(uint32 _eid) public view override returns (bytes32) {\n        OAppCoreStorage storage $ = _getOAppCoreStorage();\n        return $.peers[_eid];\n    }\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     *\n     * @dev Only the owner/admin of the OApp can call this function.\n     * @dev Indicates that the peer is trusted to send LayerZero messages to this OApp.\n     * @dev Set this to bytes32(0) to remove the peer address.\n     * @dev Peer is a bytes32 to accommodate non-evm chains.\n     */\n    function setPeer(uint32 _eid, bytes32 _peer) public virtual onlyOwner {\n        OAppCoreStorage storage $ = _getOAppCoreStorage();\n        $.peers[_eid] = _peer;\n        emit PeerSet(_eid, _peer);\n    }\n\n    /**\n     * @notice Internal function to get the peer address associated with a specific endpoint; reverts if NOT set.\n     * ie. the peer is set to bytes32(0).\n     * @param _eid The endpoint ID.\n     * @return peer The address of the peer associated with the specified endpoint.\n     */\n    function _getPeerOrRevert(uint32 _eid) internal view virtual returns (bytes32) {\n        OAppCoreStorage storage $ = _getOAppCoreStorage();\n        bytes32 peer = $.peers[_eid];\n        if (peer == bytes32(0)) revert NoPeer(_eid);\n        return peer;\n    }\n\n    /**\n     * @notice Sets the delegate address for the OApp.\n     * @param _delegate The address of the delegate to be set.\n     *\n     * @dev Only the owner/admin of the OApp can call this function.\n     * @dev Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\n     */\n    function setDelegate(address _delegate) public onlyOwner {\n        endpoint.setDelegate(_delegate);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n    /// @custom:storage-location erc7201:openzeppelin.storage.Ownable\n    struct OwnableStorage {\n        address _owner;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Ownable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;\n\n    function _getOwnableStorage() private pure returns (OwnableStorage storage $) {\n        assembly {\n            $.slot := OwnableStorageLocation\n        }\n    }\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    function __Ownable_init(address initialOwner) internal onlyInitializing {\n        __Ownable_init_unchained(initialOwner);\n    }\n\n    function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        OwnableStorage storage $ = _getOwnableStorage();\n        return $._owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        OwnableStorage storage $ = _getOwnableStorage();\n        address oldOwner = $._owner;\n        $._owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Errors.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error InsufficientBalance(uint256 balance, uint256 needed);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedCall();\n\n    /**\n     * @dev The deployment failed.\n     */\n    error FailedDeployment();\n\n    /**\n     * @dev A necessary precompile is missing.\n     */\n    error MissingPrecompile(address);\n}\n"},{"file_path":"@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}"},{"file_path":"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppSenderUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { SafeERC20, IERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport { MessagingParams, MessagingFee, MessagingReceipt } from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\nimport { OAppCoreUpgradeable } from \"./OAppCoreUpgradeable.sol\";\n\n/**\n * @title OAppSender\n * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.\n */\nabstract contract OAppSenderUpgradeable is OAppCoreUpgradeable {\n    using SafeERC20 for IERC20;\n\n    // Custom error messages\n    error NotEnoughNative(uint256 msgValue);\n    error LzTokenUnavailable();\n\n    // @dev The version of the OAppSender implementation.\n    // @dev Version is bumped when changes are made to this contract.\n    uint64 internal constant SENDER_VERSION = 1;\n\n    /**\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\n     * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to\n     * accommodate the different version of Ownable.\n     */\n    function __OAppSender_init(address _delegate) internal onlyInitializing {\n        __OAppCore_init(_delegate);\n    }\n\n    function __OAppSender_init_unchained() internal onlyInitializing {}\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol contract.\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\n     *\n     * @dev Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented.\n     * ie. this is a SEND only OApp.\n     * @dev If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions\n     */\n    function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {\n        return (SENDER_VERSION, 0);\n    }\n\n    /**\n     * @dev Internal function to interact with the LayerZero EndpointV2.quote() for fee calculation.\n     * @param _dstEid The destination endpoint ID.\n     * @param _message The message payload.\n     * @param _options Additional options for the message.\n     * @param _payInLzToken Flag indicating whether to pay the fee in LZ tokens.\n     * @return fee The calculated MessagingFee for the message.\n     *      - nativeFee: The native fee for the message.\n     *      - lzTokenFee: The LZ token fee for the message.\n     */\n    function _quote(\n        uint32 _dstEid,\n        bytes memory _message,\n        bytes memory _options,\n        bool _payInLzToken\n    ) internal view virtual returns (MessagingFee memory fee) {\n        return\n            endpoint.quote(\n                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _payInLzToken),\n                address(this)\n            );\n    }\n\n    /**\n     * @dev Internal function to interact with the LayerZero EndpointV2.send() for sending a message.\n     * @param _dstEid The destination endpoint ID.\n     * @param _message The message payload.\n     * @param _options Additional options for the message.\n     * @param _fee The calculated LayerZero fee for the message.\n     *      - nativeFee: The native fee.\n     *      - lzTokenFee: The lzToken fee.\n     * @param _refundAddress The address to receive any excess fee values sent to the endpoint.\n     * @return receipt The receipt for the sent message.\n     *      - guid: The unique identifier for the sent message.\n     *      - nonce: The nonce of the sent message.\n     *      - fee: The LayerZero fee incurred for the message.\n     */\n    function _lzSend(\n        uint32 _dstEid,\n        bytes memory _message,\n        bytes memory _options,\n        MessagingFee memory _fee,\n        address _refundAddress\n    ) internal virtual returns (MessagingReceipt memory receipt) {\n        // @dev Push corresponding fees to the endpoint, any excess is sent back to the _refundAddress from the endpoint.\n        uint256 messageValue = _payNative(_fee.nativeFee);\n        if (_fee.lzTokenFee > 0) _payLzToken(_fee.lzTokenFee);\n\n        return\n            // solhint-disable-next-line check-send-result\n            endpoint.send{ value: messageValue }(\n                MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _fee.lzTokenFee > 0),\n                _refundAddress\n            );\n    }\n\n    /**\n     * @dev Internal function to pay the native fee associated with the message.\n     * @param _nativeFee The native fee to be paid.\n     * @return nativeFee The amount of native currency paid.\n     *\n     * @dev If the OApp needs to initiate MULTIPLE LayerZero messages in a single transaction,\n     * this will need to be overridden because msg.value would contain multiple lzFees.\n     * @dev Should be overridden in the event the LayerZero endpoint requires a different native currency.\n     * @dev Some EVMs use an ERC20 as a method for paying transactions/gasFees.\n     * @dev The endpoint is EITHER/OR, ie. it will NOT support both types of native payment at a time.\n     */\n    function _payNative(uint256 _nativeFee) internal virtual returns (uint256 nativeFee) {\n        if (msg.value != _nativeFee) revert NotEnoughNative(msg.value);\n        return _nativeFee;\n    }\n\n    /**\n     * @dev Internal function to pay the LZ token fee associated with the message.\n     * @param _lzTokenFee The LZ token fee to be paid.\n     *\n     * @dev If the caller is trying to pay in the specified lzToken, then the lzTokenFee is passed to the endpoint.\n     * @dev Any excess sent, is passed back to the specified _refundAddress in the _lzSend().\n     */\n    function _payLzToken(uint256 _lzTokenFee) internal virtual {\n        // @dev Cannot cache the token because it is not immutable in the endpoint.\n        address lzToken = endpoint.lzToken();\n        if (lzToken == address(0)) revert LzTokenUnavailable();\n\n        // Pay LZ token fee by sending tokens to the endpoint.\n        IERC20(lzToken).safeTransferFrom(msg.sender, address(endpoint), _lzTokenFee);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC1363.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},{"file_path":"@openzeppelin/contracts/utils/StorageSlot.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct Int256Slot {\n        int256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n"},{"file_path":"@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppCore.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\nimport { ILayerZeroEndpointV2 } from \"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol\";\n\n/**\n * @title IOAppCore\n */\ninterface IOAppCore {\n    // Custom error messages\n    error OnlyPeer(uint32 eid, bytes32 sender);\n    error NoPeer(uint32 eid);\n    error InvalidEndpointCall();\n    error InvalidDelegate();\n\n    // Event emitted when a peer (OApp) is set for a corresponding endpoint\n    event PeerSet(uint32 eid, bytes32 peer);\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol contract.\n     * @return receiverVersion The version of the OAppReceiver.sol contract.\n     */\n    function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);\n\n    /**\n     * @notice Retrieves the LayerZero endpoint associated with the OApp.\n     * @return iEndpoint The LayerZero endpoint as an interface.\n     */\n    function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);\n\n    /**\n     * @notice Retrieves the peer (OApp) associated with a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @return peer The peer address (OApp instance) associated with the corresponding endpoint.\n     */\n    function peers(uint32 _eid) external view returns (bytes32 peer);\n\n    /**\n     * @notice Sets the peer address (OApp instance) for a corresponding endpoint.\n     * @param _eid The endpoint ID.\n     * @param _peer The address of the peer to be associated with the corresponding endpoint.\n     */\n    function setPeer(uint32 _eid, bytes32 _peer) external;\n\n    /**\n     * @notice Sets the delegate address for the OApp Core.\n     * @param _delegate The address of the delegate to be set.\n     */\n    function setDelegate(address _delegate) external;\n}\n"},{"file_path":"contracts/DelayedUpgradeable.sol","source_code":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.24;\n\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\";\nimport {OwnableUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\n\n// note: using OwnableUpgradeable instead of Ownable2StepUpgradeable by design for now\nabstract contract DelayedUpgradeable is OwnableUpgradeable, UUPSUpgradeable {\n    // upgradeToAndCall() is delayed\n    address public nextImplementation;\n    bytes32 public nextUpgradeToAndCallDataHash;\n    uint64 public etNextUpgradeToAndCall; //effective time\n\n    event UpgradeToAndCallRequest(address newImplementation, bytes data);\n\n    error InvalidUpgradeToAndCallImpl();\n    error InvalidUpgradeToAndCallData();\n    error TooEarlyToUpgradeToAndCall();\n    error ZeroAddress();\n\n    function getDelay() internal virtual returns (uint64);\n\n    function requestUpgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) public onlyOwner {\n        _checkZeroAddress(_newImplementation);\n        nextImplementation = _newImplementation;\n        nextUpgradeToAndCallDataHash = keccak256(_data);\n        etNextUpgradeToAndCall = uint64(block.timestamp) + getDelay();\n        emit UpgradeToAndCallRequest(_newImplementation, _data);\n    }\n\n    function upgradeToAndCall(\n        address _newImplementation,\n        bytes memory _data\n    ) public payable override onlyProxy {\n        if (_newImplementation != nextImplementation) {\n            revert InvalidUpgradeToAndCallImpl();\n        }\n        if (keccak256(_data) != nextUpgradeToAndCallDataHash) {\n            revert InvalidUpgradeToAndCallData();\n        }\n\n        uint64 et = etNextUpgradeToAndCall;\n        if (et == 0 || et > block.timestamp) {\n            revert TooEarlyToUpgradeToAndCall();\n        }\n\n        // _authorizeUpgrade(newImplementation);\n        // _upgradeToAndCallUUPS(newImplementation, data);\n        super.upgradeToAndCall(_newImplementation, _data);\n    }\n\n    function _authorizeUpgrade(\n        address newImplementation\n    ) internal override onlyOwner {}\n\n    function _checkZeroAddress(address _addr) internal pure {\n        if (_addr == address(0)) {\n            revert ZeroAddress();\n        }\n    }\n}\n"},{"file_path":"@layerzerolabs/oapp-evm-upgradeable/contracts/oapp/OAppUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.20;\n\n// @dev Import the 'MessagingFee' and 'MessagingReceipt' so it's exposed to OApp implementers\n// solhint-disable-next-line no-unused-import\nimport { OAppSenderUpgradeable, MessagingFee, MessagingReceipt } from \"./OAppSenderUpgradeable.sol\";\n// @dev Import the 'Origin' so it's exposed to OApp implementers\n// solhint-disable-next-line no-unused-import\nimport { OAppReceiverUpgradeable, Origin } from \"./OAppReceiverUpgradeable.sol\";\nimport { OAppCoreUpgradeable } from \"./OAppCoreUpgradeable.sol\";\n\n/**\n * @title OApp\n * @dev Abstract contract serving as the base for OApp implementation, combining OAppSender and OAppReceiver functionality.\n */\nabstract contract OAppUpgradeable is OAppSenderUpgradeable, OAppReceiverUpgradeable {\n    /**\n     * @dev Constructor to initialize the OApp with the provided endpoint and owner.\n     * @param _endpoint The address of the LOCAL LayerZero endpoint.\n     */\n    constructor(address _endpoint) OAppCoreUpgradeable(_endpoint) {}\n\n    /**\n     * @dev Initializes the OApp with the provided delegate.\n     * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.\n     *\n     * @dev The delegate typically should be set as the owner of the contract.\n     * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to\n     * accommodate the different version of Ownable.\n     */\n    function __OApp_init(address _delegate) internal onlyInitializing {\n        __OAppCore_init(_delegate);\n        __OAppReceiver_init_unchained();\n        __OAppSender_init_unchained();\n    }\n\n    function __OApp_init_unchained() internal onlyInitializing {}\n\n    /**\n     * @notice Retrieves the OApp version information.\n     * @return senderVersion The version of the OAppSender.sol implementation.\n     * @return receiverVersion The version of the OAppReceiver.sol implementation.\n     */\n    function oAppVersion()\n        public\n        pure\n        virtual\n        override(OAppSenderUpgradeable, OAppReceiverUpgradeable)\n        returns (uint64 senderVersion, uint64 receiverVersion)\n    {\n        return (SENDER_VERSION, RECEIVER_VERSION);\n    }\n}\n"},{"file_path":"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\nimport { Origin } from \"./ILayerZeroEndpointV2.sol\";\n\ninterface ILayerZeroReceiver {\n    function allowInitializePath(Origin calldata _origin) external view returns (bool);\n\n    function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);\n\n    function lzReceive(\n        Origin calldata _origin,\n        bytes32 _guid,\n        bytes calldata _message,\n        address _executor,\n        bytes calldata _extraData\n    ) external payable;\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Context.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},{"file_path":"@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Client} from \"../libraries/Client.sol\";\n\ninterface IRouterClient {\n  error UnsupportedDestinationChain(uint64 destChainSelector);\n  error InsufficientFeeTokenAmount();\n  error InvalidMsgValue();\n\n  /// @notice Checks if the given chain ID is supported for sending/receiving.\n  /// @param chainSelector The chain to check.\n  /// @return supported is true if it is supported, false if not.\n  function isChainSupported(uint64 chainSelector) external view returns (bool supported);\n\n  /// @notice Gets a list of all supported tokens which can be sent or received\n  /// to/from a given chain id.\n  /// @param chainSelector The chainSelector.\n  /// @return tokens The addresses of all tokens that are supported.\n  function getSupportedTokens(uint64 chainSelector) external view returns (address[] memory tokens);\n\n  /// @param destinationChainSelector The destination chainSelector\n  /// @param message The cross-chain CCIP message including data and/or tokens\n  /// @return fee returns execution fee for the message\n  /// delivery to destination chain, denominated in the feeToken specified in the message.\n  /// @dev Reverts with appropriate reason upon invalid message.\n  function getFee(\n    uint64 destinationChainSelector,\n    Client.EVM2AnyMessage memory message\n  ) external view returns (uint256 fee);\n\n  /// @notice Request a message to be sent to the destination chain\n  /// @param destinationChainSelector The destination chain ID\n  /// @param message The cross-chain CCIP message including data and/or tokens\n  /// @return messageId The message ID\n  /// @dev Note if msg.value is larger than the required fee (from getFee) we accept\n  /// the overpayment with no refund.\n  /// @dev Reverts with appropriate reason upon invalid message.\n  function ccipSend(\n    uint64 destinationChainSelector,\n    Client.EVM2AnyMessage calldata message\n  ) external payable returns (bytes32);\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},{"file_path":"@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IAny2EVMMessageReceiver} from \"../interfaces/IAny2EVMMessageReceiver.sol\";\n\nimport {Client} from \"../libraries/Client.sol\";\n\nimport {IERC165} from \"../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol\";\n\n/// @title CCIPReceiver - Base contract for CCIP applications that can receive messages.\nabstract contract CCIPReceiver is IAny2EVMMessageReceiver, IERC165 {\n  address internal immutable i_ccipRouter;\n\n  constructor(address router) {\n    if (router == address(0)) revert InvalidRouter(address(0));\n    i_ccipRouter = router;\n  }\n\n  /// @notice IERC165 supports an interfaceId\n  /// @param interfaceId The interfaceId to check\n  /// @return true if the interfaceId is supported\n  /// @dev Should indicate whether the contract implements IAny2EVMMessageReceiver\n  /// e.g. return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId\n  /// This allows CCIP to check if ccipReceive is available before calling it.\n  /// If this returns false or reverts, only tokens are transferred to the receiver.\n  /// If this returns true, tokens are transferred and ccipReceive is called atomically.\n  /// Additionally, if the receiver address does not have code associated with\n  /// it at the time of execution (EXTCODESIZE returns 0), only tokens will be transferred.\n  function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) {\n    return interfaceId == type(IAny2EVMMessageReceiver).interfaceId || interfaceId == type(IERC165).interfaceId;\n  }\n\n  /// @inheritdoc IAny2EVMMessageReceiver\n  function ccipReceive(Client.Any2EVMMessage calldata message) external virtual override onlyRouter {\n    _ccipReceive(message);\n  }\n\n  /// @notice Override this function in your implementation.\n  /// @param message Any2EVMMessage\n  function _ccipReceive(Client.Any2EVMMessage memory message) internal virtual;\n\n  /////////////////////////////////////////////////////////////////////\n  // Plumbing\n  /////////////////////////////////////////////////////////////////////\n\n  /// @notice Return the current router\n  /// @return CCIP router address\n  function getRouter() public view returns (address) {\n    return address(i_ccipRouter);\n  }\n\n  error InvalidRouter(address router);\n\n  /// @dev only calls from the set router are accepted.\n  modifier onlyRouter() {\n    if (msg.sender != address(i_ccipRouter)) revert InvalidRouter(msg.sender);\n    _;\n  }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/access/Ownable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},{"file_path":"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\nimport { IMessageLibManager } from \"./IMessageLibManager.sol\";\nimport { IMessagingComposer } from \"./IMessagingComposer.sol\";\nimport { IMessagingChannel } from \"./IMessagingChannel.sol\";\nimport { IMessagingContext } from \"./IMessagingContext.sol\";\n\nstruct MessagingParams {\n    uint32 dstEid;\n    bytes32 receiver;\n    bytes message;\n    bytes options;\n    bool payInLzToken;\n}\n\nstruct MessagingReceipt {\n    bytes32 guid;\n    uint64 nonce;\n    MessagingFee fee;\n}\n\nstruct MessagingFee {\n    uint256 nativeFee;\n    uint256 lzTokenFee;\n}\n\nstruct Origin {\n    uint32 srcEid;\n    bytes32 sender;\n    uint64 nonce;\n}\n\ninterface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {\n    event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);\n\n    event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);\n\n    event PacketDelivered(Origin origin, address receiver);\n\n    event LzReceiveAlert(\n        address indexed receiver,\n        address indexed executor,\n        Origin origin,\n        bytes32 guid,\n        uint256 gas,\n        uint256 value,\n        bytes message,\n        bytes extraData,\n        bytes reason\n    );\n\n    event LzTokenSet(address token);\n\n    event DelegateSet(address sender, address delegate);\n\n    function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);\n\n    function send(\n        MessagingParams calldata _params,\n        address _refundAddress\n    ) external payable returns (MessagingReceipt memory);\n\n    function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;\n\n    function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);\n\n    function initializable(Origin calldata _origin, address _receiver) external view returns (bool);\n\n    function lzReceive(\n        Origin calldata _origin,\n        address _receiver,\n        bytes32 _guid,\n        bytes calldata _message,\n        bytes calldata _extraData\n    ) external payable;\n\n    // oapp can burn messages partially by calling this function with its own business logic if messages are verified in order\n    function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;\n\n    function setLzToken(address _lzToken) external;\n\n    function lzToken() external view returns (address);\n\n    function nativeToken() external view returns (address);\n\n    function setDelegate(address _delegate) external;\n}\n"},{"file_path":"@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Client} from \"../libraries/Client.sol\";\n\n/// @notice Application contracts that intend to receive messages from\n/// the router should implement this interface.\ninterface IAny2EVMMessageReceiver {\n  /// @notice Called by the Router to deliver a message.\n  /// If this reverts, any token transfers also revert. The message\n  /// will move to a FAILED state and become available for manual execution.\n  /// @param message CCIP Message\n  /// @dev Note ensure you check the msg.sender is the OffRampRouter\n  function ccipReceive(Client.Any2EVMMessage calldata message) external;\n}\n"},{"file_path":"@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessagingChannel.sol","source_code":"// SPDX-License-Identifier: MIT\n\npragma solidity >=0.8.0;\n\ninterface IMessagingChannel {\n    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);\n    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\n    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);\n\n    function eid() external view returns (uint32);\n\n    // this is an emergency function if a message cannot be verified for some reasons\n    // required to provide _nextNonce to avoid race condition\n    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;\n\n    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\n\n    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;\n\n    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);\n\n    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\n\n    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);\n\n    function inboundPayloadHash(\n        address _receiver,\n        uint32 _srcEid,\n        bytes32 _sender,\n        uint64 _nonce\n    ) external view returns (bytes32);\n\n    function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);\n}\n"},{"file_path":"@openzeppelin/contracts/utils/introspection/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_ccipRouter","type":"address"},{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"DelayTooLarge","type":"error"},{"inputs":[],"name":"DelayTooSmall","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[],"name":"InvalidDelegate","type":"error"},{"inputs":[],"name":"InvalidEndpointCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[{"internalType":"uint8","name":"expected","type":"uint8"},{"internalType":"uint8","name":"actual","type":"uint8"}],"name":"InvalidRecipientLength","type":"error"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"InvalidRouter","type":"error"},{"inputs":[],"name":"InvalidUpgradeToAndCallData","type":"error"},{"inputs":[],"name":"InvalidUpgradeToAndCallImpl","type":"error"},{"inputs":[],"name":"LzTokenUnavailable","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"NoPeer","type":"error"},{"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"NotEnoughNative","type":"error"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"bytes","name":"messenger","type":"bytes"}],"name":"NotInAllowListed","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"OnlyEndpoint","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"OnlyPeer","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TooEarlyToUpgradeToAndCall","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chainSelector","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"messenger","type":"bytes"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"AllowedPeer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageID","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"CCReceive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageID","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"CCReceiveLZ","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageID","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"CCSendMintBudget","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageID","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"CCSendMintBudgetLZ","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageID","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"CCSendToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageID","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"messageData","type":"bytes"}],"name":"CCSendTokenLZ","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"LZPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"peer","type":"bytes32"}],"name":"PeerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"newDelay","type":"uint64"}],"name":"SetDelayEffected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"oldDelay","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"newDelay","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"et","type":"uint64"}],"name":"SetDelayRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newImplementation","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"UpgradeToAndCallRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"}],"name":"allowInitializePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"bytes","name":"messenger","type":"bytes"}],"name":"allowedPeer","outputs":[{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"uint8","name":"addrLen","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"bytes","name":"messageReceiver","type":"bytes"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"name":"calculateCCSendTokenFeeAndMessage","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"components":[{"internalType":"bytes","name":"receiver","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"internalType":"struct Client.EVM2AnyMessage","name":"evm2AnyMessage","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"bytes","name":"messageReceiver","type":"bytes"},{"internalType":"uint112","name":"value","type":"uint112"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"name":"calculateCcSendMintBudgetFeeAndMessage","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"components":[{"internalType":"bytes","name":"receiver","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"internalType":"struct Client.EVM2AnyMessage","name":"evm2AnyMessage","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ccClient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"destTokenAmounts","type":"tuple[]"}],"internalType":"struct Client.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"etNextDelay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"etNextUpgradeToAndCall","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"bytes","name":"messageReceiver","type":"bytes"},{"internalType":"bytes","name":"extraArgs","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"getFeeAndMessage","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"components":[{"internalType":"bytes","name":"receiver","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"internalType":"struct Client.EVM2AnyMessage","name":"evm2AnyMessage","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ccClient","type":"address"},{"internalType":"address","name":"_initialOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"}],"name":"isComposeMsgSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"uint112","name":"value","type":"uint112"},{"internalType":"bytes","name":"_options","type":"bytes"}],"name":"lzCalculateSendMintBudgetFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"_options","type":"bytes"}],"name":"lzCalculateSendTokenFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"uint112","name":"value","type":"uint112"},{"internalType":"bytes","name":"_options","type":"bytes"}],"name":"lzSendMintBudgetToChain","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"_options","type":"bytes"}],"name":"lzSendTokenToChain","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"},{"internalType":"uint8","name":"_addrLen","type":"uint8"}],"name":"lzSetPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextDelay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nextNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextUpgradeToAndCallDataHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAppVersion","outputs":[{"internalType":"uint64","name":"senderVersion","type":"uint64"},{"internalType":"uint64","name":"receiverVersion","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"peers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newImplementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"requestUpgradeToAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeNextUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"bytes","name":"messageReceiver","type":"bytes"},{"internalType":"uint112","name":"value","type":"uint112"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"name":"sendMintBudgetToChain","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"destinationChainSelector","type":"uint64"},{"internalType":"bytes","name":"messageReceiver","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"extraArgs","type":"bytes"}],"name":"sendTokenToChain","outputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainSelector","type":"uint64"},{"internalType":"bytes","name":"messenger","type":"bytes"},{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"uint8","name":"addrLen","type":"uint8"}],"name":"setAllowedPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_delay","type":"uint64"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPaused","type":"bool"}],"name":"setLZPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"setPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newImplementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d0000000000000000000000001a44076050125825900e736c501f859c50fe728c"}