123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts (last updated v4.8.0) (crosschain/arbitrum/LibArbitrumL2.sol)
- pragma solidity ^0.8.4;
- import {IArbSys as ArbitrumL2_Bridge} from "../../vendor/arbitrum/IArbSys.sol";
- import "../errors.sol";
- /**
- * @dev Primitives for cross-chain aware contracts for
- * https://arbitrum.io/[Arbitrum].
- *
- * This version should only be used on L2 to process cross-chain messages
- * originating from L1. For the other side, use {LibArbitrumL1}.
- *
- * WARNING: There is currently a bug in Arbitrum that causes this contract to
- * fail to detect cross-chain calls when deployed behind a proxy. This will be
- * fixed when the network is upgraded to Arbitrum Nitro, currently scheduled for
- * August 31st 2022.
- */
- library LibArbitrumL2 {
- /**
- * @dev Returns whether the current function call is the result of a
- * cross-chain message relayed by `arbsys`.
- */
- address public constant ARBSYS = 0x0000000000000000000000000000000000000064;
- function isCrossChain(address arbsys) internal view returns (bool) {
- return ArbitrumL2_Bridge(arbsys).wasMyCallersAddressAliased();
- }
- /**
- * @dev Returns the address of the sender that triggered the current
- * cross-chain message through `arbsys`.
- *
- * NOTE: {isCrossChain} should be checked before trying to recover the
- * sender, as it will revert with `NotCrossChainCall` if the current
- * function call is not the result of a cross-chain message.
- */
- function crossChainSender(address arbsys) internal view returns (address) {
- if (!isCrossChain(arbsys)) revert NotCrossChainCall();
- return ArbitrumL2_Bridge(arbsys).myCallersAddressWithoutAliasing();
- }
- }
|