Hardhatのチュートリアルを見て、スマートコントラクトを作成してコンパイルします。
Solidityという言語でコードを書いていきます。
contracts
と呼ばれるディレクトリ内にファイルを作成します。
スマートコントラクトを作成します。
vi contracts/Token.sol
//SPDX-License-Identifier: UNLICENSED
// Solidity ファイルはこのプラグマで開始する必要があります。
// これは Solidity コンパイラがそのバージョンを検証するために使用されます。
pragma solidity ^0.8.9;
// スマートコントラクトの主要なビルディングブロックです。
contract Token {
// トークンを識別するための文字列の変数定義。
string public name = "My Hardhat Token";
string public symbol = "MHT";
// トークンの固定量、符号なし整数型に変数定義。
uint256 public totalSupply = 1000000;
// イーサリアムアカウントを格納するために、アドレス型変数が使用されます。
address public owner;
// マッピングとは、キーと値のマップのことです。ここでは、各アカウントの残高を格納しています。
mapping(address => uint256) balances;
// Transfer イベントは、オフチェーンアプリケーションが
// コントラクト内で何が起こっているかを理解するのに役立ちます。
event Transfer(address indexed _from, address indexed _to, uint256 _value);
/**
* コントラクトの初期化。
*/
constructor() {
// totalSupplyはトランザクション送信者に割り当てられます。
// コントラクトを展開するアカウントであるトランザクション送信者に割り当てられます。
balances[msg.sender] = totalSupply;
owner = msg.sender;
}
/**
* トークンを転送するための関数です。
*
* EXTERNAL` 修飾子は 外部からしか呼び出せない関数にします。
*
*/
function transfer(address to, uint256 amount) external {
// トランザクションの送信者が十分なトークンを持っているかどうかをチェックします。
// `require`の最初の引数が`false`と評価された場合、トランザクションは元に戻ります。
require(balances[msg.sender] >= amount, "Not enough tokens");
// 金額を振り込みます。
balances[msg.sender] -= amount;
balances[to] += amount;
// オフチェーンアプリケーションに転送を通知する。
emit Transfer(msg.sender, to, amount);
}
/**
* 与えられたアカウントのトークン残高を取得するための読み取り専用関数です。
*
* view` 修飾子は、コントラクトの状態を変更しません。
* トランザクションを実行せずに呼び出すことができるためガス代がかかりません。
*/
function balanceOf(address account) external view returns (uint256) {
return balances[account];
}
}
コンパイルします。
npx hardhat compile
You have both ethereum-waffle and @nomicfoundation/hardhat-chai-matchers installed. They don't work correctly together, so please make sure you only use one.
We recommend you migrate to @nomicfoundation/hardhat-chai-matchers. Learn how to do it here: https://hardhat.org/migrate-from-waffle
Downloading compiler 0.8.9
Compiled 3 Solidity files successfully