// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (crosschain/CrossChainEnabled.sol) pragma solidity ^0.8.4; import "./errorsUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.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 CrossChainEnabledUpgradeable is Initializable { /** * @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); _; } function __CrossChainEnabled_init() internal onlyInitializing { } function __CrossChainEnabled_init_unchained() internal onlyInitializing { } /** * @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); /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }