[catatan blockchain 4] Token Balance

Bismillahirramanirrahim

Robbi zidnii ‘ilmaa, warzuqnii fahmaa, waj’alnii minash-sholihiin

Kodingan contracts/Token.sol sebelumnya

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

import "hardhat/console.sol";

contract Token {
    // deklarasikan variabel
    string public name;
    string public symbol;
    // decimals
    uint256 public decimals = 18;
    // total suply
    uint256 public totalSupply;

    constructor(string memory _name, string memory _symbol, uint256 _totalSupply) {
        name = _name;
        symbol = _symbol;
        totalSupply = _totalSupply * (10 ** decimals);
    }
}

kodingan test/Token.js sebelumnya

const { ethers } = require("hardhat");
const { expect } = require("chai");

const tokens = (n) => {
   return  ethers.utils.parseUnits(n.toString(), "ether")
}

describe("Token", () => {

    let token
    
    beforeEach(async() => {
        // fetch token from blockchain
        const Token = await ethers.getContractFactory("Token")
        token = await Token.deploy("Dallan", "DLN", "1000000")
    })

    describe("Deployment", () => {
        const name = "Dallan"
    const symbol = "DLN"
    const decimals = "18"
    const totalSupply = tokens("1000000")

    it("has a name", async() => {
        // check token name is correct
        expect(await token.name()).to.equal(name)
    })

    it("has correct symbol", async() => {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(symbol)
    })

    it("has correct decimals", async() => {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(decimals)
    })

    it("has correct total supply", async() => {
        // check token total suply is correct
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    
})

    
})

update Token.sol

    mapping(address => uint256) public balanceOf;

Ini adalah baris kode Solidity yang mendeklarasikan sebuah "mapping" bernama "balanceOf". Mapping adalah tipe data di Solidity yang digunakan untuk menyimpan koleksi data dengan kunci yang berbeda-beda. Dalam kode ini, mapping "balanceOf" digunakan untuk menyimpan saldo dari semua alamat Ethereum yang digunakan untuk menyimpan token.

Mapping ini dideklarasikan sebagai "public" sehingga ia dapat diakses oleh semua orang. Key dari mapping ini adalah tipe data "address" yang merupakan alamat Ethereum dan value nya adalah "uint256" yang merupakan jumlah token yang dimiliki oleh alamat tersebut.

Dalam hal ini, mapping "balanceOf" digunakan untuk menyimpan saldo token untuk setiap alamat Ethereum yang digunakan untuk menyimpan token, sehingga setiap alamat dapat mengecek saldo token mereka dengan mudah.

Penjelasan tambahan.

"mapping(address => uint256) public balanceOf" adalah baris kode Solidity yang digunakan untuk mendeklarasikan sebuah mapping bernama "balanceOf".

Mapping adalah tipe data yang digunakan dalam Solidity untuk menyimpan koleksi data dengan kunci yang berbeda-beda. Dalam hal ini, kunci dari mapping ini adalah tipe data "address" yang merupakan alamat Ethereum, dan nilai dari mapping ini adalah "uint256" yang merupakan jumlah token yang dimiliki oleh alamat tersebut.

Deklarasi "public" pada baris kode ini berarti bahwa mapping ini dapat diakses oleh semua orang, baik dari dalam kontrak atau dari luar kontrak. Ini berarti bahwa semua orang dapat mengecek saldo token pada sebuah alamat Ethereum dengan mudah, tanpa harus memanggil fungsi kontrak yang spesifik.

Secara umum, mapping ini digunakan untuk menyimpan saldo token untuk setiap alamat Ethereum yang digunakan untuk menyimpan token. Hal ini memungkinkan kontrak untuk melakukan perhitungan yang diperlukan untuk mentransfer token dari satu alamat ke alamat lain.

Update fungsi constructor

        balanceOf[msg.sender] = totalSupply;

penjelasan chatGPT

Kode "balanceOf[msg.sender] = totalSupply;" yang ditulis di dalam fungsi constructor setelah deklarasi mapping "balanceOf", digunakan untuk mengatur saldo awal dari alamat pengirim saat kontrak di-deploy.

"msg.sender" adalah built-in variable dalam Solidity yang menyimpan alamat dari pengirim yang melakukan transaksi saat ini, yang digunakan untuk menentukan alamat yang akan diatur saldo awalnya. "totalSupply" adalah variabel yang diisi dari constructor yang di passing saat kontrak di deploy.

Pada baris ini, saldo dari "msg.sender" ditentukan sama dengan totalSupply token yang tersedia. Ini berarti bahwa saat kontrak di-deploy, pengirim akan menerima saldo awal sejumlah totalSupply token yang disediakan.

Secara keseluruhan, ini digunakan untuk menentukan saldo awal token untuk pemilik kontrak, saat kontrak di-deploy ke blockchain. Ini akan memberikan saldo awal pada pemilik kontrak yang dapat digunakan untuk mentransfer token kepada pemegang lainnya.

Update Token.js

deklarasikan variabel deployer di fungsi describe “Token”

let deployer

beri nilai variable accounts dan deployer pada beforeEach

accounts = await ethers.getSigners() deployer = accounts[0]

tambahkan pengetesan balanceOf pada fungsi describe “Deployment”

it("assign total supply to deployer", async() => {
        expect(await token.balanceOf(deployer.address)).to.equal(totalSupply)
    })

Lakukan pengetesan

berhasil
berhasil

Update akhir

Token.sol

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

import "hardhat/console.sol";

contract Token {
    // deklarasikan variabel
    string public name;
    string public symbol;
    // decimals
    uint256 public decimals = 18;
    // total suply
    uint256 public totalSupply;

    // track blanaces
    mapping(address => uint256) public balanceOf;

    // send tokens

    constructor(string memory _name, string memory _symbol, uint256 _totalSupply) {
        name = _name;
        symbol = _symbol;
        totalSupply = _totalSupply * (10 ** decimals);
        balanceOf[msg.sender] = totalSupply;
    }

}

Token.js

const { ethers } = require("hardhat");
const { expect } = require("chai");

const tokens = (n) => {
   return  ethers.utils.parseUnits(n.toString(), "ether")
}

describe("Token", () => {

    let token
    let deployer
    beforeEach(async() => {
        // fetch token from blockchain
        const Token = await ethers.getContractFactory("Token")
        token = await Token.deploy("Dallan", "DLN", "1000000")
        accounts = await ethers.getSigners()
        deployer = accounts[0]

    })

    describe("Deployment", () => {
        const name = "Dallan"
    const symbol = "DLN"
    const decimals = "18"
    const totalSupply = tokens("1000000")

    it("has a name", async() => {
        // check token name is correct
        expect(await token.name()).to.equal(name)
    })

    it("has correct symbol", async() => {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(symbol)
    })

    it("has correct decimals", async() => {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(decimals)
    })

    it("has correct total supply", async() => {
        // check token total suply is correct
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    it("assign total supply to deployer", async() => {
        expect(await token.balanceOf(deployer.address)).to.equal(totalSupply)
    })
    
})

    
})