geode interface

Created Diff never expires
11 removals
140 lines
34 additions
164 lines
// SPDX-License-Identifier: MIT
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)


pragma solidity =0.8.7;
pragma solidity =0.8.7;


import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";


import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "../helpers/ERC20InterfaceUpgradable.sol";

/**
* @dev differences between ERC20InterfacePermitUpgradable and Openzeppelin's implementation of ERC20PermitUpgradable is:
* -> pragma set to =0.8.7;
* -> using ERC20InterfaceUpgradable instead of ERC20Upgradeable
* -> added initialize
*/


/**
/**
* @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
* need to send a transaction, and thus is not required to hold Ether at all.
*
*
* _Available since v3.4._
* _Available since v3.4._
*
*
* @custom:storage-size 51
* @custom:storage-size 51
*/
*/
abstract contract ERC20PermitUpgradeable is
contract ERC20InterfacePermitUpgradable is
Initializable,
Initializable,
ERC20Upgradeable,
ERC20InterfaceUpgradable,
IERC20PermitUpgradeable,
IERC20PermitUpgradeable,
EIP712Upgradeable
EIP712Upgradeable
{
{
using CountersUpgradeable for CountersUpgradeable.Counter;
using CountersUpgradeable for CountersUpgradeable.Counter;


mapping(address => CountersUpgradeable.Counter) private _nonces;
mapping(address => CountersUpgradeable.Counter) private _nonces;


// solhint-disable-next-line var-name-mixedcase
// solhint-disable-next-line var-name-mixedcase
bytes32 private constant _PERMIT_TYPEHASH =
bytes32 private constant _PERMIT_TYPEHASH =
keccak256(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
);
);
/**
/**
* @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
* @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
* However, to ensure consistency with the upgradeable transpiler, we will continue
* However, to ensure consistency with the upgradeable transpiler, we will continue
* to reserve a slot.
* to reserve a slot.
* @custom:oz-renamed-from _PERMIT_TYPEHASH
* @custom:oz-renamed-from _PERMIT_TYPEHASH
*/
*/
// solhint-disable-next-line var-name-mixedcase
// solhint-disable-next-line var-name-mixedcase
bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;
bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;


/**
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
*/
function initialize(
uint256 id_,
string calldata name_,
string calldata symbol_,
address gETH_1155
) public virtual initializer {
__ERC20interfacePermit_init(id_, name_, symbol_, gETH_1155);
}

/**
* @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
* @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
*
*
* It's a good idea to use the same `name` that is defined as the ERC20 token name.
* It's a good idea to use the same `name` that is defined as the ERC20 token name.
*/
*/
function __ERC20Permit_init(string memory name) internal onlyInitializing {
function __ERC20interfacePermit_init(
__EIP712_init_unchained(name, "1");
uint256 id_,
string calldata name_,
string calldata symbol_,
address gETH_1155
) internal onlyInitializing {
__ERC20interface_init_unchained(id_, name_, symbol_, gETH_1155);
__EIP712_init_unchained(name_, "1");
}
}

function __ERC20Permit_init_unchained(string memory)
internal
onlyInitializing
{}


/**
/**
* @dev See {IERC20Permit-permit}.
* @dev See {IERC20Permit-permit}.
*/
*/
function permit(
function permit(
address owner,
address owner,
address spender,
address spender,
uint256 value,
uint256 value,
uint256 deadline,
uint256 deadline,
uint8 v,
uint8 v,
bytes32 r,
bytes32 r,
bytes32 s
bytes32 s
) public virtual override {
) public virtual override {
require(block.timestamp <= deadline, "ERC20Permit: expired deadline");
require(block.timestamp <= deadline, "ERC20Permit: expired deadline");


bytes32 structHash = keccak256(
bytes32 structHash = keccak256(
abi.encode(
abi.encode(
_PERMIT_TYPEHASH,
_PERMIT_TYPEHASH,
owner,
owner,
spender,
spender,
value,
value,
_useNonce(owner),
_useNonce(owner),
deadline
deadline
)
)
);
);


bytes32 hash = _hashTypedDataV4(structHash);
bytes32 hash = _hashTypedDataV4(structHash);


address signer = ECDSAUpgradeable.recover(hash, v, r, s);
address signer = ECDSAUpgradeable.recover(hash, v, r, s);
require(signer == owner, "ERC20Permit: invalid signature");
require(signer == owner, "ERC20Permit: invalid signature");


_approve(owner, spender, value);
_approve(owner, spender, value);
}
}


/**
/**
* @dev See {IERC20Permit-nonces}.
* @dev See {IERC20Permit-nonces}.
*/
*/
function nonces(address owner)
function nonces(address owner)
public
public
view
view
virtual
virtual
override
override
returns (uint256)
returns (uint256)
{
{
return _nonces[owner].current();
return _nonces[owner].current();
}
}


/**
/**
* @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
* @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
*/
*/
// solhint-disable-next-line func-name-mixedcase
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
function DOMAIN_SEPARATOR() external view override returns (bytes32) {
return _domainSeparatorV4();
return _domainSeparatorV4();
}
}


/**
/**
* @dev "Consume a nonce": return the current value and increment.
* @dev "Consume a nonce": return the current value and increment.
*
*
* _Available since v4.1._
* _Available since v4.1._
*/
*/
function _useNonce(address owner)
function _useNonce(address owner)
internal
internal
virtual
virtual
returns (uint256 current)
returns (uint256 current)
{
{
CountersUpgradeable.Counter storage nonce = _nonces[owner];
CountersUpgradeable.Counter storage nonce = _nonces[owner];
current = nonce.current();
current = nonce.current();
nonce.increment();
nonce.increment();
}
}


/**
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* @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.
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
*/
uint256[49] private __gap;
uint256[49] private __gap;
}
}