前回のレッスンでは、LearnCoinコントラクトをGoerliテストネットにデプロイしました。 このレッスンでは、LearnCoinコントラクトの機能を詳細に調べ、各部分の機能について説明します。
これはLearnCoinの完全な契約です
ニシキヘビ
SPDX-ライセンス識別子:なし
プラグマの堅実さ^0.8.9;
"@openzeppelin/contracts/token/ERC20/ERC20.sol"をインポートします。"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"をインポートします。"@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol"をインポートします。"@openzeppelin/contracts/access/AccessControl.sol"をインポートします。"@openzeppelin/contracts/security/Pausable.sol"をインポートします。"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"をインポートします。"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"をインポートします。"@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol"をインポートします。契約LearnCoinは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();
}
関数 _beforeTokenTransfer(アドレス開始、アドレス終了、uint256 amount)
国内
whenNotPaused (一時停止しないとき)
オーバーライド(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
以下の関数は、Solidityで必要なオーバーライドです。 関数 _afterTokenTransfer(アドレス開始、アドレス終了、uint256 amount)
国内
オーバーライド(ERC20, ERC20投票)
{
super._afterTokenTransfer(from, to, amount);
}
関数 _mint(アドレス先, uint256 amount)
国内
オーバーライド(ERC20, ERC20投票)
{
super._mint(to, amount);
}
関数 _burn(アドレス アカウント、uint256 金額)
国内
オーバーライド(ERC20, ERC20投票)
{
super._burn(account, amount);
}
}
デプロイしたコントラクトは、 という名前の LearnCoinERC20 トークンコントラクトです。 これには、燃えるトークン、スナップショット、アクセス制御、一時停止可能なトークン、許可機能、投票、フラッシュミントなど、OpenZeppelinの契約ライブラリからのいくつかの機能が含まれています。
コントラクトの冒頭にあるimport文は、OpenZeppelinのコントラクトライブラリからコードを取り込みます。
ERC20.sol ERC20トークンの基本契約です。ERC20Burnable.sol トークン所有者が自分のトークンを破壊する機能を追加します。ERC20Snapshot.sol トークン残高のスナップショットの作成を有効にします。AccessControl.sol は、特定の機能へのアクセスを管理するためのコントラクト モジュールです。Pausable.sol トークン転送を一時停止および一時停止解除する機能を追加します。ERC20Permit.sol 保有者は許可証を介してユーザーのトークンを使用できます。ERC20Votes.sol トークンに投票機能を追加します。ERC20FlashMint.sol トークンのフラッシュミントを可能にします。コントラクトは LearnCoin 、インポートされた OpenZeppelin コントラクトを継承します。 これは、これらのコントラクトのすべてのメソッドとプロパティを持つことを意味します。
SNAPSHOT_ROLE と PAUSER_ROLE は、コントラクト内のアクセス制御の特定のロールを表す定数値 (ハッシュ関数を使用して keccak256 作成) です。
LearnCoinコントラクトがデプロイされると、コンストラクタ関数が呼び出されます。トークンの名前と記号を設定し、デプロイアカウント(msg.sender)にadmin、snapshot、pauserロールを付与し、デプロイアカウントにトークンの初期供給をミントします。
snapshot、、およびunpauseは、pause対応するロールを持つアカウントが特定のアクションを実行できるようにする関数です。snapshot スナップショットの作成を有効にし、 pause unpause トークン転送の停止と再開を許可します。
、および_burn関数は_beforeTokenTransfer、_afterTokenTransfer_mint親コントラクトからオーバーライドされる内部関数です。LearnCoinコントラクトのカスタムロジックを実装します。
_beforeTokenTransfer: この関数は、トークンの転送前に呼び出されます。 これにより、トークンの転送が一時停止されないようになります。_afterTokenTransfer: この関数は、トークンの転送後に呼び出されます。 ここでは空の関数ですが、転送直後に発生するカスタムロジックに使用できます。_mint:この関数は、新しいトークンを作成し、特定のアカウントに割り当てます。_burn:この関数は、特定のアカウントからトークンを破棄します。これはあなたの LearnCoin 契約の簡単な概要でした。 コントラクトが展開されたら、次のレッスンで説明するコントラクトを操作する準備が整いました。