// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (crosschain/CrossChainEnabled.sol) pragma solidity ^0.8.4; import "./errors.sol"; /** * @dev Provides information for building cross-chain aware contracts. This * abstract contract provides accessors and modifiers to control the execution * flow when receiving cross-chain messages. * * Actual implementations of cross-chain aware contracts, which are based on * this abstraction, will have to inherit from a bridge-specific * specialization. Such specializations are provided under * `crosschain//CrossChainEnabled.sol`. * * _Available since v4.6._ */ abstract contract CrossChainEnabled { /** * @dev Throws if the current function call is not the result of a * cross-chain execution. */ modifier onlyCrossChain() { if (!_isCrossChain()) revert NotCrossChainCall(); _; } /** * @dev Throws if the current function call is not the result of a * cross-chain execution initiated by `account`. */ modifier onlyCrossChainSender(address expected) { address actual = _crossChainSender(); if (expected != actual) revert InvalidCrossChainSender(actual, expected); _; } /** * @dev Returns whether the current function call is the result of a * cross-chain message. */ function _isCrossChain() internal view virtual returns (bool); /** * @dev Returns the address of the sender of the cross-chain message that * triggered the current function call. * * IMPORTANT: Should revert with `NotCrossChainCall` if the current function * call is not the result of a cross-chain message. */ function _crossChainSender() internal view virtual returns (address); }