New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ERC721 full implementation #803
Merged
Merged
Changes from all commits
Commits
Show all changes
32 commits
Select commit
Hold shift + click to select a range
1192e68
Rename current ERC721 implementation to BaseERC721
facuspagnuolo ca163a8
Implement ERC721 optional & approveAll functionality
facuspagnuolo 71cbc51
Support for new ERC721 interface
spalladino 3745025
Add more tests for ERC721
spalladino 559df81
Implement suggestions by @dekz
spalladino d726c79
Update comments in ERC721 contracts
spalladino 54a1d2e
Implement tokensByIndex extension
spalladino 851685c
Add default implementation for metadata URI
spalladino 3cef880
Allow operators to call approve on a token
spalladino 6f180a6
Remove gas stipend restriction in call to 721 receiver
spalladino 6fbe771
Remove deprecated implementation
spalladino 626742e
Add notice to isContract helper on constract constructors
spalladino 95a1f9a
Change natspec delimiters for consistency
spalladino 15f9556
Minor linting fixes
spalladino b332995
Add constant modifier to ERC721_RECEIVED magic value
spalladino f4748da
Use 4-params safeTransferFrom for implementing the 3-params overload
spalladino fb4f728
Minor text changes in natspec comments
spalladino 6b98e4e
Use address(0) instead of 0 or 0x0
spalladino 3f2ea8a
Use if-statements instead of boolean one-liners for clarity
spalladino 74db03b
Keep ownedTokensCount state var in sync in full ERC721 implementation
spalladino 981c6f7
Fix incorrect comparison when burning ERC721 tokens with metadata
spalladino 73b77ae
Use address(0) instead of 0 in one more place in ERC721
spalladino eee5b0e
Throw when querying balance for the zero address
spalladino 9deb637
Update links to approved version of EIP721
spalladino fe6e4ff
Use explicit size for uint
spalladino 4836279
Remove unneeded internal function in ERC721
spalladino 619ae84
Use underscore instead of 'do' prefix for internal methods in ERC721
spalladino 2e593f2
Fix failing test due to events reordering in ERC721 safe transfer
spalladino 6c09d20
Fix bug introduced in 74db03ba06
spalladino 37929c8
Remove do prefix for internal setTokenUri method
spalladino 3676b55
Allow transfers to self in ERC721
spalladino 7815cc5
Merge branch 'master' into feature/full_erc721
frangio File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
pragma solidity ^0.4.18; | ||
|
||
/** | ||
* Utility library of inline functions on addresses | ||
*/ | ||
library AddressUtils { | ||
|
||
/** | ||
* Returns whether there is code in the target address | ||
* @dev This function will return false if invoked during the constructor of a contract, | ||
* as the code is not actually created until after the constructor finishes. | ||
* @param addr address address to check | ||
* @return whether there is code in the target address | ||
*/ | ||
function isContract(address addr) internal view returns (bool) { | ||
uint256 size; | ||
assembly { size := extcodesize(addr) } | ||
return size > 0; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
pragma solidity ^0.4.18; | ||
|
||
import "../token/ERC721/ERC721BasicToken.sol"; | ||
|
||
/** | ||
* @title ERC721BasicTokenMock | ||
* This mock just provides a public mint and burn functions for testing purposes | ||
*/ | ||
contract ERC721BasicTokenMock is ERC721BasicToken { | ||
function mint(address _to, uint256 _tokenId) public { | ||
super._mint(_to, _tokenId); | ||
} | ||
|
||
function burn(uint256 _tokenId) public { | ||
super._burn(ownerOf(_tokenId), _tokenId); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
pragma solidity ^0.4.18; | ||
|
||
import "../token/ERC721/ERC721Receiver.sol"; | ||
|
||
contract ERC721ReceiverMock is ERC721Receiver { | ||
bytes4 retval; | ||
bool reverts; | ||
|
||
event Received(address _address, uint256 _tokenId, bytes _data, uint256 _gas); | ||
|
||
function ERC721ReceiverMock(bytes4 _retval, bool _reverts) public { | ||
retval = _retval; | ||
reverts = _reverts; | ||
} | ||
|
||
function onERC721Received(address _address, uint256 _tokenId, bytes _data) public returns(bytes4) { | ||
require(!reverts); | ||
Received(_address, _tokenId, _data, msg.gas); | ||
return retval; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
pragma solidity ^0.4.18; | ||
|
||
import "./ERC721.sol"; | ||
|
||
/** | ||
* @title ERC-721 methods shipped in OpenZeppelin v1.7.0, removed in the latest version of the standard | ||
* @dev Only use this interface for compatibility with previously deployed contracts | ||
* @dev Use ERC721 for interacting with new contracts which are standard-compliant | ||
*/ | ||
contract DeprecatedERC721 is ERC721 { | ||
function takeOwnership(uint256 _tokenId) public; | ||
function transfer(address _to, uint256 _tokenId) public; | ||
function tokensOf(address _owner) public view returns (uint256[]); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,30 @@ | ||
pragma solidity ^0.4.18; | ||
|
||
import "./ERC721Basic.sol"; | ||
|
||
/** | ||
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension | ||
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md | ||
*/ | ||
contract ERC721Enumerable is ERC721Basic { | ||
function totalSupply() public view returns (uint256); | ||
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId); | ||
function tokenByIndex(uint256 _index) public view returns (uint256); | ||
} | ||
|
||
/** | ||
* @title ERC721 interface | ||
* @dev see https://github.com/ethereum/eips/issues/721 | ||
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension | ||
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md | ||
*/ | ||
contract ERC721 { | ||
event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); | ||
event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); | ||
contract ERC721Metadata is ERC721Basic { | ||
function name() public view returns (string _name); | ||
function symbol() public view returns (string _symbol); | ||
function tokenURI(uint256 _tokenId) public view returns (string); | ||
} | ||
|
||
function balanceOf(address _owner) public view returns (uint256 _balance); | ||
function ownerOf(uint256 _tokenId) public view returns (address _owner); | ||
function transfer(address _to, uint256 _tokenId) public; | ||
function approve(address _to, uint256 _tokenId) public; | ||
function takeOwnership(uint256 _tokenId) public; | ||
/** | ||
* @title ERC-721 Non-Fungible Token Standard, full implementation interface | ||
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md | ||
*/ | ||
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
pragma solidity ^0.4.18; | ||
|
||
/** | ||
* @title ERC721 Non-Fungible Token Standard basic interface | ||
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md | ||
*/ | ||
contract ERC721Basic { | ||
event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); | ||
event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); | ||
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); | ||
|
||
function balanceOf(address _owner) public view returns (uint256 _balance); | ||
function ownerOf(uint256 _tokenId) public view returns (address _owner); | ||
function exists(uint256 _tokenId) public view returns (bool _exists); | ||
|
||
function approve(address _to, uint256 _tokenId) public; | ||
function getApproved(uint256 _tokenId) public view returns (address _operator); | ||
|
||
function setApprovalForAll(address _operator, bool _approved) public; | ||
function isApprovedForAll(address _owner, address _operator) public view returns (bool); | ||
|
||
function transferFrom(address _from, address _to, uint256 _tokenId) public; | ||
function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; | ||
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public; | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess the linter will cry if you don't make visibility explicit here