forked from DecentralizedClimateFoundation/DCIPs
70 lines
2.3 KiB
Markdown
70 lines
2.3 KiB
Markdown
|
---
|
||
|
eip: 5008
|
||
|
title: EIP-721 Nonce Extension
|
||
|
description: Add a `nonce` function to EIP-721.
|
||
|
author: Anders (@0xanders), Lance (@LanceSnow), Shrug <shrug@emojidao.org>
|
||
|
discussions-to: https://ethereum-magicians.org/t/eip5008-eip-721-nonce-and-metadata-update-extension/8925
|
||
|
status: Stagnant
|
||
|
type: Standards Track
|
||
|
category: ERC
|
||
|
created: 2022-04-10
|
||
|
requires: 165, 721
|
||
|
---
|
||
|
|
||
|
## Abstract
|
||
|
|
||
|
This standard is an extension of [EIP-721](./eip-721.md). It proposes adding a `nonce` function to EIP-721 tokens.
|
||
|
|
||
|
## Motivation
|
||
|
|
||
|
Some orders of NFT marketplaces have been attacked and the NFTs sold at a lower price than the current market floor price. This can happen when users transfer an NFT to another wallet and, later, back to the original wallet. This reactivates the order, which may list the token at a much lower price than the owner would have intended.
|
||
|
|
||
|
This EIP proposes adding a `nonce` property to EIP-721 tokens, and the `nonce` will be changed when a token is transferred. If a `nonce` is added to an order, the order can be checked to avoid attacks.
|
||
|
|
||
|
## Specification
|
||
|
|
||
|
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
|
||
|
|
||
|
```solidity
|
||
|
interface IERC5008 /* is IERC165 */ {
|
||
|
/// @notice Get the nonce of an NFT
|
||
|
/// Throws if `tokenId` is not a valid NFT
|
||
|
/// @param tokenId The id of the NFT
|
||
|
/// @return The nonce of the NFT
|
||
|
function nonce(uint256 tokenId) external view returns(uint256);
|
||
|
}
|
||
|
```
|
||
|
The `nonce(uint256 tokenId)` function MUST be implemented as `view`.
|
||
|
|
||
|
The `supportsInterface` method MUST return `true` when called with `0xce03fdab`.
|
||
|
|
||
|
## Rationale
|
||
|
|
||
|
At first `transferCount` was considered as function name, but there may some case to change the `nonce` besides transfer, such as important properties changed, then we changed `transferCount` to `nonce`.
|
||
|
|
||
|
## Backwards Compatibility
|
||
|
|
||
|
This standard is compatible with EIP-721.
|
||
|
|
||
|
## Test Cases
|
||
|
|
||
|
Test cases are included in [test.js](../assets/eip-5008/test/test.ts).
|
||
|
|
||
|
Run:
|
||
|
```sh
|
||
|
cd ../assets/eip-5008
|
||
|
npm install
|
||
|
npx hardhat test ./test/test.ts
|
||
|
```
|
||
|
|
||
|
## Reference Implementation
|
||
|
|
||
|
See [`ERC5008.sol`](../assets/eip-5008/contracts/ERC5008.sol).
|
||
|
|
||
|
## Security Considerations
|
||
|
|
||
|
No security issues found.
|
||
|
|
||
|
## Copyright
|
||
|
Copyright and related rights waived via [CC0](../LICENSE.md).
|