diff --git a/contracts/mocks/ERC20WithMetadataMock.sol b/contracts/mocks/ERC20WithMetadataMock.sol new file mode 100644 index 000000000..d54c22cc8 --- /dev/null +++ b/contracts/mocks/ERC20WithMetadataMock.sol @@ -0,0 +1,13 @@ +pragma solidity ^0.4.21; + +import "../token/ERC20/StandardToken.sol"; +import "../proposals/ERC1046/TokenMetadata.sol"; + + +contract ERC20WithMetadataMock is StandardToken, ERC20WithMetadata { + function ERC20WithMetadataMock(string _tokenURI) + ERC20WithMetadata(_tokenURI) + public + { + } +} diff --git a/contracts/proposals/.gitkeep b/contracts/proposals/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/contracts/proposals/ERC1046/TokenMetadata.sol b/contracts/proposals/ERC1046/TokenMetadata.sol new file mode 100644 index 000000000..10f9452ca --- /dev/null +++ b/contracts/proposals/ERC1046/TokenMetadata.sol @@ -0,0 +1,29 @@ +pragma solidity ^0.4.21; + +import "../../token/ERC20/ERC20.sol"; + + +/** + * @title ERC-1047 Token Metadata + * @dev See https://eips.ethereum.org/EIPS/eip-1046 + * @dev tokenURI must respond with a URI that implements https://eips.ethereum.org/EIPS/eip-1047 + * @dev TODO - update https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721.sol#L17 when 1046 is finalized + */ +contract ERC20TokenMetadata is ERC20 { + function tokenURI() external view returns (string); +} + + +contract ERC20WithMetadata is ERC20TokenMetadata { + string private tokenURI_ = ""; + + function ERC20WithMetadata(string _tokenURI) + public + { + tokenURI_ = _tokenURI; + } + + function tokenURI() external view returns (string) { + return tokenURI_; + } +} diff --git a/test/proposals/ERC1046/TokenMetadata.test.js b/test/proposals/ERC1046/TokenMetadata.test.js new file mode 100644 index 000000000..173f1c977 --- /dev/null +++ b/test/proposals/ERC1046/TokenMetadata.test.js @@ -0,0 +1,18 @@ +const ERC20WithMetadata = artifacts.require('ERC20WithMetadataMock'); + +require('chai') + .use(require('chai-as-promised')) + .should(); + +const metadataURI = 'https://example.com'; + +describe('ERC20WithMetadata', function () { + before(async function () { + this.token = await ERC20WithMetadata.new(metadataURI); + }); + + it('responds with the metadata', async function () { + const got = await this.token.tokenURI(); + got.should.eq(metadataURI); + }); +});