🏠

結構がばがばな Token コントラクトを作る。

1 Token.sol

1.1 宣言とか諸々初期設定

このトークンの前提。全体の通貨の量は決まってる。誰がいくら持ってるかと言う mapping。

Hardhat は hardhat/console.sol をインポートすると、コントラクトの中で console.log を使えるようなる。

pragma solidity ^0.7.0;

import "hardhat/console.sol";

contract Token{
    string public name= "Hardhat Token";
    string public symbol= "HHT";

    uint256 public totalSupply = 10000;
    address public owner;
    mapping(address => uint) balances;

1.2 コンストラクタ

デプロイした人が全部持ってます。

    constructor() {
        console.log("Deploying Token constract by %s", msg.sender);
        balances[msg.sender] = totalSupply;
        owner = msg.sender;
    }

1.3 [関数]送金する

送金する以上の預金がなければだめ。

    function transfer (address to, uint256 amount) external {
        require(balances[msg.sender] >= amount, "Not enough tokens.");
        console.log("sending %s tokens to %s from %s", amount, to, msg.sender);
        balances[msg.sender] -= amount;
        balances[to] += amount;
    }

1.4 [関数]残高照会

external view なので、Metamask の認証とかいらないやつ。

    function balanceOf (address to) external view returns (uint) {
        console.log("balance of %s is %s", to, balances[to]);
        return balances[to];
    }
} // end of Token Contract

2 とりあえずの Tokensimple.js

テスト

const {expect} = require('chai');

describe("Simple Token contract", function (){

2.1 全額オーナーに渡って初期化されていますか?

    it("Should be initiated with all to tokens owned by me.", async () => {
        const [owner] = await ethers.getSigners();

        const Token = await ethers.getContractFactory('Token');
        const hardhatToken = await Token.deploy();

        const ownerBalance = await hardhatToken.balanceOf(owner.address);

        expect(await hardhatToken.totalSupply()).to.equal(ownerBalance);
    });
}); // close describe

3 ながめのテスト Token.js

const {expect} = require('chai');
describe("Token contract", function (){

3.1 全てのテストに共通するやつをまとめる

    let Token;
    let hardhatToken;
    let owner;
    let a1;
    let a2;
    let a3;
    let addrs;

    beforeEach(async ()=>{
        Token = await ethers.getContractFactory('Token');
        [owner, a1, a2, a3, ...addrs] = await ethers.getSigners();

        hardhatToken = await Token.deploy();
    });

これでこれ以降のテストは、コントラクトがデプロイされて、使えるアドレスが数人いる状態になる。

3.2 Constructor ちゃんとできてる?

ちなみに describe はネストできる

    describe("Constructor", ()=>{

3.2.1 owner のアドレスあってる?

it("Should have the right owners address", async ()=>{
   expect(await hardhatToken.owner()).to.equal(owner.address);
});

3.2.2 owner に全部 token いってる??

it("Should have all tokens allocated to the owner", async ()=>{
    const totalSupply = await hardhatToken.totalSupply();
    const ownerBalance = await hardhatToken.balanceOf(owner.address);

   expect(ownerBalance).to.equal(totalSupply);
});
}); // - describe "Constructor"

3.3 Transaction それ以外ちゃんと動いてる?

3.3.1 他の人は誰も何も持ってないよね?

describe("Transaction", ()=>{
it("Others should have 0 balance", async ()=>{
    const balance = await hardhatToken.balanceOf(a1.address);

   expect(balance).to.equal(0);
});

3.3.2 お金持ってないのに送れないよね?

it("Should not be able to send money without sufficient funds", async ()=>{
    const balance = await hardhatToken.balanceOf(a1.address);

   await expect(
       hardhatToken.connect(a1).transfer(a2.address, 1)
   ).to.be.revertedWith("Not enough tokens.");
});

3.3.3 ちゃんと送金できてる?

it("Should be correctly transfered to others.", async ()=>{
    const amount = 50;
    await hardhatToken.transfer(a1.address, amount);
    const a1Balance = await hardhatToken.balanceOf(a1.address);
    expect(a1Balance).to.equal(amount);

    await hardhatToken.connect(a1).transfer(a2.address, amount);
    await hardhatToken.transfer(a2.address, amount);
    const a2Balance = await hardhatToken.balanceOf(a2.address);
    expect(a2Balance).to.equal(amount*2);
});

3.3.4 送金された減ってるよね?

it("Should loose tokens if we transfer", async ()=>{
    const amount = 50;
    const totalSupply = await hardhatToken.totalSupply();
    await hardhatToken.transfer(a1.address, amount);
    const balance = await hardhatToken.balanceOf(owner.address);
    expect(balance).to.equal(totalSupply - amount);
});
}); // - describe "Transaction"
}); // - describe "Token Contract"

Date: 2021-08-30 15:22

Author: Yasushi Sakai

Created: 2021-09-08 Wed 15:11