AEX 11 Fungible Token Standard
AEX: 11
Title: Fungible Token Standard
Author: Robert Zaremba (@robert-zaremba)
License: BSD-3-Clause
Discussions-To: <URL>
Status: Draft
Type: Interface
Created: 2019-09-19Abstract
A short (~200 word) description of the technical issue being addressed.
Motivation
The following describes standard functions a token contract and contract working with specified token can implement to prevent accidentally sends of tokens to contracts and make token transactions behave like ether transactions.
Moreover, where designing the tokens we looked carfully at compliance work and wanted to make it easier for integrating compliance workflow. With this respect token transactions contains data field to be used freely to pass additional information (eg: reference) from a holder or an operator.
The goal is to make this specification useful with Native Tokens.
Specification
Interface
The token contract MUST implement the above interface. The implementation MUST follow the specifications described below.
Operators
An operator is an address which is allowed to send and burn tokens on behalf of some holder.
NOTE: A holder MAY have multiple operators at the same time.
A default operator is an implicitly authorized operator for all holders. The rules below apply to default operators:
The token contract MUST define default operators at creation time. The default operators set MAY be empty.
The token contract MUST NOT add or remove default operators after contract instantiation.
AuthorizedOperatorevents MUST NOT be emitted when defining default operators.A holder MUST be allowed to revoke a default operator (unless the holder is the default operator).
A holder MUST be allowed to re-authorize a previously revoked default operator.
The following rules apply to any operator:
An address MUST always be an operator for itself. Hence an address MUST NOT ever be revoked as its own operator.
NOTE: A holder MAY authorize an already authorized operator. An AuthorizedOperator MUST be emitted each time.
NOTE: A holder MAY revoke an already revoked operator. A RevokedOperator MUST be emitted each time.
Functional Specification
General Notes
meta() : meta_inf
meta() : meta_infReturns information about token as a meta_inf record.
total_supply() : int
total_supply() : intReturns: Total supply of tokens currently in circulation.
NOTE: MUST be equal to the sum of the balances of all addresses—as returned by the
balance_offunction.NOTE: MUST be equal to the sum of all the minted tokens as defined in all the Minted events minus the sum of all the burned tokens as defined in all the Burned events.
balance_of(holder: address) : option(int)
balance_of(holder: address) : option(int)Get the balance of the holder account. If the account is not registered (didn't use any token) then it MUST return None. Oherwise it MUST return non negative integer.
default_operators() : list(address)
default_operators() : list(address)List of addresses of all the default operators.
is_operator_for(operator: address, holder: address) : bool
is_operator_for(operator: address, holder: address) : boolMUST return true if the operator address is an operator for the holder. Otherwise MUST return false.
authorize_operator(operator: address)
authorize_operator(operator: address)Set a third party operator address as an operator of Call.caller to transfer and burn tokens on its behalf.
NOTE: The holder (Call.caller) is always an operator for itself. This right SHALL NOT be revoked.
revoke_operator(operator: address)
revoke_operator(operator: address)Remove the right of the operator address to be an operator for Call.caller and to send and burn tokens on its behalf.
NOTE: The holder (Call.caller) is always an operator for itself. This right SHALL NOT be revoked.
transfer(to: address, amount: int, data: string)
transfer(to: address, amount: int, data: string)Send the amount of tokens from the Call.caller (holder) to the to address. data an information provided by the holder.
In the Transfer event, the operator and the holder MUST both be Call.caller.
op_transfer(from: address, to: address, amount: int, data: string, op_data: string)
op_transfer(from: address, to: address, amount: int, data: string, op_data: string)Send the amount of tokens on behalf of the from address to the to address.
Reminder: If the operator address (Call.caller) is not an authorized operator of the from address, then the send process MUST abort.
burn(amount: int, data: string)
burn(amount: int, data: string)Burn the amount of tokens from the Call.caller address.
In the Burned event, the operator and the holder MUST both be Call.caller.
op_burn(from: address, amount: int, data: string, op_data: string)
op_burn(from: address, amount: int, data: string, op_data: string)Burn the amount of tokens on behalf of the from address.
Reminder: If the operator address (Call.caller) is not an authorized operator of the from address, then the burn process MUST abort.
AuthorizedOperator event
AuthorizedOperator eventIndicates the authorization of operator as an _operator for holder.
The token contract MUST emit an AuthorizedOperator event with the correct values when a holder authorizes an address as its operator (even if it's already authorized or it's defined as a default oprator).
RevokeOperator event
RevokeOperator eventIndicates the revokation of operator as an _operator for holder.
The token contract MUST emit an RevokeOperator event with the correct values when a holder revokes an address as its operator (even if it's already revoked or it's defined as a default oprator).
Hooks
tokensToTransfer hook
tokensToTransfer hookThe tokensToSend hook notifies of any request to decrement the balance (transfer and burn) for a given holder. Any address (regular or contract) wishing to be notified of token debits from their address MAY register for receiving this hooks
Interface:
Notify a request to transfer or burn (if to is 0x0) an amount tokens from the from address to the to address by the operator address. The holder MAY block a send or burn process by aborting. (I.e., reject the withdrawal of tokens from its account.)
toMUST be0x0for a burn.amountMUST be the number of tokens the holder sent or burned. MUST be non negative integer (0 is possible).dataMUST contain the extra information (if any) provided to the send or the burn process.op_dataMUST contain the extra information provided by the address which triggered the decrease of the balance (if any).
NOTE: A regular address MAY register a different address—the address of a contract—implementing the interface on its behalf. A contract MAY register either its address or the address of another contract but said address MUST implement the interface on its behalf.
TODO
tokensReceived hook
tokensReceived hookThe tokensToSend hook notifies of any request to increment the balance (transfer and mint) for a given holder. Any address (regular or contract) wishing to be notified of token credits from their address MAY register for receiving this hooks
Interface:
Notify a send or mint (if from is 0x0) of amount tokens from the from address to the to address by the operator address.
TOOD
Backwards Compatibility
This token provides a foundation for compliance tokens. Because of the need for refence field (data), and introduction of operators (often required in the industry and interoperability with other smart contracts), the interface is not backward compatible with proposed AEX-9 simple token standard.
Implementation
TODO
Further consideration
register token interfaces Probably we don't need it because Sophia is strong static typed language.
Last updated
Was this helpful?