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
Some kind of
approve,approveOnceor cheque functionality is pretty essential. The basic use case is that contracts will sometimes want to charge fees in subcurrencies, and the callee needs a way to verify that a payment from the caller to the callee was made, and that this payment cannot be used for two calls. The simplest way of doing that is to have this approval/cheque mechanism, and have the callee cash out the cheque. There are other approaches, but their complexity is equal or greater.I'm fine with the idea of making cheques/approvals transferable.
A few more questions:
approveOnceapprove only one transfer of maximum value_maxValue, or does it approve multiple transfers of maximum total value_maxValue?approve, when we can just doapproveOnce(2**100)? I'd consider makingapproveoptional in the spec.approve/approveOnce/isApprovedForvs something to do with "cheques"isApprovedFor, or do we want a simplehowMuchApproved()function that returns the amount approved?