The E-Money Standard Token aims to enable the issuance of regulated electronic money on blockchain networks, and its practical usage in real financial applications.
An account, which has been approved by an account to perform an action on the behalf of another account.
Financial institutions work today with electronic systems, which hold account balances in databases on core banking systems. In order for an institution to be allowed to maintain records of client balances segregated and available for clients, such institution must be regulated under a known legal framework and must possess a license to do so. Maintaining a license under regulatory supervision entails ensuring compliance (i.e. performing KYC on all clients and ensuring good AML practices before allowing transactions) and demonstrating technical and operational solvency through periodic audits, so clients depositing funds with the institution can rest assured that their money is safe.
There are only a number of potential regulatory license frameworks that allow institutions to issue and hold money balances for customers (be it retail corporate or institutional types). The most important and practical ones are three:
Regulations for all these types of electronic money are local, i.e. only valid for each jurisdiction and not valid in others. Regulations can vary as well dramatically in different jurisdictions — for example there are places with no electronic money frameworks, on everything has to be done through banking licenses or directly with a central bank. But in all cases compliance with existing regulation needs to ensured, in particular:
Beyond cash, financial instruments such as equities or bonds are also registered in electronic systems in most cases, although all these systems and the bank accounting systems are only connected through rudimentary messaging means, which leads to the need for reconciliations and manual management in many cases. Cash systems to provide settlement of transactions in the capital markets are not well-connected to the transactional systems, and often entail delays and settlement risk.
The E-Money Standard Token builds on Ethereum standards currently in use such as ERC-20, but it extends them to provide few key additional pieces of functionality, needed in the regulated financial world:
require that these methods return a positive answer before executing the transaction.transfer method, E-Money Standard Token provides a way to submit transfers that need to be cleared by the token issuing authority off-chain. These transfers are then executed in two steps:
The E-Money Standard Token is thus different from other tokens commonly referred to as "stable coins" in that it is designed to be issued, burnt and made available to users in a compliant manner (i.e. with full KYC and AML compliance) through a licensed vehicle (an electronic money entity, a bank, or a central bank), and in that it provides the additional functionality described above, so it can be used by other smart contracts implementing more complex financial applications such as interbank payments, supply chain finance instruments, or the creation of E-Money Standard Token denominated bonds and equities with automatic delivery-vs-payment.
The checks must be verified in their corresponding actions. The action must only be successful if the check return an Allowed status code. In any other case the functions must revert.
If an action is allowed 0x11 (Allowed), or an issuer-specific code with equivalent but more precise meaning must be returned. If the action is not allowed the status must be 0x10 (Disallowed), or an issuer-specific code with equivalent but more precise meaning.
Returns the currency that backs the token. The value must be a code defined in ISO 4217.
| Parameter | Description |
|---|---|
| - | - |
Returns the current version of the smart contract. The format of the version is up to the implementer of the EIP.
| Parameter | Description |
|---|---|
| - | - |
Returns the total net funds of an account. Taking into consideration the outright balance and the held balances.
| Parameter | Description |
|---|---|
| account | The account which available funds should be returned |
Checks if the transfer or transferFrom function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| from | The address of the payer, from whom the tokens are to be taken if executed |
| to | The address of the payee, to whom the tokens are to be transferred if executed |
| value | The amount to be transferred |
Checks if the approve function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| from | The address of the payer, from whom the tokens are to be taken if executed |
| spender | The address of the spender, which potentially can initiate transfers on behalf of from |
| value | The maximum amount to be transferred |
Checks if the hold function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| from | The address of the payer, from whom the tokens are to be taken if executed |
| to | The address of the payee, to whom the tokens are to be transferred if executed |
| notary | The address of the notary who is going to determine whether the hold is to be executed or released |
| value | The amount to be transferred. Must be less or equal than the balance of the payer |
Checks if the checkAuthorizeHoldOperatorAllowed function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| operator | The address to be approved as operator of clearable transfers |
| from | The address on which behalf holds could potentially be issued |
Checks if the orderTransfer function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| from | The address of the payer, from whom the tokens are to be taken if executed |
| to | The address of the payee, to whom the tokens are to be paid if executed |
| value | The amount to be transferred. Must be less or equal than the balance of the payer |
Checks if the authorizeClearableTransferOperator function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| operator | The address to be approved as operator of clearable transfers |
| from | The address on which behalf clearable transfers could potentially be ordered |
Checks if the orderFund function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| to | The address to which the tokens are to be given if executed |
| operator | The address of the requester, which initiates the funding order |
| value | The amount to be funded |
Checks if the authorizeFundOperator function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| operator | The address to be approved as operator of ordering funding |
| to | The address which the tokens are to be given if executed |
Checks if the orderPayout function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| from | The address from whom the tokens are to be taken if executed |
| operator | The address of the requester, which initiates the payout request |
| value | The amount to be paid out |
Checks if the authorizePayoutOperator function is allowed to be executed with the given parameters.
| Parameter | Description |
|---|---|
| operator | The address to be approved as operator of ordering payouts |
| from | The address from which the tokens are to be taken if executed |
This EIP unifies ERC-1996, ERC-2018, ERC-2019 and ERC-2021 and adds the checks for the compliance on top of it. By this way the separate EIPs are otherwise independent of each other, and the E-Money Standard Token offers a solution for all necessary functionality of regulated electronic money.
While not requiring it, the naming of the check functions was adopted from ERC-1462.
This EIP is fully backwards compatible as its implementation extends the functionality of ERC-1996, ERC-2018, ERC-2019, ERC-2021 and ERC-1066.
The GitHub repository IoBuilders/em-token contains the work in progress implementation.
This proposal has been collaboratively implemented by adhara.io and io.builders.
Copyright and related rights waived via CC0.