From 20706fb8e21c398fafef5c4b5c075ef7974bdcaf Mon Sep 17 00:00:00 2001 From: Fabian Vogelsteller Date: Wed, 17 May 2017 10:51:09 +0200 Subject: [PATCH] added changes and moved method description above the func declaration --- EIPS/eip-token-standard.md | 68 +++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/EIPS/eip-token-standard.md b/EIPS/eip-token-standard.md index c3152b99..40f65ed1 100644 --- a/EIPS/eip-token-standard.md +++ b/EIPS/eip-token-standard.md @@ -1,10 +1,11 @@ ## Preamble - EIP: (I Suggest 20) - Title: + EIP: 20 + Title: ERC-20 Token Standard Author: Fabian Vogelsteller , Vitalik Buterin - Type: Informational - Status: Draft + Type: Standard + Category: ERC + Status: Accepted Created: 2015-11-19 @@ -15,8 +16,8 @@ A standard interface for tokens. ## Abstract -The following standard allows for the implementation of a standard API for tokens within their smart contracts: -it primarily provides basic functionality to transfer tokens and allow them to be approved to be spend by another on-chain third party. +The following standard allows for the implementation of a standard API for tokens within smart contracts. +This standard provides basic functionality to transfer tokens, as well as allow tokens to be approved so they can be spent by another on-chain third party. ## Motivation @@ -29,91 +30,102 @@ A standard interface allows any tokens on Ethereum to be re-used by other applic ## Token ### Methods -**NOTE**: An important point is that callers should handle `false` from `returns (bool success)`. Callers should not assume that `false` is never returned! +**NOTE**: Callers should handle `false` from `returns (bool success)`. Callers should not assume that `false` is never returned! #### name +Returns the name of the token - e.g. `"MyToken"` + ``` js function name() constant returns (string name) ``` -Returns the name of the token. E.g. "MyToken" - #### symbol +Returns the symbol of the token. E.g. "MYT" + ``` js function symbol() constant returns (string symbol) ``` -Returns the symbol of the token. E.g. "MYT" #### decimals +Returns the number of decimals the token uses - e.g. `8`, means to divide the token amount by `100000000` to get its user representation. + ``` js function decimals() constant returns (uint8 decimals) ``` -Returns the number of decimals the token uses. E.g. 8, which would mean to divide the token amount by 100000000 to get its user representation. - #### totalSupply +Returns the total token supply. + ``` js function totalSupply() constant returns (uint256 totalSupply) ``` -Get the total token supply #### balanceOf +Returns the account balance of another account with address `_owner`. + ``` js function balanceOf(address _owner) constant returns (uint256 balance) ``` -Get the account balance of another account with address `_owner` #### transfer +Transfers `_value` amount of tokens to address `_to`. +The command should `throw` if the `_from` account balance has not enough tokens to spend. + + ``` js function transfer(address _to, uint256 _value) returns (bool success) ``` -Transfer `_value` amount of tokens to address `_to` #### transferFrom +Transfers `_value` amount of tokens from address `_from` to address `_to`. + +The `transferFrom` method is used for a withdraw workflow, allowing contracts to transfer tokens on your behalf. +This can be used for example to allow a contract to transfer tokens on your behalf and/or to charge fees in sub-currencies. +The command should `throw` unless the `_from` account has deliberately authorized the sender of the message via some mechanism. + ``` js function transferFrom(address _from, address _to, uint256 _value) returns (bool success) ``` -Send `_value` amount of tokens from address `_from` to address `_to` - -The `transferFrom` method is used for a withdraw workflow, allowing contracts to send tokens on your behalf, for example to "deposit" to a contract address and/or to charge fees in sub-currencies; the command should fail unless the `_from` account has deliberately authorized the sender of the message via some mechanism; we propose these standardized APIs for approval: #### approve +Allows `_spender` to withdraw from your account multiple times, up to the `_value` amount. If this function is called again it overwrites the current allowance with `_value`. + +**NOTE**: To prevent attack vectors like the one [described here](https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/) and discussed [here](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729), +make sure to force users set the allowance to `0` before setting it to another value for the same spender. + ``` js function approve(address _spender, uint256 _value) returns (bool success) ``` -Allow _spender to withdraw from your account, multiple times, up to the _value amount. If this function is called again it overwrites the current allowance with _value. -To prevent attack vectors like the one described here: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ -make sure to set the allowance to 0 before setting it to another value for the same spender. - #### allowance +Returns the amount which `_spender` is still allowed to withdraw from `_owner`. + ``` js function allowance(address _owner, address _spender) constant returns (uint256 remaining) ``` -Returns the amount which `_spender` is still allowed to withdraw from `_owner` ### Events @@ -121,32 +133,34 @@ Returns the amount which `_spender` is still allowed to withdraw from `_owner` #### Transfer +Triggered when tokens are transferred. + ``` js event Transfer(address indexed _from, address indexed _to, uint256 _value) ``` -Triggered when tokens are transferred. #### Approval +Triggered when `approve(address _spender, uint256 _value)` is called. + ``` js event Approval(address indexed _owner, address indexed _spender, uint256 _value) ``` -Triggered whenever `approve(address _spender, uint256 _value)` is called. ## Implementation -There are already plenty of ERC20-compliant tokens deployed on the Ethereum network and is the most widely used standard. +There are already plenty of ERC20-compliant tokens deployed on the Ethereum network. Different implementations have been written by various teams that have different trade-offs: from gas saving to improved security. #### Example implementations are available at - https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/StandardToken.sol - https://github.com/ConsenSys/Tokens/blob/master/Token_Contracts/contracts/StandardToken.sol -#### Implementation adding the force 0 before calling approve again: +#### Implementation of adding the force to 0 before calling "approve" again: - https://github.com/Giveth/minime/blob/master/MiniMeToken.sol ## Copyright