Solidity 103

1. ERC20
2. Token Faucet
3. Token Faucet
4. ERC721
5. Dutch Auction
6. Merkle Tree
7. Digital Signature
8. NFT Exchange
9. Chainlink Randomness
10. ERC1155
11. WETH
12. Payment Splitting
13. Linear Release
14. Token Lock
15. Time Lock
16. Proxy Contract
17. Upgradeable Contract
18. Transparent Proxy
19. UUPS
20. Multisignature Wallet
21. ERC4626 Tokenization of Vault Standard
22. EIP712 Typed Data Signature
23. ERC-2612 ERC20Permit
24. 跨链桥
25. 多重调用
26. 去中心化交易所
27. 闪电贷
.
Token Faucet

Recently, I have been revisiting Solidity, consolidating the finer details, and writing "WTF Solidity" tutorials for newbies.

Twitter: @0xAA_Science | @WTFAcademy_

Community: Discord|Wechat|Website wtf.academy

Codes and tutorials are open source on GitHub: github.com/AmazingAng/WTF-Solidity


In lesson 31, we learned about the ERC20 token standard. In this lesson, we will learn about the smart contract for an ERC20 faucet. In this contract, users can receive free ERC20 tokens.

Token Faucet

When a person is thirsty, they go to a faucet to get water. When a person wants free tokens, they go to a token faucet to receive them. A token faucet is a website or application that allows users to receive tokens for free.

The earliest token faucet was the Bitcoin (BTC) faucet. In 2010, the price of BTC was less than $0.1, and there were few holders of the currency. To increase its popularity, Gavin Andresen, a member of the Bitcoin community, created the BTC faucet, allowing others to receive BTC for free. Many people took advantage of the opportunity, and some of them became BTC enthusiasts. The BTC faucet gave away over 19,700 BTC, which is now worth approximately $600 million!

ERC20 Faucet Contract

Here, we will implement a simplified version of an ERC20 faucet. The logic is very simple: we will transfer some ERC20 tokens to the faucet contract, and users can use the requestToken() function of the contract to receive 100 units of the token. Each address can only receive tokens once.

State Variables

We define 3 state variables in the faucet contract:

  • amountAllowed sets the number of tokens that can be claimed per request (default value is 100, not 100 tokens as tokens may have decimal places).
  • tokenContract stores the address of the ERC20 token contract.
  • requestedAddress keeps track of the addresses that have already claimed tokens.
uint256 public amountAllowed = 100; // the allowed amount for each request is 100
address public tokenContract;   // contract address of the token
mapping(address => bool) public requestedAddress;   // a map contains requested address

Event

The faucet contract defines a SendToken event that records the address and amount of tokens claimed each time the requestTokens() function is called.

// Event SendToken
event SendToken(address indexed Receiver, uint256 indexed Amount);

Functions

There are only 2 functions in the contract:

  • Constructor: Initializes the tokenContract state variable and determines the address of the issued ERC20 tokens.
// Set the ERC20'S contract address during deployment
constructor(address _tokenContract) {
	tokenContract = _tokenContract; // set token contract
}

The requestTokens() function allows users to claim ERC20 tokens.

// Function for users to request tokens
function requestTokens() external {
    require(requestedAddress[msg.sender] == false, "Can't Request Multiple Times!"); // Only one request per address
    IERC20 token = IERC20(tokenContract); // Create an IERC20 contract object
    require(token.balanceOf(address(this)) >= amountAllowed, "Faucet Empty!"); // Faucet is empty

    token.transfer(msg.sender, amountAllowed); // Send token
    requestedAddress[msg.sender] = true; // Record the requested address
    
    emit SendToken(msg.sender, amountAllowed); // Emit SendToken event
}

Remix Demonstration

  1. First, deploy the ERC20 token contract with the name and symbol WTF, and mint yourself 10000 tokens.

    Deploy ERC20

  2. Deploy the Faucet contract, and fill in the initialized parameters with the address of the ERC20 token contract above.

    Deploy Faucet faucet contract

  3. Use the transfer() function of the ERC20 token contract to transfer 10000 tokens to the Faucet contract address.

    Transfer

  4. Switch to a new account and call the requestTokens() function of the Faucet contract to receive tokens. You can see that the SendToken event is released in the terminal.

    requestToken

  5. Use the balanceOf function on the ERC20 token contract to query the balance of the account that received tokens from the faucet. The balance should now be 100, indicating a successful request!

    Withdrawal success

Conclusion

In this lecture, we introduced the history of token faucets and the ERC20 faucet contract. Where do you think the next BTC faucet will be?

PreviousNext