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
Yeah, I'm with @vbuterin & @niran. Having approval inside the token contract eases up several scenarios such as what was described above (instead of having multiple contracts doing multiple approval tangos).
@vbuterin: There was some ambiguity initially around approveOnce. The current standard was changed so that it only allows 1 time transfer of up to maxValue. Essentially a deposit.
Full custodian approval does seem somewhat questionable & not entirely sure where you will need that. Since, you might as well just send funds to another contract to deal with it?
Perhaps... we change approve() to being the latter approveOnce() as you mentioned. Do we want to specify amount of withdrawals that can be made? Perhaps in subscription scenarios? In most circumstances though, I feel having up to value works for most use cases, even for things like subscriptions. Just leave the right amount in there for a certain time period (for example).
So, we drop approveOnce() and approve() becomes:
Which approves _address to withdraw anything up to _maxValue. Thoughts? Regarding transfers of approvals? How would that work? Is it something we want in this current spec at this point in time?
@frozeman
I like useCheque. So perhaps it should then be that we drop approve...
which is equivalent to allowing _address to withdraw up to _maxValue.
And then? How do we transfer cheques?