Points to consider when creating a fungible token (ERC20, ERC777)

If you are thinking about creating a fungible token (ERC20, ERC777), you may want to consider the following points:

  • What is the purpose of the token?
  • Why would someone need to use the token?
  • Could the solution operate without a token?
  • Could the solution operate using either the native currency of the blockchain (Ether) or an existing stable token instead of the token?
  • Could the solution be cloned and have the token removed, yet still operate (without the token)?
  • How does transaction fees (gas price) impact usage of the token?
  • Do users need to have the native currency of the blockchain (Ether) to use the token or is there an option to use meta transactions?

If you plan for your token to potentially have value, you should seek appropriate advice on regulatory compliance and your solution should have appropriate testing and auditing:

If you have access control for minting, pausing, upgrades you should design your governance behind when and how these functions can be used and communicate this to your potential token users.

You also should design your tokenomics of your token.

:warning: If you create a fee on transfer or deflationary token (burn a percentage on transfer) this can cause issues when used with other contracts such as: https://medium.com/balancer-protocol/incident-with-non-standard-erc20-deflationary-tokens-95a0f6d46dea

ERC777

For ERC777 you need to consider reentrancy, see Reentrancy After Istanbul


This is a wiki post, please edit/update

9 Likes
Create a website with an ERC20 token with Gasless transactions
Creating an ERC-20 token with OpenZeppelin v3.x?
Create an ERC20 using Truffle, without writing Solidity
ERC777 contract best practice
Verify Crowdsale contract on Etherscan deployed using Remix
Add commission to ERC20 transfer
Burn and tax on ERC20 transfer
How would I create a function where 3% of transactions gets sent to an address I assign?
Create deflationary ERC20 token
How to burn tokens on every transfer?
How to create a school fees payment system using a custom ERC20 token
How to add a Time lock token function on several addresses?
How to create a crowdsale for an ERC20 contract?
Will burning a percentage of the amount transferred for an ERC20 token cause issues?
SafeMoon fork problems with LP
Send a certain portion to a specific address with every transaction
Creating Capped ERC20 gives error in contract constructor
How to auto transfer funds to a beneficiary(admin) on every tx in crowdsale contract
How to combine two ERC20 contracts
Transfer contract with fees
Give away ERC20
Is there a way to add burn function to deployed ERC20 token?
Creating fee on transfer ERC20 - ERC20Detailed not found
What tool to use to deploy contracts to mainnet
Turn on deflationary functionality after a specific transaction
Create a half burnable and staking ERC20 token
Developer Wanted: Create a yield-generating erc20 token (Tax on Buy & Sell)
Truffle cannot flatten openzeppelin/contracts
Help splitting tax fee into 4 sections for RFI deflationary token
Token set up
Simple ERC20 token example
Token for social campaigns to raise funds
Introduce yourself here!
How to split each ERC20/ERC777 transfer 3 ways?
Create ERC20 social token for online community
WSL2 with Solidity plugin: Compile error: File import callback not supported
Resources/examples to build a front end for an ERC20 contract using React?
Accept USDT in crowdsale
Add function buyTokens() with no parameter to Crowdsale contract
Is it still safe to use the v2.0 Crowdsale smart contract?
OpenZeppelin ERC20: Do I need add code for validating sender and replay attack?
Extending ERC20PresetMinterPauser
How to combine two ERC20 contracts
Simple ERC20 Crowdsale
Accepting other ERC20 tokens for crowdsale
Update deflationary ERC20 from OpenZeppelin Contracts 2.x to 3.x
Forking ethereum source code
Transfer tokens to users on actions
ERC20 Token - is it possible to transfer part of tokens to a smart contract?
How to get Ether funds after Refundable Crowdsale?
'safeTransfer' in Crowdsale errors but works with 'transfer'
ERC20 initial contract and crowdsale test check
Introduce yourself here!
Burn and static reflection on every trade functions to include in my smart contract
Tool to create ERC20 with fee on transfer without coding
Does code comply with OpenZeppelin license and copyright terms?
Want an example of ERC918 Mineable Token and how it can be mined?
Error using ERC20 transferFrom in a buy function selling tokens
Error using ERC20 transferFrom in a buy function selling tokens
Simple ERC20 Crowdsale contract
How to create a Crowdsale with Solidity 0.6?
Design pattern for a trustless ICO?
What are you working on?
Need help implementing 1% Burn tokenomics
Recycling App: Pay people, to pick up garbage
Migrate ERC20 code to OpenZeppelin ERC20 implementation
Interacting directly with an ERC20 token's contract for trading
ERC20 token doesn't include additional functionality
How to create deflationary ERC20 token?
Brick & Mortar Company Issuing Shares -- Which ERC to aim for?
Help creating an ERC20 token using Remix
Fee on transfer token
Is there an exchange on Ethereum that will add a new ERC20 token?
Coding Journey: An Idea turned Obsession
Sell all the investor tokens
How to add a Time lock token function on several addresses?
Unable to deploy and verify ERC20 token with burn and stop burn feature
ERC20PresetMinterPauser: how to verify on Etherscan and is it safe to use in a Crowdsale?
How to request a security audit from OpenZeppelin
Error verifying contract with no constructor arguments on Etherscan
Is it safe to use Crowdsales (OpenZeppelin Contracts 2.x) together with the upgradable version of ERC20?
Introduce yourself here!
ERC20 token not displaying Metadata or Total supply
Upgradeable ERC20 token with partial burn on transfer
Can we use virtual as well as override for the same function?
How to build a buyable ERC777?
Where are Crowdsale contracts in OpenZeppelin Contracts 3.0?
Help me write an erc20 token and a crowdsale contract
Deploying contract for farming but don't understand "_allocPoint" & "_withUpdate"
Release an ERC-20 token automatically instead of calling release method after locking period?
Introduce yourself here!
How to prevent ERC20 transfer until a specific block and only allow the contract creator to transfer
Community token based on ERC-777
Error verifying ERC20 without constructor arguments on Etherscan
Developer Wanted: Create a burnable and staking token
Error with custom crowdsale contract
How to create deflationary ERC20 token?