Solidity极简入门: 32. 代币水龙头

我最近在重新学solidity,巩固一下细节,也写一个“Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。

欢迎关注我的推特:@0xAA_Science

欢迎加入WTF科学家社区,内有加微信群方法:链接

所有代码和教程开源在github(1024个star发课程认证,2048个star发社群NFT): github.com/AmazingAng/WTFSolidity


我们在第31讲学习了ERC20代币标准。这一讲,我们将学习ERC20水龙头的智能合约。在这个合约中,用户可以领到免费的ERC20代币。

代币水龙头

当人渴的时候,就要去水龙头接水;当人想要免费代币的时候,就要去代币水龙头领。代币水龙头就是让用户免费领代币的网站/应用。

最早的代币水龙头是比特币(BTC)水龙头:现在BTC一枚要$30,000,但是在2010年,BTC的价格只有不到$0.1,并且持有人很少。为了扩大影响力,比特币社区的Gavin Andresen开发了BTC水龙头,让别人可以免费领BTC。撸羊毛大家都喜欢,当时就有很多人去撸,一部分变为了BTC的信徒。BTC水龙头一共送出了超过19,700枚BTC,现在价值约6亿美元!

ERC20水龙头合约

这里,我们实现一个简版的ERC20水龙头,逻辑非常简单:我们将一些ERC20代币转到水龙头合约里,用户可以通过合约的requestToken()函数来领取100单位的代币,每个地址只能领一次。

状态变量

我们在水龙头合约中定义3个状态变量

  • amountAllowed设定每次能领取代币数量(默认为100。不是一百枚,因为代币有小数位数)。
  • tokenContract记录发放的ERC20代币合约地址。
  • requestedAddress记录领取过代币的地址。
    uint256 public amountAllowed = 100; // 每次领 100 单位代币
    address public tokenContract;   // token合约地址
    mapping(address => bool) public requestedAddress;   // 记录领取过代币的地址

事件

水龙头合约中定义了1个SendToken事件,记录了每次领取代币的地址和数量,在requestTokens()函数被调用时释放。

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

函数

合约中只有两个函数:

  • 构造函数:初始化tokenContract状态变量,确定发放的ERC20代币地址。
    // 部署时设定ERC2代币合约
    constructor(address _tokenContract) {
        tokenContract = _tokenContract; // set token contract
    }
  • requestTokens()函数,用户调用它可以领取ERC20代币。

Remix演示

1 首先,部署ERC20代币合约,并给自己mint 10000 单位代币。

部署`ERC20`
部署`ERC20`

2 部署Faucet水龙头合约,初始化的参数填上面ERC20代币的合约地址。

部署水龙头合约
部署水龙头合约

3 利用ERC20代币合约的trasnfer()函数,将 10000 单位代币转账到Faucet合约地址。

给水龙头转账
给水龙头转账

4 换一个新账户,调用Faucet合约requestTokens()函数,领取代币。可以在终端看到SendToken事件被释放。

领取代币
领取代币

5 在ERC20代币合约上利用balanceOf查询账户余额,可以看到余额变为100,领取成功!

领取成功
领取成功

总结

这一讲,我们介绍了代币水龙头的历史和ERC20水龙头合约。大家觉得下一个BTC水龙头会在哪里?

Subscribe to 0xAA
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.