forked from ethereum/EIPs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add ERC: Simple token, Simplified ERC-20 (ethereum#48)
* Create erc-7169.md * Update and rename erc-7169.md to erc-7196.md * Update ERCS/erc-7196.md Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com> * Update ERCS/erc-7196.md Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com> * Update ERCS/erc-7196.md Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com> * Update ERCS/erc-7196.md Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com> * Update ERCS/erc-7196.md Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com> * Update erc-7196.md * Update erc-7196.md * Update erc-7196.md * Update erc-7196.md * fix HTMLProofer error --------- Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>
- Loading branch information
1 parent
f527378
commit ff20ee8
Showing
1 changed file
with
150 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
--- | ||
eip: 7196 | ||
title: Simple token, Simplified ERC-20 | ||
description: Designed for smart contract wallets, this removes the transferFrom, approve, and allowance functions from ERC-20 tokens. | ||
author: Xiang (@wenzhenxiang), Ben77 (@ben2077), Mingshi S. (@newnewsms) | ||
discussions-to: https://ethereum-magicians.org/t/simple-token-designed-for-smart-contract-wallet-aa/14757 | ||
status: Draft | ||
type: Standards Track | ||
category: ERC | ||
created: 2023-06-21 | ||
requires: 20 | ||
--- | ||
|
||
## Abstract | ||
|
||
This ERC is a new asset designed based on the user contract wallet (including account abstraction), and is forward compatible with [ERC-20](./eip-20.md). To keep token assets simple, this ERC removes the `transferFrom`, `approve` and `allowance` functions of ERC-20. | ||
|
||
|
||
## Motivation | ||
|
||
[ERC-20](./eip-20.md) defines Ethereum-based standard tokens that can be traded and transferred, but the essence of ERC-20 is based on the externally-owned account (EOA) wallet design. An EOA wallet has no state and code storage, and the smart contract wallet is different. | ||
|
||
Almost all ERCs related to tokens add functions, but our opinion is the opposite. We think the token contract should be simpler, with more functions taken care of by the smart contract wallet. | ||
|
||
Our proposal is to design a simpler token asset based on the smart contract wallet. | ||
|
||
It aims to achieve the following goals: | ||
|
||
1. Keep the asset contract simple: only responsible for the `transfer` functions. | ||
2. `approve` and `allowance` functions are not managed by the token contract, Instead, these permissions are managed at the user level, offering greater flexibility and control to users. This change not only enhances user autonomy but also mitigates certain risks associated with the ERC-20 contract's implementation of these functions. | ||
3. Remove the `transferFrom` function. A better way to call the other party's token assets is to access the other party's own contract instead of directly accessing the token asset contract. | ||
4. Forward compatibility with ERC-20 means that all fungible tokens can be compatible with this proposal. | ||
|
||
## Specification | ||
|
||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174. | ||
|
||
Compliant contracts MUST implement the following interface: | ||
|
||
```solidity | ||
pragma solidity ^0.8.20; | ||
/** | ||
* @title ERC7196 Simple token interface | ||
* @dev See https://ercs.ethereum.org/ERCS/erc-7196 | ||
*/ | ||
interface IERC7196 { | ||
/** | ||
* @notice Used to notify transfer tokens. | ||
* @param from Address of the from | ||
* @param to Address of the receive | ||
* @param value The transaction amount | ||
*/ | ||
event Transfer( | ||
address indexed from, | ||
address indexed to, | ||
uint256 value | ||
); | ||
/** | ||
* @notice Get the total supply | ||
* @return total The total supply amount | ||
*/ | ||
function totalSupply() | ||
external | ||
view | ||
returns (uint256 total); | ||
/** | ||
* @notice get the balance of owenr address | ||
* @param owner Address of the owner | ||
* @return balance The balance of the owenr address | ||
*/ | ||
function balanceOf(address owner) | ||
external | ||
view | ||
returns (uint256 balance); | ||
/** | ||
* @notice Transfer token | ||
* @param to Address of the to | ||
* @param value The transaction amount | ||
* @return success The bool value returns whether the transfer is successful | ||
*/ | ||
function transfer(address to, uint256 value) | ||
external | ||
returns (bool success); | ||
} | ||
``` | ||
|
||
## Rationale | ||
|
||
The proposal is to simplify token standards by removing `transferFrom`, `approve` and `allowance` functions. This simplification aims to enhance security, reduce complexity, and improve efficiency, making the standard more suitable for smart contract wallet environments while maintaining essential functionalities. | ||
|
||
## Backwards Compatibility | ||
|
||
As mentioned in the beginning, this ERC is forward compatible with [ERC-20](./eip-20.md), ERC-20 is backward compatible with this ERC. | ||
|
||
## Reference Implementation | ||
|
||
**forward compatible with [ERC-20](./eip-20.md)** | ||
|
||
```solidity | ||
pragma solidity ^0.8.20; | ||
import "./IERC7196.sol"; | ||
import "../../math/SafeMath.sol"; | ||
/** | ||
* @title Standard ERC7196 token | ||
* @dev Note: the ERC-165 identifier for this interface is 0xc1b31357 | ||
* @dev Implementation of the basic standard token. | ||
*/ | ||
contract ERC7196 is IERC7196 { | ||
using SafeMath for uint256; | ||
mapping (address => uint256) private _balances; | ||
uint256 private _totalSupply; | ||
function totalSupply() external view returns (uint256) { | ||
return _totalSupply; | ||
} | ||
function balanceOf(address owner) external view returns (uint256) { | ||
return _balances[owner]; | ||
} | ||
function transfer(address to, uint256 value) external returns (bool) { | ||
require(value <= _balances[msg.sender]); | ||
require(to != address(0)); | ||
_balances[msg.sender] = _balances[msg.sender].sub(value); | ||
_balances[to] = _balances[to].add(value); | ||
emit Transfer(msg.sender, to, value); | ||
return true; | ||
} | ||
} | ||
``` | ||
|
||
|
||
## Security Considerations | ||
|
||
It should be noted that this ERC is not backward compatible with [ERC-20](./eip-20.md), so there will be incompatibility with existing dapps. | ||
|
||
## Copyright | ||
|
||
Copyright and related rights waived via [CC0](../LICENSE.md). |