This is outdated: The ERC-20 is here: ethereum/EIPs#20
function totalSupply() constant returns (uint256 supply)
Get the total coin supply
function balanceOf(address _address) constant returns (uint256 balance)
Get the account balance of another account with address _address
function transfer(address _to, uint256 _value) returns (bool _success)
Send _value
amount of coins to address _to
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
Send _value
amount of coins from address _from
to address _to
The transferFrom
method is used for a "direct debit" workflow, allowing contracts to send coins 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:
function approve(address _address) returns (bool success)
Allow _address
to direct debit from your account with full custody. Only implement if absolutely required and use carefully. See approveOnce
below for a more limited method.
function unapprove(address _address) returns (bool success)
Unapprove address _address
to direct debit from your account if it was previously approved. Must reset both one-time and full custody approvals.
function isApprovedFor(address _target, address _proxy) constant returns (bool success)
Returns 1 if _proxy
is allowed to direct debit from _target
function approveOnce(address _address, uint256 _maxValue) returns (bool success)
Makes a one-time approval for _address
to send a maximum amount of currency equal to _maxValue
function isApprovedOnceFor(address _target, address _proxy) returns (uint256 maxValue)
Returns _maxValue
if _proxy
is allowed to direct debit the returned maxValue
from address _target
only once. The approval must be reset on any transfer by _proxy
of _maxValue
or less.
event Transfer(address indexed _from, address indexed _to, uint256 _value)
Triggered when tokens are transferred.
event AddressApproval(address indexed _address, address indexed _proxy, bool _result)
Triggered when an _address
approves _proxy
to direct debit from their account.
event AddressApprovalOnce(address indexed _address, address indexed _proxy, uint256 _value)
Triggered when an _address
approves _proxy
to direct debit from their account only once for a maximum of _value
The approval functionality turns many two-transaction scenarios into one-transaction scenarios. Consider Gnosis. As a user in 2016, I have seen the Gnosis contract code and understand that it cannot steal my money. Ethereum guarantees that the contract is immutable, so it is safe for me to give this contract access to my funds. When I want to buy shares, the Gnosis contracts can transfer the amount of funds I specified directly into the pool for the desired prediction market. Without approval, I'd have to transfer funds to Gnosis then buy shares.
The latter flow requires every contract that needs user funds to build its own bank of funds. The bookkeeping for who owns which tokens shouldn't have to be replicated in every contract. Putting approval logic lets contracts assume they can draw funds from the user's token balance without having to do any bookkeeping. If the transfer succeeds, the transaction proceeds. If the transfer fails, the transaction fails. The contracts become considerably simpler.
Yes, approval can be replaced by transferring funds to a contract instead. It is significantly more cumbersome and trivial to avoid.