forked from DecentralizedClimateFoundation/DCIPs
113 lines
5.2 KiB
Solidity
113 lines
5.2 KiB
Solidity
|
// SPDX-License-Identifier: CC0-1.0
|
||
|
pragma solidity ^0.8.0;
|
||
|
|
||
|
import "IERC165.sol";
|
||
|
import "IERC721.sol";
|
||
|
|
||
|
/**
|
||
|
* @title ERC-3525 Semi-Fungible Token Standard
|
||
|
* @dev See https://eips.ethereum.org/EIPS/eip-3525
|
||
|
* Note: the ERC-165 identifier for this interface is 0xc97ae3d5.
|
||
|
*/
|
||
|
interface IERC3525 is IERC165, IERC721 {
|
||
|
/**
|
||
|
* @dev MUST emit when value of a token is transferred to another token with the same slot,
|
||
|
* including zero value transfers (_value == 0) as well as transfers when tokens are created
|
||
|
* (`_fromTokenId` == 0) or destroyed (`_toTokenId` == 0).
|
||
|
* @param _fromTokenId The token id to transfer value from
|
||
|
* @param _toTokenId The token id to transfer value to
|
||
|
* @param _value The transferred value
|
||
|
*/
|
||
|
event TransferValue( uint256 indexed _fromTokenId, uint256 indexed _toTokenId, uint256 _value);
|
||
|
|
||
|
/**
|
||
|
* @dev MUST emits when the approval value of a token is set or changed.
|
||
|
* @param _tokenId The token to approve
|
||
|
* @param _operator The operator to approve for
|
||
|
* @param _value The maximum value that `_operator` is allowed to manage
|
||
|
*/
|
||
|
event ApprovalValue( uint256 indexed _tokenId, address indexed _operator, uint256 _value);
|
||
|
|
||
|
/**
|
||
|
* @dev MUST emit when the slot of a token is set or changed.
|
||
|
* @param _tokenId The token of which slot is set or changed
|
||
|
* @param _oldSlot The previous slot of the token
|
||
|
* @param _newSlot The updated slot of the token
|
||
|
*/
|
||
|
event SlotChanged( uint256 indexed _tokenId, uint256 indexed _oldSlot, uint256 indexed _newSlot);
|
||
|
|
||
|
/**
|
||
|
* @notice Get the number of decimals the token uses for value - e.g. 6, means the user
|
||
|
* representation of the value of a token can be calculated by dividing it by 1,000,000.
|
||
|
* Considering the compatibility with third-party wallets, this function is defined as
|
||
|
* `valueDecimals()` instead of `decimals()` to avoid conflict with ERC20 tokens.
|
||
|
* @return The number of decimals for value
|
||
|
*/
|
||
|
function valueDecimals() external view returns (uint8);
|
||
|
|
||
|
/**
|
||
|
* @notice Get the value of a token.
|
||
|
* @param _tokenId The token for which to query the balance
|
||
|
* @return The value of `_tokenId`
|
||
|
*/
|
||
|
function balanceOf(uint256 _tokenId) external view returns (uint256);
|
||
|
|
||
|
/**
|
||
|
* @notice Get the slot of a token.
|
||
|
* @param _tokenId The identifier for a token
|
||
|
* @return The slot of the token
|
||
|
*/
|
||
|
function slotOf(uint256 _tokenId) external view returns (uint256);
|
||
|
|
||
|
/**
|
||
|
* @notice Allow an operator to manage the value of a token, up to the `_value` amount.
|
||
|
* @dev MUST revert unless caller is the current owner, an authorized operator, or the approved
|
||
|
* address for `_tokenId`.
|
||
|
* MUST emit ApprovalValue event.
|
||
|
* @param _tokenId The token to approve
|
||
|
* @param _operator The operator to be approved
|
||
|
* @param _value The maximum value of `_toTokenId` that `_operator` is allowed to manage
|
||
|
*/
|
||
|
function approve( uint256 _tokenId, address _operator, uint256 _value) external payable;
|
||
|
|
||
|
/**
|
||
|
* @notice Get the maximum value of a token that an operator is allowed to manage.
|
||
|
* @param _tokenId The token for which to query the allowance
|
||
|
* @param _operator The address of an operator
|
||
|
* @return The current approval value of `_tokenId` that `_operator` is allowed to manage
|
||
|
*/
|
||
|
function allowance(uint256 _tokenId, address _operator) external view returns (uint256);
|
||
|
|
||
|
/**
|
||
|
* @notice Transfer value from a specified token to another specified token with the same slot.
|
||
|
* @dev Caller MUST be the current owner, an authorized operator or an operator who has been
|
||
|
* approved the whole `_fromTokenId` or part of it.
|
||
|
* MUST revert if `_fromTokenId` or `_toTokenId` is zero token id or does not exist.
|
||
|
* MUST revert if slots of `_fromTokenId` and `_toTokenId` do not match.
|
||
|
* MUST revert if `_value` exceeds the balance of `_fromTokenId` or its allowance to the
|
||
|
* operator.
|
||
|
* MUST emit `TransferValue` event.
|
||
|
* @param _fromTokenId The token to transfer value from
|
||
|
* @param _toTokenId The token to transfer value to
|
||
|
* @param _value The transferred value
|
||
|
*/
|
||
|
function transferFrom( uint256 _fromTokenId, uint256 _toTokenId, uint256 _value) external payable;
|
||
|
|
||
|
/**
|
||
|
* @notice Transfer value from a specified token to an address. The caller should confirm that
|
||
|
* `_to` is capable of receiving ERC3525 tokens.
|
||
|
* @dev This function MUST create a new ERC3525 token with the same slot for `_to` to receive
|
||
|
* the transferred value.
|
||
|
* MUST revert if `_fromTokenId` is zero token id or does not exist.
|
||
|
* MUST revert if `_to` is zero address.
|
||
|
* MUST revert if `_value` exceeds the balance of `_fromTokenId` or its allowance to the
|
||
|
* operator.
|
||
|
* MUST emit `Transfer` and `TransferValue` events.
|
||
|
* @param _fromTokenId The token to transfer value from
|
||
|
* @param _to The address to transfer value to
|
||
|
* @param _value The transferred value
|
||
|
* @return ID of the new token created for `_to` which receives the transferred value
|
||
|
*/
|
||
|
function transferFrom( uint256 _fromTokenId, address _to, uint256 _value) external payable returns (uint256);
|
||
|
}
|