1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts (last updated v4.5.0) (metatx/ERC2771Context.sol)
- pragma solidity ^0.8.9;
- import "../utils/ContextUpgradeable.sol";
- import "../proxy/utils/Initializable.sol";
- /**
- * @dev Context variant with ERC2771 support.
- */
- abstract contract ERC2771ContextUpgradeable is Initializable, ContextUpgradeable {
- /// @custom:oz-upgrades-unsafe-allow state-variable-immutable
- address private immutable _trustedForwarder;
- /// @custom:oz-upgrades-unsafe-allow constructor
- constructor(address trustedForwarder) {
- _trustedForwarder = trustedForwarder;
- }
- function isTrustedForwarder(address forwarder) public view virtual returns (bool) {
- return forwarder == _trustedForwarder;
- }
- function _msgSender() internal view virtual override returns (address sender) {
- if (isTrustedForwarder(msg.sender)) {
- // The assembly code is more direct than the Solidity version using `abi.decode`.
- assembly {
- sender := shr(96, calldataload(sub(calldatasize(), 20)))
- }
- } else {
- return super._msgSender();
- }
- }
- function _msgData() internal view virtual override returns (bytes calldata) {
- if (isTrustedForwarder(msg.sender)) {
- return msg.data[:msg.data.length - 20];
- } else {
- return super._msgData();
- }
- }
- /**
- * @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;
- }
|