ERC6909Upgradeable
Inherits: Initializable, ContextUpgradeable, ERC165Upgradeable, IERC6909
Implementation of ERC-6909. See https://eips.ethereum.org/EIPS/eip-6909
State Variables
ERC6909StorageLocation
bytes32 private constant ERC6909StorageLocation = 0x9e75074fe7582401cc58901f6bda367c4d687c51437956963a7c06ef5cfaf900;
Functions
_getERC6909Storage
function _getERC6909Storage() private pure returns (ERC6909Storage storage $);
__ERC6909_init
function __ERC6909_init() internal onlyInitializing;
__ERC6909_init_unchained
function __ERC6909_init_unchained() internal onlyInitializing;
supportsInterface
Query if a contract implements an interface
Interface identification is specified in ERC-165. This function uses less than 30,000 gas.
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC165Upgradeable, IERC165)
returns (bool);
Parameters
Name | Type | Description |
---|---|---|
interfaceId | bytes4 |
Returns
Name | Type | Description |
---|---|---|
<none> | bool | true if the contract implements interfaceID and interfaceID is not 0xffffffff, false otherwise |
balanceOf
Returns the amount of tokens of type id
owned by owner
.
function balanceOf(address owner, uint256 id) public view virtual override returns (uint256);
allowance
Returns the amount of tokens of type id
that spender
is allowed to spend on behalf of owner
.
NOTE: Does not include operator allowances.
function allowance(address owner, address spender, uint256 id) public view virtual override returns (uint256);
isOperator
Returns true if spender
is set as an operator for owner
.
function isOperator(address owner, address spender) public view virtual override returns (bool);
approve
Sets an approval to spender
for amount
of tokens of type id
from the caller's tokens. An amount
of
type(uint256).max
signifies an unlimited approval.
Must return true.
function approve(address spender, uint256 id, uint256 amount) public virtual override returns (bool);
setOperator
Grants or revokes unlimited transfer permission of any token id to spender
for the caller's tokens.
Must return true.
function setOperator(address spender, bool approved) public virtual override returns (bool);
transfer
Transfers amount
of token type id
from the caller's account to receiver
.
Must return true.
function transfer(address receiver, uint256 id, uint256 amount) public virtual override returns (bool);
transferFrom
Transfers amount
of token type id
from sender
to receiver
.
Must return true.
function transferFrom(address sender, address receiver, uint256 id, uint256 amount)
public
virtual
override
returns (bool);
_mint
Creates amount
of token id
and assigns them to account
, by transferring it from address(0).
Relies on the _update
mechanism.
Emits a {Transfer} event with from
set to the zero address.
NOTE: This function is not virtual, {_update} should be overridden instead.
function _mint(address to, uint256 id, uint256 amount) internal;
_transfer
Moves amount
of token id
from from
to to
without checking for approvals. This function verifies
that neither the sender nor the receiver are address(0), which means it cannot mint or burn tokens.
Relies on the _update
mechanism.
Emits a {Transfer} event.
NOTE: This function is not virtual, {_update} should be overridden instead.
function _transfer(address from, address to, uint256 id, uint256 amount) internal;
_burn
Destroys a amount
of token id
from account
.
Relies on the _update
mechanism.
Emits a {Transfer} event with to
set to the zero address.
NOTE: This function is not virtual, {_update} should be overridden instead
function _burn(address from, uint256 id, uint256 amount) internal;
_update
Transfers amount
of token id
from from
to to
, or alternatively mints (or burns) if from
(or to
) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
this function.
Emits a {Transfer} event.
function _update(address from, address to, uint256 id, uint256 amount) internal virtual;
_approve
*Sets amount
as the allowance of spender
over the owner
's id
tokens.
This internal function is equivalent to approve
, and can be used to e.g. set automatic allowances for certain
subsystems, etc.
Emits an {Approval} event.
Requirements:
owner
cannot be the zero address.spender
cannot be the zero address.*
function _approve(address owner, address spender, uint256 id, uint256 amount) internal virtual;
_setOperator
*Approve spender
to operate on all of owner
's tokens
This internal function is equivalent to setOperator
, and can be used to e.g. set automatic allowances for
certain subsystems, etc.
Emits an {OperatorSet} event.
Requirements:
owner
cannot be the zero address.spender
cannot be the zero address.*
function _setOperator(address owner, address spender, bool approved) internal virtual;
_spendAllowance
Updates owner
's allowance for spender
based on spent amount
.
Does not update the allowance value in case of infinite allowance.
Revert if not enough allowance is available.
Does not emit an {Approval} event.
function _spendAllowance(address owner, address spender, uint256 id, uint256 amount) internal virtual;
Errors
ERC6909InsufficientBalance
error ERC6909InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 id);
ERC6909InsufficientAllowance
error ERC6909InsufficientAllowance(address spender, uint256 allowance, uint256 needed, uint256 id);
ERC6909InvalidApprover
error ERC6909InvalidApprover(address approver);
ERC6909InvalidReceiver
error ERC6909InvalidReceiver(address receiver);
ERC6909InvalidSender
error ERC6909InvalidSender(address sender);
ERC6909InvalidSpender
error ERC6909InvalidSpender(address spender);
Structs
ERC6909Storage
Note: storage-location: erc7201:openzeppelin.storage.ERC6909
struct ERC6909Storage {
mapping(address owner => mapping(uint256 id => uint256)) _balances;
mapping(address owner => mapping(address operator => bool)) _operatorApprovals;
mapping(address owner => mapping(address spender => mapping(uint256 id => uint256))) _allowances;
}