LSP7DigitalAsset
Implementation of a LSP7 Digital Asset, a contract that represents a fungible token.
Minting and transferring are supplied with a uint256
amount. This implementation is agnostic to the way tokens are created. A supply mechanism has to be added in a derived contract using _mint
For a generic mechanism, see LSP7Mintable
.
Public Methods​
Public methods are accessible externally from users, allowing interaction with this function from dApps or other smart contracts. When marked as 'public', a method can be called both externally and internally, on the other hand, when marked as 'external', a method can only be called externally.
fallback​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
fallback(bytes calldata callData) external payable returns (bytes memory);
The fallback
function was called with the following amount of native tokens: msg.value
; and the following calldata: callData
.
Achieves the goal of LSP-17-ContractExtension standard by extending the contract to handle calls of functions that do not exist natively, forwarding the function call to the extension address mapped to the function being called. This function is executed when:
-
Sending data of length less than 4 bytes to the contract.
-
The first 4 bytes of the calldata do not match any publicly callable functions from the contract ABI.
-
Receiving native tokens
- If the data is equal or longer than 4 bytes, the ERC-725Y storage is queried with the following data key: _LSP17_EXTENSION_PREFIX +
bytes4(msg.sig)
(Check LSP-2-ERC725YJSONSchema for encoding the data key)
-
If there is no address stored under the following data key, revert with
NoExtensionFoundForFunctionSelector(bytes4)
. The data key relative tobytes4(0)
is an exception, where no reverts occurs if there is no extension address stored under. This exception is made to allow users to send random data (graffiti) to the account and to be able to react on it. -
If there is an address, forward the
msg.data
to the extension using the CALL opcode, appending 52 bytes (20 bytes ofmsg.sender
and 32 bytes ofmsg.value
). Return what the calls returns, or revert if the call failed.
- If the data sent to this function is of length less than 4 bytes (not a function selector), revert.
receive​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
receive() external payable;
LSP7 contract cannot receive native tokens.
Reverts whenever someone tries to send native tokens to a LSP7 contract.
authorizeOperator​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
authorizeOperator(address,uint256,bytes)
- Function selector:
0xb49506fd
To avoid front-running and Allowance Double-Spend Exploit when increasing or decreasing the authorized amount of an operator, it is advised to: 1. either call revokeOperator
first, and then re-call authorizeOperator
with the new amount. 2. or use the non-standard functions increaseAllowance
or decreaseAllowance
. For more information, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
function authorizeOperator(
address operator,
uint256 amount,
bytes operatorNotificationData
) external nonpayable;
Sets an amount
of tokens that an operator
has access from the caller's balance (allowance). See authorizedAmountFor
. Notify the operator based on the LSP1-UniversalReceiver standard
Parameters​
Name | Type | Description |
---|---|---|
operator | address | The address to authorize as an operator. |
amount | uint256 | The allowance amount of tokens operator has access to. |
operatorNotificationData | bytes | The data to notify the operator about via LSP1. |
authorizedAmountFor​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
authorizedAmountFor(address,address)
- Function selector:
0x65aeaa95
function authorizedAmountFor(
address operator,
address tokenOwner
) external view returns (uint256);
Get the amount of tokens operator
address has access to from tokenOwner
. Operators can send and burn tokens on behalf of their owners.
Parameters​
Name | Type | Description |
---|---|---|
operator | address | The operator's address to query the authorized amount for. |
tokenOwner | address | The token owner that operator has allowance on. |
Returns​
Name | Type | Description |
---|---|---|
0 | uint256 | The amount of tokens the operator 's address has access on the tokenOwner 's balance. |
balanceOf​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
balanceOf(address)
- Function selector:
0x70a08231
function balanceOf(address tokenOwner) external view returns (uint256);
Get the number of tokens owned by tokenOwner
. If the token is divisible (the decimals
function returns 18
), the amount returned should be divided by 1e18 to get a better picture of the actual balance of the tokenOwner
. Example: balanceOf(someAddress) -> 42_000_000_000_000_000_000 / 1e18 = 42 tokens
Parameters​
Name | Type | Description |
---|---|---|
tokenOwner | address | The address of the token holder to query the balance for. |
Returns​
Name | Type | Description |
---|---|---|
0 | uint256 | The amount of tokens owned by tokenOwner . |
decimals​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
decimals()
- Function selector:
0x313ce567
function decimals() external view returns (uint8);
Returns the number of decimals used to get its user representation. If the asset contract has been set to be non-divisible via the isNonDivisible_
parameter in the constructor
, the decimals returned wiil be 0
. Otherwise 18
is the common value.
Returns​
Name | Type | Description |
---|---|---|
0 | uint8 | the number of decimals. If 0 is returned, the asset is non-divisible. |
decreaseAllowance​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
decreaseAllowance(address,uint256,bytes)
- Function selector:
0x7b204c4e
function decreaseAllowance(
address operator,
uint256 subtractedAmount,
bytes operatorNotificationData
) external nonpayable;
Decrease the allowance of operator
by -subtractedAmount
Atomically decreases the allowance granted to operator
by the caller. This is an alternative approach to authorizeOperator
that can be used as a mitigation for the double spending allowance problem. Notify the operator based on the LSP1-UniversalReceiver standard
Parameters​
Name | Type | Description |
---|---|---|
operator | address | The operator to decrease allowance for msg.sender |
subtractedAmount | uint256 | The amount to decrease by in the operator's allowance. |
operatorNotificationData | bytes | - |
getData​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
getData(bytes32)
- Function selector:
0x54f6127f
function getData(bytes32 dataKey) external view returns (bytes dataValue);
Reading the ERC725Y storage for data key dataKey
returned the following value: dataValue
.
Get in the ERC725Y storage the bytes data stored at a specific data key dataKey
.
Parameters​
Name | Type | Description |
---|---|---|
dataKey | bytes32 | The data key for which to retrieve the value. |
Returns​
Name | Type | Description |
---|---|---|
dataValue | bytes | The bytes value stored under the specified data key. |
getDataBatch​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
getDataBatch(bytes32[])
- Function selector:
0xdedff9c6
function getDataBatch(
bytes32[] dataKeys
) external view returns (bytes[] dataValues);
Reading the ERC725Y storage for data keys dataKeys
returned the following values: dataValues
.
Get in the ERC725Y storage the bytes data stored at multiple data keys dataKeys
.
Parameters​
Name | Type | Description |
---|---|---|
dataKeys | bytes32[] | The array of keys which values to retrieve |
Returns​
Name | Type | Description |
---|---|---|
dataValues | bytes[] | The array of data stored at multiple keys |
getOperatorsOf​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
getOperatorsOf(address)
- Function selector:
0xd72fc29a
function getOperatorsOf(address tokenOwner) external view returns (address[]);
Returns all operator
addresses that are allowed to transfer or burn on behalf of tokenOwner
.
Parameters​
Name | Type | Description |
---|---|---|
tokenOwner | address | The token owner to get the operators for. |
Returns​
Name | Type | Description |
---|---|---|
0 | address[] | An array of operators allowed to transfer or burn tokens on behalf of tokenOwner . |
increaseAllowance​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
increaseAllowance(address,uint256,bytes)
- Function selector:
0x2bc1da82
function increaseAllowance(
address operator,
uint256 addedAmount,
bytes operatorNotificationData
) external nonpayable;
Increase the allowance of operator
by +addedAmount
Atomically increases the allowance granted to operator
by the caller. This is an alternative approach to authorizeOperator
that can be used as a mitigation for the double spending allowance problem. Notify the operator based on the LSP1-UniversalReceiver standard
Parameters​
Name | Type | Description |
---|---|---|
operator | address | The operator to increase the allowance for msg.sender |
addedAmount | uint256 | The additional amount to add on top of the current operator's allowance |
operatorNotificationData | bytes | - |
owner​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
owner()
- Function selector:
0x8da5cb5b
function owner() external view returns (address);
Returns the address of the current owner.
Returns​
Name | Type | Description |
---|---|---|
0 | address | - |
renounceOwnership​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
renounceOwnership()
- Function selector:
0x715018a6
function renounceOwnership() external nonpayable;
Leaves the contract without owner. It will not be possible to call onlyOwner
functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.
revokeOperator​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
revokeOperator(address,bool,bytes)
- Function selector:
0x4521748e
function revokeOperator(
address operator,
bool notify,
bytes operatorNotificationData
) external nonpayable;
Removes the operator
address as an operator of callers tokens, disallowing it to send any amount of tokens on behalf of the token owner (the caller of the function msg.sender
). See also authorizedAmountFor
.
Parameters​
Name | Type | Description |
---|---|---|
operator | address | The address to revoke as an operator. |
notify | bool | Boolean indicating whether to notify the operator or not. |
operatorNotificationData | bytes | The data to notify the operator about via LSP1. |
setData​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
setData(bytes32,bytes)
- Function selector:
0x7f23690c
Note for developers: despite the fact that this function is set as payable
, if the function is not intended to receive value (= native tokens), an additional check should be implemented to ensure that msg.value
sent was equal to 0.
function setData(bytes32 dataKey, bytes dataValue) external payable;
Setting the following data key value pair in the ERC725Y storage. Data key: dataKey
, data value: dataValue
.
Sets a single bytes value dataValue
in the ERC725Y storage for a specific data key dataKey
. The function is marked as payable to enable flexibility on child contracts. For instance to implement a fee mechanism for setting specific data.
Requirements:
- SHOULD only be callable by the
owner
.
Emitted events:
DataChanged
event.
Parameters​
Name | Type | Description |
---|---|---|
dataKey | bytes32 | The data key for which to set a new value. |
dataValue | bytes | The new bytes value to set. |
setDataBatch​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
setDataBatch(bytes32[],bytes[])
- Function selector:
0x97902421
Note for developers: despite the fact that this function is set as payable
, if the function is not intended to receive value (= native tokens), an additional check should be implemented to ensure that msg.value
sent was equal to 0.
function setDataBatch(bytes32[] dataKeys, bytes[] dataValues) external payable;
Setting the following data key value pairs in the ERC725Y storage. Data keys: dataKeys
, data values: dataValues
.
Batch data setting function that behaves the same as setData
but allowing to set multiple data key/value pairs in the ERC725Y storage in the same transaction.
Requirements:
- SHOULD only be callable by the
owner
of the contract.
Emitted events:
DataChanged
event for each data key/value pair set.
Parameters​
Name | Type | Description |
---|---|---|
dataKeys | bytes32[] | An array of data keys to set bytes values for. |
dataValues | bytes[] | An array of bytes values to set for each dataKeys . |
supportsInterface​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
supportsInterface(bytes4)
- Function selector:
0x01ffc9a7
function supportsInterface(bytes4 interfaceId) external view returns (bool);
Returns true if this contract implements the interface defined by interfaceId
. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.
Parameters​
Name | Type | Description |
---|---|---|
interfaceId | bytes4 | - |
Returns​
Name | Type | Description |
---|---|---|
0 | bool | - |
totalSupply​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
totalSupply()
- Function selector:
0x18160ddd
function totalSupply() external view returns (uint256);
Returns the number of existing tokens that have been minted in this contract.
Returns​
Name | Type | Description |
---|---|---|
0 | uint256 | The number of existing tokens. |
transfer​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
transfer(address,address,uint256,bool,bytes)
- Function selector:
0x760d9bba
function transfer(
address from,
address to,
uint256 amount,
bool force,
bytes data
) external nonpayable;
Transfers an amount
of tokens from the from
address to the to
address and notify both sender and recipients via the LSP1 universalReceiver(...)
function. If the tokens are transferred by an operator on behalf of a token holder, the allowance for the operator will be decreased by amount
once the token transfer has been completed (See authorizedAmountFor
).
Parameters​
Name | Type | Description |
---|---|---|
from | address | The sender address. |
to | address | The recipient address. |
amount | uint256 | The amount of tokens to transfer. |
force | bool | When set to true , the to address CAN be any address. When set to false , the to address MUST be a contract that supports the LSP1 UniversalReceiver standard. |
data | bytes | Any additional data the caller wants included in the emitted event, and sent in the hooks of the from and to addresses. |
transferBatch​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
transferBatch(address[],address[],uint256[],bool[],bytes[])
- Function selector:
0x2d7667c9
function transferBatch(
address[] from,
address[] to,
uint256[] amount,
bool[] force,
bytes[] data
) external nonpayable;
Same as transfer(...)
but transfer multiple tokens based on the arrays of from
, to
, amount
.
Parameters​
Name | Type | Description |
---|---|---|
from | address[] | An array of sending addresses. |
to | address[] | An array of receiving addresses. |
amount | uint256[] | An array of amount of tokens to transfer for each from -> to transfer. |
force | bool[] | For each transfer, when set to true , the to address CAN be any address. When set to false , the to address MUST be a contract that supports the LSP1 UniversalReceiver standard. |
data | bytes[] | An array of additional data the caller wants included in the emitted event, and sent in the hooks to from and to addresses. |
transferOwnership​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Function signature:
transferOwnership(address)
- Function selector:
0xf2fde38b
function transferOwnership(address newOwner) external nonpayable;
Transfers ownership of the contract to a new account (newOwner
). Can only be called by the current owner.
Parameters​
Name | Type | Description |
---|---|---|
newOwner | address | - |
Internal Methods​
Any method labeled as internal
serves as utility function within the contract. They can be used when writing solidity contracts that inherit from this contract. These methods can be extended or modified by overriding their internal behavior to suit specific needs.
Internal functions cannot be called externally, whether from other smart contracts, dApp interfaces, or backend services. Their restricted accessibility ensures that they remain exclusively available within the context of the current contract, promoting controlled and encapsulated usage of these internal utilities.
_checkOwner​
function _checkOwner() internal view;
Throws if the sender is not the owner.
_setOwner​
function _setOwner(address newOwner) internal nonpayable;
Changes the owner if newOwner
and oldOwner are different
This pattern is useful in inheritance.
_getData​
function _getData(bytes32 dataKey) internal view returns (bytes dataValue);
Read the value stored under a specific dataKey
inside the underlying ERC725Y storage,
represented as a mapping of bytes32
data keys mapped to their bytes
data values.
mapping(bytes32 => bytes) _store
Parameters​
Name | Type | Description |
---|---|---|
dataKey | bytes32 | A bytes32 data key to read the associated bytes value from the store. |
Returns​
Name | Type | Description |
---|---|---|
dataValue | bytes | The bytes value associated with the given dataKey in the ERC725Y storage. |
_setData​
function _setData(bytes32 dataKey, bytes dataValue) internal nonpayable;
Save gas by emitting the DataChanged
event with only the first 256 bytes of dataValue
_updateOperator​
function _updateOperator(
address tokenOwner,
address operator,
uint256 allowance,
bool notified,
bytes operatorNotificationData
) internal nonpayable;
Changes token amount
the operator
has access to from tokenOwner
tokens.
If the amount is zero the operator is removed from the list of operators, otherwise he is added to the list of operators.
If the amount is zero then the operator is being revoked, otherwise the operator amount is being modified.
Parameters​
Name | Type | Description |
---|---|---|
tokenOwner | address | The address that will give operator an allowance for on its balance. |
operator | address | @param operatorNotificationData The data to send to the universalReceiver function of the operator in case of notifying |
allowance | uint256 | The maximum amount of token that operator can spend from the tokenOwner 's balance. |
notified | bool | Boolean indicating whether the operator has been notified about the change of allowance |
operatorNotificationData | bytes | The data to send to the universalReceiver function of the operator in case of notifying |
_mint​
Any logic in the:
-
_beforeTokenTransfer
function will run before updating the balances. -
_afterTokenTransfer
function will run after updating the balances, but before notifying the recipient via LSP1.
function _mint(
address to,
uint256 amount,
bool force,
bytes data
) internal nonpayable;
Mints amount
of tokens and transfers it to to
.
Emitted events:
Transfer
event withaddress(0)
asfrom
.
Parameters​
Name | Type | Description |
---|---|---|
to | address | The address to mint tokens for. |
amount | uint256 | The amount of tokens to mint. |
force | bool | A boolean that describe if transfer to a to address that does not support LSP1 is allowed or not. |
data | bytes | Additional data the caller wants included in the emitted Transfer event, and sent in the LSP1 hook to the to address. |
_burn​
Any logic in the:
-
_beforeTokenTransfer
function will run before updating the balances. -
_afterTokenTransfer
function will run after updating the balances, but before notifying the sender via LSP1.
In dApps, you can know which address is burning tokens by listening for the Transfer
event and filter with the zero address as to
.
function _burn(address from, uint256 amount, bytes data) internal nonpayable;
Burns (= destroys) amount
of tokens, decrease the from
balance. This is done by sending them to the zero address.
Both the sender and recipient will be notified of the token transfer through the LSP1 universalReceiver
function, if they are contracts that support the LSP1 interface. Their universalReceiver
function will receive
all the parameters in the calldata packed encoded.
Emitted events:
Transfer
event withaddress(0)
as theto
address
Parameters​
Name | Type | Description |
---|---|---|
from | address | The address to burn tokens from its balance. |
amount | uint256 | The amount of tokens to burn. |
data | bytes | Additional data the caller wants included in the emitted event, and sent in the LSP1 hook to the from and to address. |
_spendAllowance​
function _spendAllowance(
address operator,
address tokenOwner,
uint256 amountToSpend
) internal nonpayable;
Spend amountToSpend
from the operator
's authorized on behalf of the tokenOwner
.
Parameters​
Name | Type | Description |
---|---|---|
operator | address | The address of the operator to decrease the allowance of. |
tokenOwner | address | The address that granted an allowance on its balance to operator . |
amountToSpend | uint256 | The amount of tokens to substract in allowance of operator . |
_transfer​
Any logic in the:
-
_beforeTokenTransfer
function will run before updating the balances. -
_afterTokenTransfer
function will run after updating the balances, but before notifying the sender/recipient via LSP1.
function _transfer(
address from,
address to,
uint256 amount,
bool force,
bytes data
) internal nonpayable;
Transfer tokens from from
to to
by decreasing the balance of from
by -amount
and increasing the balance
of to
by +amount
.
Both the sender and recipient will be notified of the token transfer through the LSP1 universalReceiver
function, if they are contracts that support the LSP1 interface. Their universalReceiver
function will receive
all the parameters in the calldata packed encoded.
Emitted events:
Transfer
event.
Parameters​
Name | Type | Description |
---|---|---|
from | address | The address to decrease the balance. |
to | address | The address to increase the balance. |
amount | uint256 | The amount of tokens to transfer from from to to . |
force | bool | A boolean that describe if transfer to a to address that does not support LSP1 is allowed or not. |
data | bytes | Additional data the caller wants included in the emitted event, and sent in the LSP1 hook to the from and to address. |
_beforeTokenTransfer​
function _beforeTokenTransfer(
address from,
address to,
uint256 amount,
bytes data
) internal nonpayable;
Hook that is called before any token transfer, including minting and burning. Allows to run custom logic before updating balances and notifiying sender/recipient by overriding this function.
Parameters​
Name | Type | Description |
---|---|---|
from | address | The sender address |
to | address | The recipient address |
amount | uint256 | The amount of token to transfer |
data | bytes | The data sent alongside the transfer |
_afterTokenTransfer​
function _afterTokenTransfer(
address from,
address to,
uint256 amount,
bytes data
) internal nonpayable;
Hook that is called after any token transfer, including minting and burning. Allows to run custom logic after updating balances, but before notifiying sender/recipient by overriding this function.
Parameters​
Name | Type | Description |
---|---|---|
from | address | The sender address |
to | address | The recipient address |
amount | uint256 | The amount of token to transfer |
data | bytes | The data sent alongside the transfer |
_notifyTokenReceiver​
function _notifyTokenReceiver(
address to,
bool force,
bytes lsp1Data
) internal nonpayable;
Attempt to notify the token receiver to
about the amount
tokens being received.
This is done by calling its universalReceiver
function with the _TYPEID_LSP7_TOKENSRECIPIENT
as typeId, if to
is a contract that supports the LSP1 interface.
If to
is is an EOA or a contract that does not support the LSP1 interface, the behaviour will depend on the force
boolean flag.
-
if
force
is set totrue
, nothing will happen and no notification will be sent. -
if
force
is set to `false, the transaction will revert.
Parameters​
Name | Type | Description |
---|---|---|
to | address | The address to call the universalReceiver function on. |
force | bool | A boolean that describe if transfer to a to address that does not support LSP1 is allowed or not. |
lsp1Data | bytes | The data to be sent to the to address in the universalReceiver(...) call. |
_supportsInterfaceInERC165Extension​
function _supportsInterfaceInERC165Extension(
bytes4 interfaceId
) internal view returns (bool);
Returns whether the interfaceId being checked is supported in the extension of the
supportsInterface
selector.
To be used by extendable contracts wishing to extend the ERC165 interfaceIds originally
supported by reading whether the interfaceId queried is supported in the supportsInterface
extension if the extension is set, if not it returns false.
_getExtensionAndForwardValue​
function _getExtensionAndForwardValue(
bytes4 functionSelector
) internal view returns (address, bool);
Returns the extension address stored under the following data key:
-
_LSP17_EXTENSION_PREFIX
+<bytes4>
(Check [LSP2-ERC725YJSONSchema] for encoding the data key). -
If no extension is stored, returns the address(0).
-
we do not check that payable bool as in lsp7 standard we will always forward the value to the extension
_fallbackLSP17Extendable​
The LSP7 Token contract should not hold any native tokens. Any native tokens received by the contract
will be forwarded to the extension address mapped to the selector from msg.sig
.
function _fallbackLSP17Extendable(
bytes callData
) internal nonpayable returns (bytes);
Forwards the call with the received value to an extension mapped to a function selector.
Calls _getExtensionAndForwardValue
to get the address of the extension mapped to the function selector being
called on the account. If there is no extension, the address(0) will be returned.
Forwards the value if the extension is payable.
Reverts if there is no extension for the function being called.
If there is an extension for the function selector being called, it calls the extension with the
CALL opcode, passing the msg.data
appended with the 20 bytes of the msg.sender
and
32 bytes of the msg.value
Events​
AuthorizedOperator​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Event signature:
AuthorizedOperator(address,address,uint256,bytes)
- Event topic hash:
0x0744b3de98efaff36606a0e67662fb8697adb0ed49d90730bdb4bbf885f30597
event AuthorizedOperator(address indexed operator, address indexed tokenOwner, uint256 indexed amount, bytes operatorNotificationData);
Emitted when tokenOwner
enables operator
for amount
tokens.
Parameters​
Name | Type | Description |
---|---|---|
operator indexed | address | The address authorized as an operator |
tokenOwner indexed | address | The token owner |
amount indexed | uint256 | The amount of tokens operator address has access to from tokenOwner |
operatorNotificationData | bytes | The data to notify the operator about via LSP1. |
DataChanged​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Event signature:
DataChanged(bytes32,bytes)
- Event topic hash:
0xece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2
event DataChanged(bytes32 indexed dataKey, bytes dataValue);
The following data key/value pair has been changed in the ERC725Y storage: Data key: dataKey
, data value: dataValue
.
Emitted when data at a specific dataKey
was changed to a new value dataValue
.
Parameters​
Name | Type | Description |
---|---|---|
dataKey indexed | bytes32 | The data key for which a bytes value is set. |
dataValue | bytes | The value to set for the given data key. |
OwnershipTransferred​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Event signature:
OwnershipTransferred(address,address)
- Event topic hash:
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
Parameters​
Name | Type | Description |
---|---|---|
previousOwner indexed | address | - |
newOwner indexed | address | - |
RevokedOperator​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Event signature:
RevokedOperator(address,address,bool,bytes)
- Event topic hash:
0x66015c8835ee443e5bc280176609215a5035da4bae05bdef994596d7e43aae22
event RevokedOperator(address indexed operator, address indexed tokenOwner, bool notified, bytes operatorNotificationData);
Emitted when tokenOwner
disables operator
for amount
tokens and set its authorizedAmountFor(...)
to 0
.
Parameters​
Name | Type | Description |
---|---|---|
operator indexed | address | The address revoked from operating |
tokenOwner indexed | address | The token owner |
notified | bool | Bool indicating whether the operator has been notified or not |
operatorNotificationData | bytes | The data to notify the operator about via LSP1. |
Transfer​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Event signature:
Transfer(address,address,address,uint256,bool,bytes)
- Event topic hash:
0x3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a6
event Transfer(address indexed operator, address indexed from, address indexed to, uint256 amount, bool force, bytes data);
Emitted when the from
transferred successfully amount
of tokens to to
.
Parameters​
Name | Type | Description |
---|---|---|
operator indexed | address | The address of the operator that executed the transfer. |
from indexed | address | The address which tokens were sent from (balance decreased by -amount ). |
to indexed | address | The address that received the tokens (balance increased by +amount ). |
amount | uint256 | The amount of tokens transferred. |
force | bool | if the transferred enforced the to recipient address to be a contract that implements the LSP1 standard or not. |
data | bytes | Any additional data included by the caller during the transfer, and sent in the LSP1 hooks to the from and to addresses. |
Errors​
ERC725Y_DataKeysValuesEmptyArray​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
ERC725Y_DataKeysValuesEmptyArray()
- Error hash:
0x97da5f95
error ERC725Y_DataKeysValuesEmptyArray();
Reverts when one of the array parameter provided to setDataBatch
function is an empty array.
ERC725Y_DataKeysValuesLengthMismatch​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
ERC725Y_DataKeysValuesLengthMismatch()
- Error hash:
0x3bcc8979
error ERC725Y_DataKeysValuesLengthMismatch();
Reverts when there is not the same number of elements in the datakeys
and dataValues
array parameters provided when calling the setDataBatch
function.
ERC725Y_MsgValueDisallowed​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
ERC725Y_MsgValueDisallowed()
- Error hash:
0xf36ba737
error ERC725Y_MsgValueDisallowed();
Reverts when sending value to the setData
or setDataBatch
function.
InvalidExtensionAddress​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
InvalidExtensionAddress(bytes)
- Error hash:
0x42bfe79f
error InvalidExtensionAddress(bytes storedData);
reverts when the bytes retrieved from the LSP17 data key is not a valid address (not 20 bytes)
Parameters​
Name | Type | Description |
---|---|---|
storedData | bytes | - |
InvalidFunctionSelector​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
InvalidFunctionSelector(bytes)
- Error hash:
0xe5099ee3
error InvalidFunctionSelector(bytes data);
reverts when the contract is called with a function selector not valid (less than 4 bytes of data)
Parameters​
Name | Type | Description |
---|---|---|
data | bytes | - |
LSP4TokenNameNotEditable​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP4TokenNameNotEditable()
- Error hash:
0x85c169bd
error LSP4TokenNameNotEditable();
Reverts when trying to edit the data key LSP4TokenName
after the digital asset contract has been deployed. The LSP4TokenName
data key is located inside the ERC725Y Data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed.
LSP4TokenSymbolNotEditable​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP4TokenSymbolNotEditable()
- Error hash:
0x76755b38
error LSP4TokenSymbolNotEditable();
Reverts when trying to edit the data key LSP4TokenSymbol
after the digital asset contract has been deployed. The LSP4TokenSymbol
data key is located inside the ERC725Y Data key-value store of the digital asset contract. It can be set only once inside the constructor/initializer when the digital asset contract is being deployed.
LSP7AmountExceedsAuthorizedAmount​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7AmountExceedsAuthorizedAmount(address,uint256,address,uint256)
- Error hash:
0xf3a6b691
error LSP7AmountExceedsAuthorizedAmount(
address tokenOwner,
uint256 authorizedAmount,
address operator,
uint256 amount
);
reverts when operator
of tokenOwner
send an amount
of tokens larger than the authorizedAmount
.
Parameters​
Name | Type | Description |
---|---|---|
tokenOwner | address | - |
authorizedAmount | uint256 | - |
operator | address | - |
amount | uint256 | - |
LSP7AmountExceedsBalance​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7AmountExceedsBalance(uint256,address,uint256)
- Error hash:
0x08d47949
error LSP7AmountExceedsBalance(
uint256 balance,
address tokenOwner,
uint256 amount
);
reverts when sending an amount
of tokens larger than the current balance
of the tokenOwner
.
Parameters​
Name | Type | Description |
---|---|---|
balance | uint256 | - |
tokenOwner | address | - |
amount | uint256 | - |
LSP7CannotSendToSelf​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7CannotSendToSelf()
- Error hash:
0xb9afb000
error LSP7CannotSendToSelf();
reverts when specifying the same address for from
or to
in a token transfer.
LSP7CannotSendWithAddressZero​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7CannotSendWithAddressZero()
- Error hash:
0xd2d5ec30
error LSP7CannotSendWithAddressZero();
reverts when trying to:
-
mint tokens to the zero address.
-
burn tokens from the zero address.
-
transfer tokens from or to the zero address.
LSP7CannotUseAddressZeroAsOperator​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7CannotUseAddressZeroAsOperator()
- Error hash:
0x6355e766
error LSP7CannotUseAddressZeroAsOperator();
reverts when trying to set the zero address as an operator.
LSP7DecreasedAllowanceBelowZero​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7DecreasedAllowanceBelowZero()
- Error hash:
0x0ef76c35
error LSP7DecreasedAllowanceBelowZero();
Reverts when trying to decrease an operator's allowance to more than its current allowance.
LSP7InvalidTransferBatch​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7InvalidTransferBatch()
- Error hash:
0x263eee8d
error LSP7InvalidTransferBatch();
reverts when the array parameters used in transferBatch
have different lengths.
LSP7NotifyTokenReceiverContractMissingLSP1Interface​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7NotifyTokenReceiverContractMissingLSP1Interface(address)
- Error hash:
0xa608fbb6
error LSP7NotifyTokenReceiverContractMissingLSP1Interface(
address tokenReceiver
);
reverts if the tokenReceiver
does not implement LSP1 when minting or transferring tokens with bool force
set as false
.
Parameters​
Name | Type | Description |
---|---|---|
tokenReceiver | address | - |
LSP7NotifyTokenReceiverIsEOA​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7NotifyTokenReceiverIsEOA(address)
- Error hash:
0x26c247f4
error LSP7NotifyTokenReceiverIsEOA(address tokenReceiver);
reverts if the tokenReceiver
is an EOA when minting or transferring tokens with bool force
set as false
.
Parameters​
Name | Type | Description |
---|---|---|
tokenReceiver | address | - |
LSP7TokenContractCannotHoldValue​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7TokenContractCannotHoldValue()
- Error hash:
0x388f5adc
error LSP7TokenContractCannotHoldValue();
LSP7 contract cannot receive native tokens.
Error occurs when sending native tokens to the LSP7 contract without sending any data. E.g. Sending value without passing a bytes4 function selector to call a LSP17 Extension.
LSP7TokenOwnerCannotBeOperator​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
LSP7TokenOwnerCannotBeOperator()
- Error hash:
0xdab75047
error LSP7TokenOwnerCannotBeOperator();
reverts when trying to authorize or revoke the token's owner as an operator.
NoExtensionFoundForFunctionSelector​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
NoExtensionFoundForFunctionSelector(bytes4)
- Error hash:
0xbb370b2b
error NoExtensionFoundForFunctionSelector(bytes4 functionSelector);
reverts when there is no extension for the function selector being called with
Parameters​
Name | Type | Description |
---|---|---|
functionSelector | bytes4 | - |
OperatorAllowanceCannotBeIncreasedFromZero​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
OperatorAllowanceCannotBeIncreasedFromZero(address)
- Error hash:
0xcba6e977
error OperatorAllowanceCannotBeIncreasedFromZero(address operator);
Reverts when token owner call increaseAllowance
for an operator that does not have any allowance
Parameters​
Name | Type | Description |
---|---|---|
operator | address | - |
OwnableCallerNotTheOwner​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
OwnableCallerNotTheOwner(address)
- Error hash:
0xbf1169c5
error OwnableCallerNotTheOwner(address callerAddress);
Reverts when only the owner is allowed to call the function.
Parameters​
Name | Type | Description |
---|---|---|
callerAddress | address | The address that tried to make the call. |
OwnableCannotSetZeroAddressAsOwner​
- Specification details: LSP-7-DigitalAsset
- Solidity implementation:
LSP7DigitalAsset.sol
- Error signature:
OwnableCannotSetZeroAddressAsOwner()
- Error hash:
0x1ad8836c
error OwnableCannotSetZeroAddressAsOwner();
Reverts when trying to set address(0)
as the contract owner when deploying the contract, initializing it or transferring ownership of the contract.