# [catatan blockchain 4] Token Balance

By [She Now with AI](https://paragraph.com/@she-now-with-ai) · 2023-01-11

---

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](https://storage.googleapis.com/papyrus_images/8d3eda7a40b245a8aed8069fad1394e518084feae7e67ae7ecc09a2eb85f716d.png)

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)
        })
        
    })
    
        
    })

---

*Originally published on [She Now with AI](https://paragraph.com/@she-now-with-ai/catatan-blockchain-4-token-balance)*
