Trong bài học trước, chúng tôi đã triển khai hợp đồng LearnCoin của mình trên Mạng thử nghiệm Goerli. Trong bài học này, chúng ta sẽ khám phá chi tiết các chức năng của hợp đồng LearnCoin và giải thích chức năng của từng phần.
Đây là hợp đồng đầy đủ của LearnCoin của chúng tôi
Python
// SPDX-Lilicense-Identifier: Không có
độ vững chắc pragma ^0.8.9;
nhập "@openzeppelin/contracts/token/ERC20/ERC20.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
nhập "@openzeppelin/contracts/access/AccessControl.sol";
nhập "@openzeppelin/contracts/security/Pausable.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
hợp đồng LearnCoin là ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
bytes32 hằng số công khai SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE"); Hằng số công khai
byte32 PAUSER_ROLE = keccak256("PAUSER_ROLE");
constructor() ERC20("Tìm hiểu về Coin", "LC") ERC20Permit("Tìm hiểu về Coin") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(SNAPSHOT_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_mint(msg.sender, 21000000 * 10 ** decimals());
}
hàm snapshot() public onlyRole(SNAPSHOT_ROLE) {
_snapshot();
}
hàm tạm dừng() public onlyRole(PAUSER_ROLE) {
_pause();
}
hàm unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
hàm _trướcTokenTransfer(địa chỉ từ, địa chỉ đến, số tiền uint256)
nội bộ
whenNotPaused
ghi đè(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
// Các chức năng sau đây được ghi đè được yêu cầu bởi Solidity.
function _afterTokenTransfer(địa chỉ từ, địa chỉ đến, số tiền uint256)
nội bộ
ghi đè(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
chức năng _mint(địa chỉ tới, số tiền uint256)
nội bộ
ghi đè(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
chức năng _burn(địa chỉ tài khoản, số tiền uint256)
nội bộ
ghi đè(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
Hợp đồng bạn đã triển khai là hợp đồng mã thông báo ERC20 có tên LearnCoin
. Nó bao gồm một số tính năng từ thư viện hợp đồng của OpenZeppelin, chẳng hạn như mã thông báo có thể ghi, ảnh chụp nhanh, kiểm soát truy cập, mã thông báo có thể tạm dừng, chức năng cấp phép, phiếu bầu và flash mint.
Báo cáo nhập ở đầu hợp đồng lấy mã từ thư viện hợp đồng của OpenZeppelin:
ERC20.sol
là hợp đồng cơ sở cho mã thông báo ERC20.ERC20Burnable.sol
bổ sung thêm khả năng cho chủ sở hữu mã thông báo hủy mã thông báo của riêng họ.ERC20Snapshot.sol
cho phép tạo ảnh chụp nhanh số dư mã thông báo.AccessControl.sol
là một mô-đun hợp đồng để quản lý quyền truy cập vào một số chức năng nhất định.Pausable.sol
bổ sung khả năng tạm dừng và hủy tạm dừng chuyển mã thông báo.ERC20Permit.sol
cho phép chủ sở hữu chi tiêu mã thông báo của người dùng thông qua giấy phép.ERC20Votes.sol
bổ sung khả năng biểu quyết cho mã thông báo.ERC20FlashMint.sol
cho phép đúc token nhanh chóng.Hợp đồng LearnCoin
kế thừa từ các hợp đồng OpenZeppelin đã nhập. Điều này có nghĩa là nó sẽ có tất cả các phương thức và thuộc tính từ các hợp đồng đó.
SNAPSHOT_ROLE
và PAUSER_ROLE
là các giá trị không đổi (được tạo bằng hàm băm keccak256
) thể hiện các vai trò cụ thể để kiểm soát truy cập trong hợp đồng.
Khi hợp đồng LearnCoin
được triển khai, hàm xây dựng sẽ được gọi. Nó đặt tên và ký hiệu của mã thông báo, cấp cho tài khoản triển khai (msg.sender) vai trò quản trị viên, ảnh chụp nhanh và người tạm dừng, đồng thời tạo ra nguồn cung cấp mã thông báo ban đầu cho tài khoản triển khai.
snapshot
, pause
và unpause
là các chức năng cho phép các tài khoản có vai trò tương ứng thực hiện một số hành động nhất định. snapshot
cho phép tạo ảnh chụp nhanh, pause
và unpause
cho phép dừng và khởi động lại quá trình chuyển mã thông báo.
Các _beforeTokenTransfer
, _afterTokenTransfer
, _mint
và _burn
là các hàm nội bộ được ghi đè từ các hợp đồng gốc. Họ triển khai logic tùy chỉnh cho hợp đồng LearnCoin.
_beforeTokenTransfer
: Hàm này được gọi trước khi chuyển mã thông báo. Nó đảm bảo rằng việc chuyển mã thông báo không bị tạm dừng._afterTokenTransfer
: Hàm này được gọi sau bất kỳ lần chuyển mã thông báo nào. Ở đây đây là một hàm trống nhưng có thể được sử dụng cho logic tùy chỉnh sẽ diễn ra ngay sau khi chuyển._mint
: Chức năng này tạo mã thông báo mới và gán chúng cho một tài khoản nhất định._burn
: Chức năng này hủy mã thông báo từ một tài khoản nhất định.Đây là tổng quan nhanh về hợp đồng LearnCoin
của bạn. Khi hợp đồng được triển khai, giờ đây bạn đã sẵn sàng tương tác với hợp đồng đó, điều này chúng ta sẽ đề cập đến trong bài học tiếp theo.
Trong bài học trước, chúng tôi đã triển khai hợp đồng LearnCoin của mình trên Mạng thử nghiệm Goerli. Trong bài học này, chúng ta sẽ khám phá chi tiết các chức năng của hợp đồng LearnCoin và giải thích chức năng của từng phần.
Đây là hợp đồng đầy đủ của LearnCoin của chúng tôi
Python
// SPDX-Lilicense-Identifier: Không có
độ vững chắc pragma ^0.8.9;
nhập "@openzeppelin/contracts/token/ERC20/ERC20.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
nhập "@openzeppelin/contracts/access/AccessControl.sol";
nhập "@openzeppelin/contracts/security/Pausable.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
nhập "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
hợp đồng LearnCoin là ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
bytes32 hằng số công khai SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE"); Hằng số công khai
byte32 PAUSER_ROLE = keccak256("PAUSER_ROLE");
constructor() ERC20("Tìm hiểu về Coin", "LC") ERC20Permit("Tìm hiểu về Coin") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(SNAPSHOT_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_mint(msg.sender, 21000000 * 10 ** decimals());
}
hàm snapshot() public onlyRole(SNAPSHOT_ROLE) {
_snapshot();
}
hàm tạm dừng() public onlyRole(PAUSER_ROLE) {
_pause();
}
hàm unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
hàm _trướcTokenTransfer(địa chỉ từ, địa chỉ đến, số tiền uint256)
nội bộ
whenNotPaused
ghi đè(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
// Các chức năng sau đây được ghi đè được yêu cầu bởi Solidity.
function _afterTokenTransfer(địa chỉ từ, địa chỉ đến, số tiền uint256)
nội bộ
ghi đè(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
chức năng _mint(địa chỉ tới, số tiền uint256)
nội bộ
ghi đè(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
chức năng _burn(địa chỉ tài khoản, số tiền uint256)
nội bộ
ghi đè(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
Hợp đồng bạn đã triển khai là hợp đồng mã thông báo ERC20 có tên LearnCoin
. Nó bao gồm một số tính năng từ thư viện hợp đồng của OpenZeppelin, chẳng hạn như mã thông báo có thể ghi, ảnh chụp nhanh, kiểm soát truy cập, mã thông báo có thể tạm dừng, chức năng cấp phép, phiếu bầu và flash mint.
Báo cáo nhập ở đầu hợp đồng lấy mã từ thư viện hợp đồng của OpenZeppelin:
ERC20.sol
là hợp đồng cơ sở cho mã thông báo ERC20.ERC20Burnable.sol
bổ sung thêm khả năng cho chủ sở hữu mã thông báo hủy mã thông báo của riêng họ.ERC20Snapshot.sol
cho phép tạo ảnh chụp nhanh số dư mã thông báo.AccessControl.sol
là một mô-đun hợp đồng để quản lý quyền truy cập vào một số chức năng nhất định.Pausable.sol
bổ sung khả năng tạm dừng và hủy tạm dừng chuyển mã thông báo.ERC20Permit.sol
cho phép chủ sở hữu chi tiêu mã thông báo của người dùng thông qua giấy phép.ERC20Votes.sol
bổ sung khả năng biểu quyết cho mã thông báo.ERC20FlashMint.sol
cho phép đúc token nhanh chóng.Hợp đồng LearnCoin
kế thừa từ các hợp đồng OpenZeppelin đã nhập. Điều này có nghĩa là nó sẽ có tất cả các phương thức và thuộc tính từ các hợp đồng đó.
SNAPSHOT_ROLE
và PAUSER_ROLE
là các giá trị không đổi (được tạo bằng hàm băm keccak256
) thể hiện các vai trò cụ thể để kiểm soát truy cập trong hợp đồng.
Khi hợp đồng LearnCoin
được triển khai, hàm xây dựng sẽ được gọi. Nó đặt tên và ký hiệu của mã thông báo, cấp cho tài khoản triển khai (msg.sender) vai trò quản trị viên, ảnh chụp nhanh và người tạm dừng, đồng thời tạo ra nguồn cung cấp mã thông báo ban đầu cho tài khoản triển khai.
snapshot
, pause
và unpause
là các chức năng cho phép các tài khoản có vai trò tương ứng thực hiện một số hành động nhất định. snapshot
cho phép tạo ảnh chụp nhanh, pause
và unpause
cho phép dừng và khởi động lại quá trình chuyển mã thông báo.
Các _beforeTokenTransfer
, _afterTokenTransfer
, _mint
và _burn
là các hàm nội bộ được ghi đè từ các hợp đồng gốc. Họ triển khai logic tùy chỉnh cho hợp đồng LearnCoin.
_beforeTokenTransfer
: Hàm này được gọi trước khi chuyển mã thông báo. Nó đảm bảo rằng việc chuyển mã thông báo không bị tạm dừng._afterTokenTransfer
: Hàm này được gọi sau bất kỳ lần chuyển mã thông báo nào. Ở đây đây là một hàm trống nhưng có thể được sử dụng cho logic tùy chỉnh sẽ diễn ra ngay sau khi chuyển._mint
: Chức năng này tạo mã thông báo mới và gán chúng cho một tài khoản nhất định._burn
: Chức năng này hủy mã thông báo từ một tài khoản nhất định.Đây là tổng quan nhanh về hợp đồng LearnCoin
của bạn. Khi hợp đồng được triển khai, giờ đây bạn đã sẵn sàng tương tác với hợp đồng đó, điều này chúng ta sẽ đề cập đến trong bài học tiếp theo.