在上一章中,我们将LearnCoin合约部署到Goerli测试网。在本章中,我们将详细探讨LearnCoin合约的功能并解释每个部分的作用。
以下是我们的LearnCoin完整合约:
Python
// SPDX-License-Identifier: None
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
contract LearnCoin is ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(SNAPSHOT_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_mint(msg.sender, 21000000 * 10 ** decimals());
}
function snapshot() public onlyRole(SNAPSHOT_ROLE) {
_snapshot();
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
// The following functions are overrides required by Solidity.
function _afterTokenTransfer(address from, address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
我们部署的合约是一个名为LearnCoin
的ERC20代币合约。它包含了OpenZeppelin合约库中的多个功能,如可销毁代币、快照、访问控制、可暂停代币、许可、投票和闪电铸币。
合约开头的import语句是从OpenZeppelin的合约库中导入代码:
ERC20.sol
是ERC20代币的基础合约。ERC20Burnable.sol
使代币持有者能够销毁自己的代币。ERC20Snapshot.sol
支持创建代币余额的快照。AccessControl.sol
是一个用于管理对某些功能的访问权限的合约模块。Pausable.sol
可以暂停和取消暂停代币传输。ERC20Permit.sol
使持有者能够通过许可(permits)使用用户的代币。ERC20Votes.sol
为代币添加了投票功能。ERC20FlashMint.sol
可以实现快速铸造代币。LearnCoin
合约继承了导入的OpenZeppelin合约。因此,LearnCoin
合约将拥有OpenZeppelin合约的所有方法和属性。
SNAPSHOT_ROLE
和PAUSER_ROLE
是常量值(使用keccak256
哈希函数创建),表示合约中访问控制的特定角色。
部署LearnCoin
合约时,会调用构造函数。构造函数设置了代币的名称和符号,授予部署帐户(msg.sender)管理员、快照者和暂停者角色,并铸造了一定数量的初始代币供部署账户使用。
snapshot
,pause
和unpause
是允许具有相应角色的帐户执行某些操作的函数。snapshot
函数可以创建快照,pause
和unpause
函数可以停止和重新启动代币转账。
函数_beforeTokenTransfer
、_afterTokenTransfer
、_mint
和_burn
是从父合约重写的内部函数。它们执行LearnCoin合约的自定义逻辑。
_beforeTokenTransfer
:在代币转账之前调用此函数,确保代币转账不会暂停。_afterTokenTransfer
:在代币转账之后调用此函数。此处,它是一个空函数,但可用于转账后立即执行的自定义逻辑。_mint
:此函数用于创建新代币并将其分配给给定的帐户。_burn
:此函数用于销毁来自给定帐户的代币。本章是对LearnCoin
合约所做的综合介绍。合约部署完成后,您可以运行该合约,我们将在下一章中详细探讨。
在上一章中,我们将LearnCoin合约部署到Goerli测试网。在本章中,我们将详细探讨LearnCoin合约的功能并解释每个部分的作用。
以下是我们的LearnCoin完整合约:
Python
// SPDX-License-Identifier: None
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
contract LearnCoin is ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(SNAPSHOT_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_mint(msg.sender, 21000000 * 10 ** decimals());
}
function snapshot() public onlyRole(SNAPSHOT_ROLE) {
_snapshot();
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
// The following functions are overrides required by Solidity.
function _afterTokenTransfer(address from, address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
我们部署的合约是一个名为LearnCoin
的ERC20代币合约。它包含了OpenZeppelin合约库中的多个功能,如可销毁代币、快照、访问控制、可暂停代币、许可、投票和闪电铸币。
合约开头的import语句是从OpenZeppelin的合约库中导入代码:
ERC20.sol
是ERC20代币的基础合约。ERC20Burnable.sol
使代币持有者能够销毁自己的代币。ERC20Snapshot.sol
支持创建代币余额的快照。AccessControl.sol
是一个用于管理对某些功能的访问权限的合约模块。Pausable.sol
可以暂停和取消暂停代币传输。ERC20Permit.sol
使持有者能够通过许可(permits)使用用户的代币。ERC20Votes.sol
为代币添加了投票功能。ERC20FlashMint.sol
可以实现快速铸造代币。LearnCoin
合约继承了导入的OpenZeppelin合约。因此,LearnCoin
合约将拥有OpenZeppelin合约的所有方法和属性。
SNAPSHOT_ROLE
和PAUSER_ROLE
是常量值(使用keccak256
哈希函数创建),表示合约中访问控制的特定角色。
部署LearnCoin
合约时,会调用构造函数。构造函数设置了代币的名称和符号,授予部署帐户(msg.sender)管理员、快照者和暂停者角色,并铸造了一定数量的初始代币供部署账户使用。
snapshot
,pause
和unpause
是允许具有相应角色的帐户执行某些操作的函数。snapshot
函数可以创建快照,pause
和unpause
函数可以停止和重新启动代币转账。
函数_beforeTokenTransfer
、_afterTokenTransfer
、_mint
和_burn
是从父合约重写的内部函数。它们执行LearnCoin合约的自定义逻辑。
_beforeTokenTransfer
:在代币转账之前调用此函数,确保代币转账不会暂停。_afterTokenTransfer
:在代币转账之后调用此函数。此处,它是一个空函数,但可用于转账后立即执行的自定义逻辑。_mint
:此函数用于创建新代币并将其分配给给定的帐户。_burn
:此函数用于销毁来自给定帐户的代币。本章是对LearnCoin
合约所做的综合介绍。合约部署完成后,您可以运行该合约,我们将在下一章中详细探讨。