<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>She Now with AI</title>
        <link>https://paragraph.com/@she-now-with-ai</link>
        <description>Sinau bareng AI</description>
        <lastBuildDate>Thu, 23 Jul 2026 04:32:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>She Now with AI</title>
            <url>https://storage.googleapis.com/papyrus_images/673c3c022546313efd00f59e9b3e9f21e259a8c773cdb43ddcd0e53b87c632d5.png</url>
            <link>https://paragraph.com/@she-now-with-ai</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[[catatan blockchain 4] Token Balance]]></title>
            <link>https://paragraph.com/@she-now-with-ai/catatan-blockchain-4-token-balance</link>
            <guid>oMB12P76Cj2Ai1rhM2Hv</guid>
            <pubDate>Wed, 11 Jan 2023 05:45:32 GMT</pubDate>
            <description><![CDATA[BismillahirramanirrahimRobbi zidnii ‘ilmaa, warzuqnii fahmaa, waj’alnii minash-sholihiinKodingan 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 = _symb...]]></description>
            <content:encoded><![CDATA[<h2 id="h-bismillahirramanirrahim" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bismillahirramanirrahim</h2><h3 id="h-robbi-zidnii-ilmaa-warzuqnii-fahmaa-wajalnii-minash-sholihiin" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Robbi zidnii ‘ilmaa, warzuqnii fahmaa, waj’alnii minash-sholihiin</h3><p>Kodingan contracts/Token.sol sebelumnya</p><pre data-type="codeBlock" text="// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

import &quot;hardhat/console.sol&quot;;

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);
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: UNLICENSED</span>

<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.9;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"hardhat/console.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Token</span> </span>{
    <span class="hljs-comment">// deklarasikan variabel</span>
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> name;
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> symbol;
    <span class="hljs-comment">// decimals</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> decimals <span class="hljs-operator">=</span> <span class="hljs-number">18</span>;
    <span class="hljs-comment">// total suply</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> totalSupply;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _name, <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _symbol, <span class="hljs-keyword">uint256</span> _totalSupply</span>) </span>{
        name <span class="hljs-operator">=</span> _name;
        symbol <span class="hljs-operator">=</span> _symbol;
        totalSupply <span class="hljs-operator">=</span> _totalSupply <span class="hljs-operator">*</span> (<span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals);
    }
}
</code></pre><p>kodingan test/Token.js sebelumnya</p><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

const tokens = (n) =&gt; {
   return  ethers.utils.parseUnits(n.toString(), &quot;ether&quot;)
}

describe(&quot;Token&quot;, () =&gt; {

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

    describe(&quot;Deployment&quot;, () =&gt; {
        const name = &quot;Dallan&quot;
    const symbol = &quot;DLN&quot;
    const decimals = &quot;18&quot;
    const totalSupply = tokens(&quot;1000000&quot;)

    it(&quot;has a name&quot;, async() =&gt; {
        // check token name is correct
        expect(await token.name()).to.equal(name)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(symbol)
    })

    it(&quot;has correct decimals&quot;, async() =&gt; {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(decimals)
    })

    it(&quot;has correct total supply&quot;, async() =&gt; {
        // check token total suply is correct
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    
})

    
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

const tokens <span class="hljs-operator">=</span> (n) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
   <span class="hljs-keyword">return</span>  ethers.utils.parseUnits(n.toString(), <span class="hljs-string">"ether"</span>)
}

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token
    
    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy(<span class="hljs-string">"Dallan"</span>, <span class="hljs-string">"DLN"</span>, <span class="hljs-string">"1000000"</span>)
    })

    describe(<span class="hljs-string">"Deployment"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        const name <span class="hljs-operator">=</span> <span class="hljs-string">"Dallan"</span>
    const symbol <span class="hljs-operator">=</span> <span class="hljs-string">"DLN"</span>
    const decimals <span class="hljs-operator">=</span> <span class="hljs-string">"18"</span>
    const totalSupply <span class="hljs-operator">=</span> tokens(<span class="hljs-string">"1000000"</span>)

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token name is correct</span>
        expect(await token.<span class="hljs-built_in">name</span>()).to.equal(name)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.symbol()).to.equal(symbol)
    })

    it(<span class="hljs-string">"has correct decimals"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token decimals is correct</span>
        expect(await token.decimals()).to.equal(decimals)
    })

    it(<span class="hljs-string">"has correct total supply"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token total suply is correct</span>
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    
})

    
})
</code></pre><h3 id="h-update-tokensol" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">update Token.sol</h3><pre data-type="codeBlock" text="    mapping(address =&gt; uint256) public balanceOf;
"><code>    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> balanceOf;
</code></pre><p><code>Ini adalah baris kode Solidity yang mendeklarasikan sebuah &quot;mapping&quot; bernama &quot;balanceOf&quot;. Mapping adalah tipe data di Solidity yang digunakan untuk menyimpan koleksi data dengan kunci yang berbeda-beda. Dalam kode ini, mapping &quot;balanceOf&quot; digunakan untuk menyimpan saldo dari semua alamat Ethereum yang digunakan untuk menyimpan token.</code></p><p><code>Mapping ini dideklarasikan sebagai &quot;public&quot; sehingga ia dapat diakses oleh semua orang. Key dari mapping ini adalah tipe data &quot;address&quot; yang merupakan alamat Ethereum dan value nya adalah &quot;uint256&quot; yang merupakan jumlah token yang dimiliki oleh alamat tersebut.</code></p><p><code>Dalam hal ini, mapping &quot;balanceOf&quot; digunakan untuk menyimpan saldo token untuk setiap alamat Ethereum yang digunakan untuk menyimpan token, sehingga setiap alamat dapat mengecek saldo token mereka dengan mudah.</code></p><p>Penjelasan tambahan.</p><p><code>&quot;mapping(address =&gt; uint256) public balanceOf&quot; adalah baris kode Solidity yang digunakan untuk mendeklarasikan sebuah mapping bernama &quot;balanceOf&quot;.</code></p><p><code>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 &quot;address&quot; yang merupakan alamat Ethereum, dan nilai dari mapping ini adalah &quot;uint256&quot; yang merupakan jumlah token yang dimiliki oleh alamat tersebut.</code></p><p><code>Deklarasi &quot;public&quot; 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.</code></p><p><code>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.</code></p><h3 id="h-update-fungsi-constructor" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Update fungsi constructor</h3><pre data-type="codeBlock" text="        balanceOf[msg.sender] = totalSupply;
"><code>        balanceOf[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> totalSupply;
</code></pre><h3 id="h-penjelasan-chatgpt" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">penjelasan chatGPT</h3><p><code>Kode &quot;balanceOf[msg.sender] = totalSupply;&quot; yang ditulis di dalam fungsi constructor setelah deklarasi mapping &quot;balanceOf&quot;, digunakan untuk mengatur saldo awal dari alamat pengirim saat kontrak di-deploy.</code></p><p><code>&quot;msg.sender&quot; 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. &quot;totalSupply&quot; adalah variabel yang diisi dari constructor yang di passing saat kontrak di deploy.</code></p><p><code>Pada baris ini, saldo dari &quot;msg.sender&quot; ditentukan sama dengan totalSupply token yang tersedia. Ini berarti bahwa saat kontrak di-deploy, pengirim akan menerima saldo awal sejumlah totalSupply token yang disediakan.</code></p><p><code>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.</code></p><h2 id="h-update-tokenjs" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Update Token.js</h2><h3 id="h-deklarasikan-variabel-deployer-di-fungsi-describe-token" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">deklarasikan variabel deployer di fungsi describe “Token”</h3><p><code>let deployer</code></p><h3 id="h-beri-nilai-variable-accounts-dan-deployer-pada-beforeeach" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">beri nilai variable accounts dan deployer pada beforeEach</h3><p><code>accounts = await ethers.getSigners()</code> <code>deployer = accounts[0]</code></p><h3 id="h-tambahkan-pengetesan-balanceof-pada-fungsi-describe-deployment" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">tambahkan pengetesan balanceOf pada fungsi describe “Deployment”</h3><pre data-type="codeBlock" text="it(&quot;assign total supply to deployer&quot;, async() =&gt; {
        expect(await token.balanceOf(deployer.address)).to.equal(totalSupply)
    })
"><code>it(<span class="hljs-string">"assign total supply to deployer"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        expect(await token.balanceOf(deployer.<span class="hljs-built_in">address</span>)).to.equal(totalSupply)
    })
</code></pre><h2 id="h-lakukan-pengetesan" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lakukan pengetesan</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8d3eda7a40b245a8aed8069fad1394e518084feae7e67ae7ecc09a2eb85f716d.png" alt="berhasil" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">berhasil</figcaption></figure><h2 id="h-update-akhir" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Update akhir</h2><h3 id="h-tokensol" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Token.sol</h3><pre data-type="codeBlock" text="// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

import &quot;hardhat/console.sol&quot;;

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

    // track blanaces
    mapping(address =&gt; 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;
    }

}
"><code><span class="hljs-comment">// SPDX-License-Identifier: UNLICENSED</span>

<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.9;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"hardhat/console.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Token</span> </span>{
    <span class="hljs-comment">// deklarasikan variabel</span>
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> name;
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> symbol;
    <span class="hljs-comment">// decimals</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> decimals <span class="hljs-operator">=</span> <span class="hljs-number">18</span>;
    <span class="hljs-comment">// total suply</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> totalSupply;

    <span class="hljs-comment">// track blanaces</span>
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> balanceOf;

    <span class="hljs-comment">// send tokens</span>

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _name, <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _symbol, <span class="hljs-keyword">uint256</span> _totalSupply</span>) </span>{
        name <span class="hljs-operator">=</span> _name;
        symbol <span class="hljs-operator">=</span> _symbol;
        totalSupply <span class="hljs-operator">=</span> _totalSupply <span class="hljs-operator">*</span> (<span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals);
        balanceOf[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> totalSupply;
    }

}
</code></pre><h3 id="h-tokenjs" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Token.js</h3><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

const tokens = (n) =&gt; {
   return  ethers.utils.parseUnits(n.toString(), &quot;ether&quot;)
}

describe(&quot;Token&quot;, () =&gt; {

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

    })

    describe(&quot;Deployment&quot;, () =&gt; {
        const name = &quot;Dallan&quot;
    const symbol = &quot;DLN&quot;
    const decimals = &quot;18&quot;
    const totalSupply = tokens(&quot;1000000&quot;)

    it(&quot;has a name&quot;, async() =&gt; {
        // check token name is correct
        expect(await token.name()).to.equal(name)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(symbol)
    })

    it(&quot;has correct decimals&quot;, async() =&gt; {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(decimals)
    })

    it(&quot;has correct total supply&quot;, async() =&gt; {
        // check token total suply is correct
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    it(&quot;assign total supply to deployer&quot;, async() =&gt; {
        expect(await token.balanceOf(deployer.address)).to.equal(totalSupply)
    })
    
})

    
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

const tokens <span class="hljs-operator">=</span> (n) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
   <span class="hljs-keyword">return</span>  ethers.utils.parseUnits(n.toString(), <span class="hljs-string">"ether"</span>)
}

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token
    let deployer
    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy(<span class="hljs-string">"Dallan"</span>, <span class="hljs-string">"DLN"</span>, <span class="hljs-string">"1000000"</span>)
        accounts <span class="hljs-operator">=</span> await ethers.getSigners()
        deployer <span class="hljs-operator">=</span> accounts[<span class="hljs-number">0</span>]

    })

    describe(<span class="hljs-string">"Deployment"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        const name <span class="hljs-operator">=</span> <span class="hljs-string">"Dallan"</span>
    const symbol <span class="hljs-operator">=</span> <span class="hljs-string">"DLN"</span>
    const decimals <span class="hljs-operator">=</span> <span class="hljs-string">"18"</span>
    const totalSupply <span class="hljs-operator">=</span> tokens(<span class="hljs-string">"1000000"</span>)

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token name is correct</span>
        expect(await token.<span class="hljs-built_in">name</span>()).to.equal(name)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.symbol()).to.equal(symbol)
    })

    it(<span class="hljs-string">"has correct decimals"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token decimals is correct</span>
        expect(await token.decimals()).to.equal(decimals)
    })

    it(<span class="hljs-string">"has correct total supply"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token total suply is correct</span>
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    it(<span class="hljs-string">"assign total supply to deployer"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        expect(await token.balanceOf(deployer.<span class="hljs-built_in">address</span>)).to.equal(totalSupply)
    })
    
})

    
})
</code></pre>]]></content:encoded>
            <author>she-now-with-ai@newsletter.paragraph.com (She Now with AI)</author>
        </item>
        <item>
            <title><![CDATA[[catatan blockchain 4] Token Balances]]></title>
            <link>https://paragraph.com/@she-now-with-ai/catatan-blockchain-4-token-balances</link>
            <guid>VnpWQneyO0tTE9FFDutz</guid>
            <pubDate>Wed, 11 Jan 2023 05:42:52 GMT</pubDate>
            <description><![CDATA[BismillahirramanirrahimRobbi zidnii ‘ilmaa, warzuqnii fahmaa, waj’alnii minash-sholihiinKodingan 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 = _symb...]]></description>
            <content:encoded><![CDATA[<h2 id="h-bismillahirramanirrahim" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bismillahirramanirrahim</h2><h3 id="h-robbi-zidnii-ilmaa-warzuqnii-fahmaa-wajalnii-minash-sholihiin" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Robbi zidnii ‘ilmaa, warzuqnii fahmaa, waj’alnii minash-sholihiin</h3><p>Kodingan contracts/Token.sol sebelumnya</p><pre data-type="codeBlock" text="// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

import &quot;hardhat/console.sol&quot;;

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);
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: UNLICENSED</span>

<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.9;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"hardhat/console.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Token</span> </span>{
    <span class="hljs-comment">// deklarasikan variabel</span>
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> name;
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> symbol;
    <span class="hljs-comment">// decimals</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> decimals <span class="hljs-operator">=</span> <span class="hljs-number">18</span>;
    <span class="hljs-comment">// total suply</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> totalSupply;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _name, <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _symbol, <span class="hljs-keyword">uint256</span> _totalSupply</span>) </span>{
        name <span class="hljs-operator">=</span> _name;
        symbol <span class="hljs-operator">=</span> _symbol;
        totalSupply <span class="hljs-operator">=</span> _totalSupply <span class="hljs-operator">*</span> (<span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals);
    }
}
</code></pre><p>kodingan test/Token.js sebelumnya</p><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

const tokens = (n) =&gt; {
   return  ethers.utils.parseUnits(n.toString(), &quot;ether&quot;)
}

describe(&quot;Token&quot;, () =&gt; {

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

    describe(&quot;Deployment&quot;, () =&gt; {
        const name = &quot;Dallan&quot;
    const symbol = &quot;DLN&quot;
    const decimals = &quot;18&quot;
    const totalSupply = tokens(&quot;1000000&quot;)

    it(&quot;has a name&quot;, async() =&gt; {
        // check token name is correct
        expect(await token.name()).to.equal(name)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(symbol)
    })

    it(&quot;has correct decimals&quot;, async() =&gt; {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(decimals)
    })

    it(&quot;has correct total supply&quot;, async() =&gt; {
        // check token total suply is correct
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    
})

    
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

const tokens <span class="hljs-operator">=</span> (n) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
   <span class="hljs-keyword">return</span>  ethers.utils.parseUnits(n.toString(), <span class="hljs-string">"ether"</span>)
}

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token
    
    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy(<span class="hljs-string">"Dallan"</span>, <span class="hljs-string">"DLN"</span>, <span class="hljs-string">"1000000"</span>)
    })

    describe(<span class="hljs-string">"Deployment"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        const name <span class="hljs-operator">=</span> <span class="hljs-string">"Dallan"</span>
    const symbol <span class="hljs-operator">=</span> <span class="hljs-string">"DLN"</span>
    const decimals <span class="hljs-operator">=</span> <span class="hljs-string">"18"</span>
    const totalSupply <span class="hljs-operator">=</span> tokens(<span class="hljs-string">"1000000"</span>)

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token name is correct</span>
        expect(await token.<span class="hljs-built_in">name</span>()).to.equal(name)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.symbol()).to.equal(symbol)
    })

    it(<span class="hljs-string">"has correct decimals"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token decimals is correct</span>
        expect(await token.decimals()).to.equal(decimals)
    })

    it(<span class="hljs-string">"has correct total supply"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token total suply is correct</span>
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    
})

    
})
</code></pre><h3 id="h-update-tokensol" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">update Token.sol</h3><pre data-type="codeBlock" text="    mapping(address =&gt; uint256) public balanceOf;
"><code>    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> balanceOf;
</code></pre><p><code>Ini adalah baris kode Solidity yang mendeklarasikan sebuah &quot;mapping&quot; bernama &quot;balanceOf&quot;. Mapping adalah tipe data di Solidity yang digunakan untuk menyimpan koleksi data dengan kunci yang berbeda-beda. Dalam kode ini, mapping &quot;balanceOf&quot; digunakan untuk menyimpan saldo dari semua alamat Ethereum yang digunakan untuk menyimpan token.</code></p><p><code>Mapping ini dideklarasikan sebagai &quot;public&quot; sehingga ia dapat diakses oleh semua orang. Key dari mapping ini adalah tipe data &quot;address&quot; yang merupakan alamat Ethereum dan value nya adalah &quot;uint256&quot; yang merupakan jumlah token yang dimiliki oleh alamat tersebut.</code></p><p><code>Dalam hal ini, mapping &quot;balanceOf&quot; digunakan untuk menyimpan saldo token untuk setiap alamat Ethereum yang digunakan untuk menyimpan token, sehingga setiap alamat dapat mengecek saldo token mereka dengan mudah.</code></p><p>Penjelasan tambahan.</p><p><code>&quot;mapping(address =&gt; uint256) public balanceOf&quot; adalah baris kode Solidity yang digunakan untuk mendeklarasikan sebuah mapping bernama &quot;balanceOf&quot;.</code></p><p><code>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 &quot;address&quot; yang merupakan alamat Ethereum, dan nilai dari mapping ini adalah &quot;uint256&quot; yang merupakan jumlah token yang dimiliki oleh alamat tersebut.</code></p><p><code>Deklarasi &quot;public&quot; 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.</code></p><p><code>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.</code></p><h3 id="h-update-fungsi-constructor" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Update fungsi constructor</h3><pre data-type="codeBlock" text="        balanceOf[msg.sender] = totalSupply;
"><code>        balanceOf[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> totalSupply;
</code></pre><h3 id="h-penjelasan-chatgpt" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">penjelasan chatGPT</h3><p><code>Kode &quot;balanceOf[msg.sender] = totalSupply;&quot; yang ditulis di dalam fungsi constructor setelah deklarasi mapping &quot;balanceOf&quot;, digunakan untuk mengatur saldo awal dari alamat pengirim saat kontrak di-deploy.</code></p><p><code>&quot;msg.sender&quot; 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. &quot;totalSupply&quot; adalah variabel yang diisi dari constructor yang di passing saat kontrak di deploy.</code></p><p><code>Pada baris ini, saldo dari &quot;msg.sender&quot; ditentukan sama dengan totalSupply token yang tersedia. Ini berarti bahwa saat kontrak di-deploy, pengirim akan menerima saldo awal sejumlah totalSupply token yang disediakan.</code></p><p><code>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.</code></p><h2 id="h-update-tokenjs" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Update Token.js</h2><h3 id="h-deklarasikan-variabel-deployer-di-fungsi-describe-token" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">deklarasikan variabel deployer di fungsi describe “Token”</h3><p><code>let deployer</code></p><h3 id="h-beri-nilai-variable-accounts-dan-deployer-pada-beforeeach" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">beri nilai variable accounts dan deployer pada beforeEach</h3><p><code>accounts = await ethers.getSigners()</code> <code>deployer = accounts[0]</code></p><h3 id="h-tambahkan-pengetesan-balanceof-pada-fungsi-describe-deployment" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">tambahkan pengetesan balanceOf pada fungsi describe “Deployment”</h3><pre data-type="codeBlock" text="it(&quot;assign total supply to deployer&quot;, async() =&gt; {
        expect(await token.balanceOf(deployer.address)).to.equal(totalSupply)
    })
"><code>it(<span class="hljs-string">"assign total supply to deployer"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        expect(await token.balanceOf(deployer.<span class="hljs-built_in">address</span>)).to.equal(totalSupply)
    })
</code></pre><h2 id="h-lakukan-pengetesan" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Lakukan pengetesan</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8d3eda7a40b245a8aed8069fad1394e518084feae7e67ae7ecc09a2eb85f716d.png" alt="berhasil" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">berhasil</figcaption></figure><h2 id="h-update-akhir" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Update akhir</h2><h3 id="h-tokensol" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Token.sol</h3><pre data-type="codeBlock" text="// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

import &quot;hardhat/console.sol&quot;;

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

    // track blanaces
    mapping(address =&gt; 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;
    }

}
"><code><span class="hljs-comment">// SPDX-License-Identifier: UNLICENSED</span>

<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.9;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"hardhat/console.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Token</span> </span>{
    <span class="hljs-comment">// deklarasikan variabel</span>
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> name;
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> symbol;
    <span class="hljs-comment">// decimals</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> decimals <span class="hljs-operator">=</span> <span class="hljs-number">18</span>;
    <span class="hljs-comment">// total suply</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> totalSupply;

    <span class="hljs-comment">// track blanaces</span>
    <span class="hljs-keyword">mapping</span>(<span class="hljs-keyword">address</span> <span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-keyword">uint256</span>) <span class="hljs-keyword">public</span> balanceOf;

    <span class="hljs-comment">// send tokens</span>

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _name, <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _symbol, <span class="hljs-keyword">uint256</span> _totalSupply</span>) </span>{
        name <span class="hljs-operator">=</span> _name;
        symbol <span class="hljs-operator">=</span> _symbol;
        totalSupply <span class="hljs-operator">=</span> _totalSupply <span class="hljs-operator">*</span> (<span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals);
        balanceOf[<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>] <span class="hljs-operator">=</span> totalSupply;
    }

}
</code></pre><h3 id="h-tokenjs" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Token.js</h3><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

const tokens = (n) =&gt; {
   return  ethers.utils.parseUnits(n.toString(), &quot;ether&quot;)
}

describe(&quot;Token&quot;, () =&gt; {

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

    })

    describe(&quot;Deployment&quot;, () =&gt; {
        const name = &quot;Dallan&quot;
    const symbol = &quot;DLN&quot;
    const decimals = &quot;18&quot;
    const totalSupply = tokens(&quot;1000000&quot;)

    it(&quot;has a name&quot;, async() =&gt; {
        // check token name is correct
        expect(await token.name()).to.equal(name)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(symbol)
    })

    it(&quot;has correct decimals&quot;, async() =&gt; {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(decimals)
    })

    it(&quot;has correct total supply&quot;, async() =&gt; {
        // check token total suply is correct
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    it(&quot;assign total supply to deployer&quot;, async() =&gt; {
        expect(await token.balanceOf(deployer.address)).to.equal(totalSupply)
    })
    
})

    
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

const tokens <span class="hljs-operator">=</span> (n) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
   <span class="hljs-keyword">return</span>  ethers.utils.parseUnits(n.toString(), <span class="hljs-string">"ether"</span>)
}

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token
    let deployer
    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy(<span class="hljs-string">"Dallan"</span>, <span class="hljs-string">"DLN"</span>, <span class="hljs-string">"1000000"</span>)
        accounts <span class="hljs-operator">=</span> await ethers.getSigners()
        deployer <span class="hljs-operator">=</span> accounts[<span class="hljs-number">0</span>]

    })

    describe(<span class="hljs-string">"Deployment"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        const name <span class="hljs-operator">=</span> <span class="hljs-string">"Dallan"</span>
    const symbol <span class="hljs-operator">=</span> <span class="hljs-string">"DLN"</span>
    const decimals <span class="hljs-operator">=</span> <span class="hljs-string">"18"</span>
    const totalSupply <span class="hljs-operator">=</span> tokens(<span class="hljs-string">"1000000"</span>)

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token name is correct</span>
        expect(await token.<span class="hljs-built_in">name</span>()).to.equal(name)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.symbol()).to.equal(symbol)
    })

    it(<span class="hljs-string">"has correct decimals"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token decimals is correct</span>
        expect(await token.decimals()).to.equal(decimals)
    })

    it(<span class="hljs-string">"has correct total supply"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token total suply is correct</span>
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    it(<span class="hljs-string">"assign total supply to deployer"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        expect(await token.balanceOf(deployer.<span class="hljs-built_in">address</span>)).to.equal(totalSupply)
    })
    
})

    
})
</code></pre>]]></content:encoded>
            <author>she-now-with-ai@newsletter.paragraph.com (She Now with AI)</author>
        </item>
        <item>
            <title><![CDATA[[catatan blockchain 3] Testing Contract]]></title>
            <link>https://paragraph.com/@she-now-with-ai/catatan-blockchain-3-testing-contract</link>
            <guid>cypZ59O3UDsfIAE2cQ0r</guid>
            <pubDate>Wed, 11 Jan 2023 03:26:39 GMT</pubDate>
            <description><![CDATA[BismillahirrahmanirrahimIn the name of Allah, the Most Gracious, the Most Merciful. Ini adalah catatan ketiga belajar blockchain. touch test/Token.jsconst { ethers } = require("hardhat"); const { expect } = require("chai"); describe("Token", () => { it("has a name", async() => { // fetch token from blockchain const Token = await ethers.getContractFactory("Token") let token = await Token.deploy() // read token name const name = await token.name() // check token name is correct expect(name).to....]]></description>
            <content:encoded><![CDATA[<h2 id="h-bismillahirrahmanirrahim" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bismillahirrahmanirrahim</h2><p><strong>In the name of Allah, the Most Gracious, the Most Merciful.</strong></p><p>Ini adalah catatan ketiga belajar blockchain.</p><p><code>touch test/Token.js</code></p><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

describe(&quot;Token&quot;, () =&gt; {
    it(&quot;has a name&quot;, async() =&gt; {
        // fetch token from blockchain
        const Token = await ethers.getContractFactory(&quot;Token&quot;)
        let token = await Token.deploy()
        // read token name
        const name = await token.name()
        // check token name is correct
        expect(name).to.equal(&quot;Dallan&quot;)
    })

})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        let token <span class="hljs-operator">=</span> await Token.deploy()
        <span class="hljs-comment">// read token name</span>
        const name <span class="hljs-operator">=</span> await token.<span class="hljs-built_in">name</span>()
        <span class="hljs-comment">// check token name is correct</span>
        expect(name).to.equal(<span class="hljs-string">"Dallan"</span>)
    })

})
</code></pre><p><code>Kode di atas adalah contoh dari sebuah test unit yang ditulis menggunakan tools seperti Hardhat dan Chai. Test unit ini digunakan untuk menguji smart contract yang disebut &quot;Token&quot;. Pada kode ini, terdapat satu &quot;describe&quot; block yang diberi label &quot;Token&quot; dan satu &quot;it&quot; block didalamnya. &quot;Describe&quot; block digunakan untuk memberikan deskripsi umum dari apa yang diuji dalam test unit tersebut, sedangkan &quot;it&quot; block digunakan untuk memberikan deskripsi spesifik dari pengujian yang dilakukan.</code></p><p><code>Pengujian yang dilakukan dalam &quot;it&quot; block tersebut adalah untuk memastikan bahwa smart contract Token memiliki nama yang sesuai. Pertama, kode menggunakan objek ethers untuk mengambil factory contract dari smart contract &quot;Token&quot; yang didefinisikan di dalam kode. Kemudian smart contract tersebut di-deploy ke jaringan dan digunakan untuk memanggil fungsi name() yang diharapkan akan me-return nama dari smart contract tersebut. Kemudian, kode menggunakan fungsi expect dari library chai untuk membandingkan nama dari smart contract tersebut dengan nilai yang diharapkan (&quot;Dallan&quot;).</code></p><p><code>Jika nama dari smart contract tersebut sesuai dengan yang diharapkan, maka tes ini akan berhasil dan tidak menghasilkan error. Namun, jika nama yang diterima tidak sesuai dengan yang diharapkan, maka tes ini akan gagal dan akan menghasilkan error yang akan ditampilkan pada output.</code></p><p><code>npx hardhat test</code></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/916da3150d9fefd67ae66eda9f90230b5957a96d0c8572ed764cd464f0f375df.png" alt="test berhasil" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">test berhasil</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b3c057958be5df19cd3f12a8ad7495217654bd0c969f864e888bf5da3df92a47.png" alt="penampakan test gagal" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">penampakan test gagal</figcaption></figure><p>Lanjut mengkoding Token.sol untuk memenuhi standar erc-20 pada <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum.org/id/developers/docs/standards/tokens/erc-20/">dokumentasi ini</a></p><pre data-type="codeBlock" text="string public symbol = &quot;DLN&quot;;
"><code>string public <span class="hljs-attr">symbol</span> = <span class="hljs-string">"DLN"</span><span class="hljs-comment">;</span>
</code></pre><p>update test/Token.js</p><pre data-type="codeBlock" text=" it(&quot;has correct symbol&quot;, async() =&gt; {
        // fetch token from blockchain
        const Token = await ethers.getContractFactory(&quot;Token&quot;)
        let token = await Token.deploy()
        // read token symbol
        const symbol = await token.symbol()
        // check token symbol is correct
        expect(symbol).to.equal(&quot;DLN&quot;)
    })
"><code> it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        let token <span class="hljs-operator">=</span> await Token.deploy()
        <span class="hljs-comment">// read token symbol</span>
        const symbol <span class="hljs-operator">=</span> await token.symbol()
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(symbol).to.equal(<span class="hljs-string">"DLN"</span>)
    })
</code></pre><p>lakukan pengujian kembali</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e9681b322b0d1c5012e5da992855a0a4092f1eaf0ffdbe146006cde6fb37347d.png" alt="test berhasil" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">test berhasil</figcaption></figure><p>supaya kode di bawah tidak ditulis berulang kali, gunakan fungsi beforeEach</p><pre data-type="codeBlock" text="// fetch token from blockchain
        const Token = await ethers.getContractFactory(&quot;Token&quot;)
        let token = await Token.deploy()
"><code><span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        let token <span class="hljs-operator">=</span> await Token.deploy()
</code></pre><p>hasilnya seperti ini:</p><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

describe(&quot;Token&quot;, () =&gt; {

    let token

    beforeEach(async() =&gt; {
        // fetch token from blockchain
        const Token = await ethers.getContractFactory(&quot;Token&quot;)
        token = await Token.deploy()
    })

    it(&quot;has a name&quot;, async() =&gt; {
        // read token name
        const name = await token.name()
        // check token name is correct
        expect(name).to.equal(&quot;Dallan&quot;)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // read token symbol
        const symbol = await token.symbol()
        // check token symbol is correct
        expect(symbol).to.equal(&quot;DLN&quot;)
    })
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token

    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy()
    })

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// read token name</span>
        const name <span class="hljs-operator">=</span> await token.<span class="hljs-built_in">name</span>()
        <span class="hljs-comment">// check token name is correct</span>
        expect(name).to.equal(<span class="hljs-string">"Dallan"</span>)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// read token symbol</span>
        const symbol <span class="hljs-operator">=</span> await token.symbol()
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(symbol).to.equal(<span class="hljs-string">"DLN"</span>)
    })
})
</code></pre><p><code>Ini adalah kode JavaScript yang digunakan untuk melakukan pengujian pada smart contract yang disebut &quot;Token&quot; menggunakan tool bernama Hardhat dan library Chai.</code></p><p><code>Pada baris pertama, kode ini mengimport objek &quot;ethers&quot; dari paket &quot;hardhat&quot; dan objek &quot;expect&quot; dari paket &quot;chai&quot;. Objek &quot;ethers&quot; digunakan untuk bekerja dengan smart contract pada blockchain, sementara objek &quot;expect&quot; digunakan untuk menuliskan asumsi yang harus dipenuhi oleh smart contract yang diuji.</code></p><p><code>Setelah itu, ada sebuah fungsi &quot;describe&quot; dengan parameter &quot;Token&quot;, yang digunakan untuk menjelaskan apa yang diuji dalam pengujian ini.</code></p><p><code>Didalam fungsi tersebut, ada sebuah variable token yang akan diisi dari hasil deploy dari contract factory &quot;Token&quot; pada fungsi beforeEach() yang dijalankan sebelum setiap pengujian.</code></p><p><code>Lalu ada dua fungsi &quot;it&quot; dengan parameter yang berbeda, yang digunakan untuk menjelaskan apa yang diuji dalam setiap pengujian. Pada fungsi pertama, kode akan mengecek apakah nama dari token sesuai dengan yang diharapkan dengan mengeksekusi perintah .name() pada token dan mengecek apakah hasilnya sama dengan string &quot;Dallan&quot; menggunakan perintah expect(). Pada fungsi kedua, kode akan mengecek apakah simbol dari token sesuai dengan yang diharapkan dengan mengeksekusi perintah .symbol() pada token dan mengecek apakah hasilnya sama dengan string &quot;DLN&quot; menggunakan perintah expect().</code></p><p>Supaya kodingannya lebih bersih nan rapih, pindahhkan nilai variabel name dan symbol ke parameter fungsi expect menggantikan parameter name dan symbol sebelumnya alih-alih dijadikan nilai variabel, sehingga hasilnya jadi seperti ini:</p><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

describe(&quot;Token&quot;, () =&gt; {

    let token

    beforeEach(async() =&gt; {
        // fetch token from blockchain
        const Token = await ethers.getContractFactory(&quot;Token&quot;)
        token = await Token.deploy()
    })

    it(&quot;has a name&quot;, async() =&gt; {
        // check token name is correct
        expect(await token.name()).to.equal(&quot;Dallan&quot;)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(&quot;DLN&quot;)
    })
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token

    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy()
    })

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token name is correct</span>
        expect(await token.<span class="hljs-built_in">name</span>()).to.equal(<span class="hljs-string">"Dallan"</span>)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.symbol()).to.equal(<span class="hljs-string">"DLN"</span>)
    })
})
</code></pre><p><code>Ini adalah sebuah skrip testing untuk sebuah kontrak smart contract yang bernama &quot;Token&quot; menggunakan library &quot;hardhat&quot; dan &quot;chai&quot; di JavaScript. Skrip ini mengecek nama dan simbol dari token yang di-deploy di blockchain.</code></p><p><code>Secara umum, skrip ini melakukan hal-hal berikut:</code></p><ol><li><p><code>Memuat library &quot;hardhat&quot; dan &quot;chai&quot; yang digunakan untuk mengeksekusi skrip ini.</code></p></li><li><p><code>Mendefinisikan sebuah blok &quot;describe&quot; yang berisi dua blok &quot;it&quot; yang menjelaskan dua fungsi yang akan diuji.</code></p></li><li><p><code>Blok &quot;beforeEach&quot; dijalankan sebelum setiap fungsi &quot;it&quot;, digunakan untuk meng-instantiate kontrak smart contract baru dari &quot;Token&quot; dari blockchain</code></p></li><li><p><code>Fungsi &quot;it&quot; pertama mengecek nama dari token yang di-deploy dengan mengeksekusi fungsi &quot;name()&quot; dari kontrak dan mengecek apakah sesuai dengan string &quot;Dallan&quot; menggunakan &quot;expect&quot; dari chai.</code></p></li><li><p><code>Fungsi &quot;it&quot; kedua mengecek simbol dari token yang di-deploy dengan mengeksekusi fungsi &quot;symbol()&quot; dari kontrak dan mengecek apakah sesuai dengan string &quot;DLN&quot; menggunakan &quot;expect&quot; dari chai.</code></p></li></ol><p>Lanjut mengkoding Token.sol tambahkan variabel decimals dengan nilai 18, variabel ini bertipe uint256 di mana maksudnya adalah uint (angka non negatif, dan 256 pada jumlah bits. Nilai 18 adalah standar erc-20 di mana ada 18 angka di belakang koma.</p><pre data-type="codeBlock" text="    uint256 public decimals = 18;
"><code>    uint256 public <span class="hljs-attr">decimals</span> = <span class="hljs-number">18</span><span class="hljs-comment">;</span>
</code></pre><p>Update Token.js</p><pre data-type="codeBlock" text="it(&quot;has correct decimals&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.decimals()).to.equal(&quot;18&quot;)
    })
"><code>it(<span class="hljs-string">"has correct decimals"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.decimals()).to.equal(<span class="hljs-string">"18"</span>)
    })
</code></pre><p>lakukan testing contract</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/0b8de4b672987ec80b7ece4e142ddd45dafa609a14343d29ebdb3926d816fa1f.png" alt="berhasil" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">berhasil</figcaption></figure><p>lanjut mengkoding Token.sol. Kali ini mendeklarasikan variabel totalSuply menggunakan satuan wei, jadi rumusnya total suplai x 10^18</p><pre data-type="codeBlock" text="    uint256 public totalSuply = 1000000 * (10 ** decimals); // total suply diubah ke satuan wei
"><code>    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> totalSuply <span class="hljs-operator">=</span> <span class="hljs-number">1000000</span> <span class="hljs-operator">*</span> (<span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals); <span class="hljs-comment">// total suply diubah ke satuan wei</span>
</code></pre><p>lalu update kembali Token.js</p><pre data-type="codeBlock" text="it(&quot;has correct total suply&quot;, async() =&gt; {
        // check token total suply is correct
        const value = ethers.utils.parseUnits(&quot;1000000&quot;, &quot;ether&quot;)
        expect(await token.totalSuply()).to.equal(value)
    })
"><code>it(<span class="hljs-string">"has correct total suply"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token total suply is correct</span>
        const value <span class="hljs-operator">=</span> ethers.utils.parseUnits(<span class="hljs-string">"1000000"</span>, <span class="hljs-string">"ether"</span>)
        expect(await token.totalSuply()).to.equal(value)
    })
</code></pre><p><code>ethers.utils.parseUnits(&quot;1000000&quot;, &quot;ether&quot;) adalah fungsi dari library Ethers.js yang digunakan untuk mengubah input angka dari satuan wei (yang merupakan satuan dasar dalam Ethereum) ke satuan yang lebih besar, seperti ether.</code></p><p><code>Fungsi ini menerima dua argumen:</code></p><ol><li><p><code>Input angka yang akan dikonversi, dalam contoh ini adalah &quot;1000000&quot;</code></p></li><li><p><code>Satuan tujuan yang ingin digunakan, dalam contoh ini adalah &quot;ether&quot;</code></p></li></ol><p><code>Jadi, hasil dari ethers.utils.parseUnits(&quot;1000000&quot;, &quot;ether&quot;) adalah sebuah bilangan yang menunjukkan bahwa 1000000 wei setara dengan 1 ether.</code></p><p><code>Informasi tambahan, 1 Ether setara dengan 10^18 wei, jadi dari kode diatas, 1000000 wei setara dengan 1 Ether</code> Jadi angka 1000000 adalah total suply token.</p><p>Jangan lupa testing kembali</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a9b01ebd5173b0cd24f1d689f6f7e2e68410a0305f8a7cb9956552146859fcdd.png" alt="berhasil" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">berhasil</figcaption></figure><p>supaya dinamis dalam menentukan total supply, bisa menggunakan cara ini:</p><p>buat fungsi tokens yang punya parameter n diluar describe.</p><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

const tokens = (n) =&gt; {
   return  ethers.utils.parseUnits(n.toString(), &quot;ether&quot;)
}

describe(&quot;Token&quot;, () =&gt; {

    let token

    beforeEach(async() =&gt; {
        // fetch token from blockchain
        const Token = await ethers.getContractFactory(&quot;Token&quot;)
        token = await Token.deploy()
    })

    it(&quot;has a name&quot;, async() =&gt; {
        // check token name is correct
        expect(await token.name()).to.equal(&quot;Dallan&quot;)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(&quot;DLN&quot;)
    })

    it(&quot;has correct decimals&quot;, async() =&gt; {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(&quot;18&quot;)
    })

    it(&quot;has correct total suply&quot;, async() =&gt; {
        // check token total suply is correct
        const value = tokens(&quot;1000000&quot;)
        expect(await token.totalSuply()).to.equal(value)
    })
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

const tokens <span class="hljs-operator">=</span> (n) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
   <span class="hljs-keyword">return</span>  ethers.utils.parseUnits(n.toString(), <span class="hljs-string">"ether"</span>)
}

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token

    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy()
    })

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token name is correct</span>
        expect(await token.<span class="hljs-built_in">name</span>()).to.equal(<span class="hljs-string">"Dallan"</span>)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.symbol()).to.equal(<span class="hljs-string">"DLN"</span>)
    })

    it(<span class="hljs-string">"has correct decimals"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token decimals is correct</span>
        expect(await token.decimals()).to.equal(<span class="hljs-string">"18"</span>)
    })

    it(<span class="hljs-string">"has correct total suply"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token total suply is correct</span>
        const value <span class="hljs-operator">=</span> tokens(<span class="hljs-string">"1000000"</span>)
        expect(await token.totalSuply()).to.equal(value)
    })
})
</code></pre><p><code>Kode di atas ditulis dalam bahasa JavaScript dan menggunakan framework Mocha untuk menguji smart contract yang disebut &quot;Token.&quot;</code></p><ul><li><p><code>Baris pertama dan kedua mengimpor modul &apos;ethers&apos; dan &apos;chai&apos; yang akan digunakan untuk berinteraksi dengan smart contract dan melakukan asumsi, masing-masing.</code></p></li><li><p><code>Fungsi &apos;tokens&apos; mengambil sebuah angka sebagai input dan mengembalikan angka tersebut dalam wei, unit terkecil dari ether.</code></p></li><li><p><code>Fungsi &apos;describe&apos; dari Mocha yang digunakan untuk menjelaskan suite dari tes</code></p></li><li><p><code>Fungsi &apos;beforeEach&apos; dari Mocha, yang akan dijalankan sebelum setiap tes &apos;it&apos;</code></p></li><li><p><code>Dalam fungsi &apos;beforeEach&apos;, sebuah instance baru dari smart contract di-deploy ke blockchain menggunakan modul &apos;ethers&apos;.</code></p></li><li><p><code>Fungsi &apos;it&apos; adalah tes Mocha, setiap satu melakukan asumsi terhadap instance smart contract untuk memastikan properti-properti kontrak ditetapkan dengan benar.</code></p></li><li><p><code>Dalam tes pertama, kode akan memeriksa apakah fungsi &quot;name&quot; dari kontrak mengembalikan &quot;Dallan&quot;</code></p></li><li><p><code>Dalam tes kedua, kode akan memeriksa apakah fungsi &quot;symbol&quot; dari kontrak mengembalikan &quot;DLN&quot;</code></p></li><li><p><code>Dalam tes ketiga, kode akan memeriksa apakah fungsi &quot;decimals&quot; dari kontrak mengembalikan &quot;18&quot;</code></p></li><li><p><code>Dalam tes keempat, kode akan memeriksa apakah fungsi &quot;totalSupply&quot; dari kontrak mengembalikan jumlah ether yang benar dengan menggunakan fungsi &apos;tokens()&apos; untuk mengonversi ether menjadi wei sebelum memeriksa nilai total supply Tolong diperhatikan bahwa kode ini menggunakan lingkungan hardhat, dan mungkin tidak berjalan di EVM lainnya.</code></p></li></ul><h2 id="h-update-contracttokensol" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Update contract/Token.sol</h2><pre data-type="codeBlock" text="// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.9;

import &quot;hardhat/console.sol&quot;;

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);
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: UNLICENSED</span>

<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.9;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"hardhat/console.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Token</span> </span>{
    <span class="hljs-comment">// deklarasikan variabel</span>
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> name;
    <span class="hljs-keyword">string</span> <span class="hljs-keyword">public</span> symbol;
    <span class="hljs-comment">// decimals</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> decimals <span class="hljs-operator">=</span> <span class="hljs-number">18</span>;
    <span class="hljs-comment">// total suply</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">public</span> totalSupply;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _name, <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> _symbol, <span class="hljs-keyword">uint256</span> _totalSupply</span>) </span>{
        name <span class="hljs-operator">=</span> _name;
        symbol <span class="hljs-operator">=</span> _symbol;
        totalSupply <span class="hljs-operator">=</span> _totalSupply <span class="hljs-operator">*</span> (<span class="hljs-number">10</span> <span class="hljs-operator">*</span><span class="hljs-operator">*</span> decimals);
    }
}
</code></pre><h3 id="h-penjelasan-chatgpt" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Penjelasan ChatGPT</h3><p><code>Ini adalah kode Solidity yang menunjukkan implementasi dasar dari sebuah kontrak smart contract bernama &quot;Token&quot;. Kontrak ini digunakan untuk menyimpan informasi tentang sebuah token, seperti nama, simbol, jumlah desimal, dan jumlah total yang beredar.</code></p><p><code>Kontrak ini mendeklarasikan beberapa variabel publik yaitu &quot;name&quot;, &quot;symbol&quot;, &quot;decimals&quot;, dan &quot;totalSupply&quot; yang digunakan untuk menyimpan informasi tentang token tersebut. Variabel &quot;name&quot; dan &quot;symbol&quot; disimpan sebagai string, &quot;decimals&quot; sebagai uint256 (unsigned integer dengan ukuran 256 bit) dan &quot;totalSupply&quot; juga dalam uint256.</code></p><p><code>Kontrak ini juga memiliki sebuah constructor, yaitu sebuah fungsi yang dijalankan saat kontrak di-deploy ke blockchain. Constructor ini menerima tiga argumen: _name, _symbol, dan _totalSupply. Argumen ini digunakan untuk mengatur nilai variabel publik &quot;name&quot;, &quot;symbol&quot;, dan &quot;totalSupply&quot; saat kontrak di-deploy.</code></p><p><code>Kontrak juga menentukan jumlah total supply sesuai dengan jumlah desimal, totalSupply = _totalSupply * (10 ** decimals)</code></p><p><code>Kontrak ini tidak memiliki fungsi apapun selain constructor, sehingga tidak bisa digunakan untuk mengirim atau mentransfer token, atau mengubah informasi token setelah kontrak di-deploy.</code></p><h2 id="h-update-testtokenjs" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Update test/Token.js</h2><pre data-type="codeBlock" text="const { ethers } = require(&quot;hardhat&quot;);
const { expect } = require(&quot;chai&quot;);

const tokens = (n) =&gt; {
   return  ethers.utils.parseUnits(n.toString(), &quot;ether&quot;)
}

describe(&quot;Token&quot;, () =&gt; {

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

    describe(&quot;Deployment&quot;, () =&gt; {
        const name = &quot;Dallan&quot;
    const symbol = &quot;DLN&quot;
    const decimals = &quot;18&quot;
    const totalSupply = tokens(&quot;1000000&quot;)

    it(&quot;has a name&quot;, async() =&gt; {
        // check token name is correct
        expect(await token.name()).to.equal(name)
    })

    it(&quot;has correct symbol&quot;, async() =&gt; {
        // check token symbol is correct
        expect(await token.symbol()).to.equal(symbol)
    })

    it(&quot;has correct decimals&quot;, async() =&gt; {
        // check token decimals is correct
        expect(await token.decimals()).to.equal(decimals)
    })

    it(&quot;has correct total supply&quot;, async() =&gt; {
        // check token total suply is correct
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    
})

    
})
"><code>const { ethers } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"hardhat"</span>);
const { expect } <span class="hljs-operator">=</span> <span class="hljs-built_in">require</span>(<span class="hljs-string">"chai"</span>);

const tokens <span class="hljs-operator">=</span> (n) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
   <span class="hljs-keyword">return</span>  ethers.utils.parseUnits(n.toString(), <span class="hljs-string">"ether"</span>)
}

describe(<span class="hljs-string">"Token"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {

    let token
    
    beforeEach(async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// fetch token from blockchain</span>
        const Token <span class="hljs-operator">=</span> await ethers.getContractFactory(<span class="hljs-string">"Token"</span>)
        token <span class="hljs-operator">=</span> await Token.deploy(<span class="hljs-string">"Dallan"</span>, <span class="hljs-string">"DLN"</span>, <span class="hljs-string">"1000000"</span>)
    })

    describe(<span class="hljs-string">"Deployment"</span>, () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        const name <span class="hljs-operator">=</span> <span class="hljs-string">"Dallan"</span>
    const symbol <span class="hljs-operator">=</span> <span class="hljs-string">"DLN"</span>
    const decimals <span class="hljs-operator">=</span> <span class="hljs-string">"18"</span>
    const totalSupply <span class="hljs-operator">=</span> tokens(<span class="hljs-string">"1000000"</span>)

    it(<span class="hljs-string">"has a name"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token name is correct</span>
        expect(await token.<span class="hljs-built_in">name</span>()).to.equal(name)
    })

    it(<span class="hljs-string">"has correct symbol"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token symbol is correct</span>
        expect(await token.symbol()).to.equal(symbol)
    })

    it(<span class="hljs-string">"has correct decimals"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token decimals is correct</span>
        expect(await token.decimals()).to.equal(decimals)
    })

    it(<span class="hljs-string">"has correct total supply"</span>, async() <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
        <span class="hljs-comment">// check token total suply is correct</span>
        expect(await token.totalSupply()).to.equal(totalSupply)
    })

    
})

    
})
</code></pre><h3 id="h-ini-adalah-kode-javascript-yang-menggunakan-perpustakaan-hardhat-dan-chai-kode-tersebut-mendefinisikan-sebuah-fungsi-bernama-tokens-yang-digunakan-untuk-mengubah-input-angka-ke-jumlah-token-dalam-wei-denominasi-terkecil-dari-ether-menggunakan-metode-parseunits-kemudian-kode-tersebut-menggunakan-framework-tes-chai-untuk-mengecek-apakah-kontrak-smart-contract-yang-di-deploy-telah-didefinisikan-dengan-benar" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Ini adalah kode JavaScript yang menggunakan perpustakaan Hardhat dan Chai. Kode tersebut mendefinisikan sebuah fungsi bernama &quot;tokens&quot; yang digunakan untuk mengubah input angka ke jumlah token dalam wei (denominasi terkecil dari ether) menggunakan metode parseUnits(). Kemudian, kode tersebut menggunakan framework tes Chai untuk mengecek apakah kontrak smart contract yang di-deploy telah didefinisikan dengan benar.</h3><p><code>Di dalam blok kode yang diberi label &quot;describe(&apos;Token&apos;)&quot;, di mana di dalamnya terdapat beberapa unit test yang diberi label &quot;describe(&apos;Deployment&apos;)&quot; . Diantaranya, unit test mengecek apakah nama kontrak sesuai dengan yang diharapkan, apakah simbol sesuai dengan yang diharapkan, apakah jumlah desimal sesuai dengan yang diharapkan dan apakah jumlah total sesuai dengan yang diharapkan.</code></p><p><code>Unit test ini akan dijalankan sebelum setiap unit test yang berada di dalam blok &quot;describe(&apos;Deployment&apos;)&quot; dijalankan , untuk mengambil kontrak dari blockchain dan menyimpan dalam variabel token. Kemudian, sebelum setiap unit test dijalankan, fungsi tersebut akan mengecek apakah properti kontrak sesuai dengan yang diharapkan dengan menggunakan perintah expect() dari Chai.</code></p><h2 id="h-hasil-testing" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Hasil testing</h2><p><code>npx hardhat test</code></p>]]></content:encoded>
            <author>she-now-with-ai@newsletter.paragraph.com (She Now with AI)</author>
        </item>
        <item>
            <title><![CDATA[[catatan blockchain 1] Mempersiapkan Proyek Blockchain]]></title>
            <link>https://paragraph.com/@she-now-with-ai/catatan-blockchain-1-mempersiapkan-proyek-blockchain</link>
            <guid>GMUyXH0AUETIhMSP4IoD</guid>
            <pubDate>Mon, 09 Jan 2023 04:08:54 GMT</pubDate>
            <description><![CDATA[BismillahirrahmanirrahimIn the name of Allah, the Most Gracious, the Most Merciful.Mempersiapkan proyek blockchain menggunakan HardhatMembuat folder baru yang akan diisi dengan modul react. flag --use-npm dipakai untuk debugging. Setelah itu masuk ke root folder proyek dengan perintah cd [nama folder]catatan: tidak perlu membuat folder proyek terlebih dahulu, karena perintah di bawah otomatis akan membuat folder tersebut.perintah: npx create-react-app [nama folder proyek] --use-npm Install de...]]></description>
            <content:encoded><![CDATA[<h2 id="h-bismillahirrahmanirrahim" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bismillahirrahmanirrahim</h2><p><strong>In the name of Allah, the Most Gracious, the Most Merciful.</strong></p><h3 id="h-mempersiapkan-proyek-blockchain-menggunakan-hardhat" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Mempersiapkan proyek blockchain menggunakan Hardhat</h3><p><strong>Membuat folder baru yang akan diisi dengan modul react.</strong></p><p>flag <code>--use-npm</code> dipakai untuk debugging.<br>Setelah itu masuk ke root folder proyek dengan perintah <code>cd [nama folder]</code></p><ul><li><p>catatan: tidak perlu membuat folder proyek terlebih dahulu, karena perintah di bawah otomatis akan membuat folder tersebut.</p></li></ul><p>perintah:</p><p><code>npx create-react-app [nama folder proyek] --use-npm</code></p><p><strong>Install dependency</strong></p><p><code>npm install [nama paket]</code></p><p>paket: dotenv, lodash, moment, react-apexcharts, react-blockies, react-redux, redux, redux-devtools-extension, redux-thunk, reselect.</p><p>ini dependensi yang hanya digunakan dalam tahap pengembangan.</p><p><code>npm install [nama paket] --save-dev</code></p><p>paket: @nomicfoundation/hardhat-toolbox, @nomiclabs/hardhat-ethers, chai, ethers, hardhat.</p><p><strong>Membuat proyek menggunakan hardhat</strong> <code>npx hardhat</code></p><p>pilih ***create a javascript project ***catatan: jika di folder root terdapat file README.md maka hapus terlebih dahulu file tersebut. Pada folder root akan bertambah folder dan file baru yang merupakan template dari hardhat.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b71c30564f84e849753bf63a449c2941cd46153e0d140b51f14cff07abe299df.png" alt="template smart contract dari hardhat" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">template smart contract dari hardhat</figcaption></figure><p><strong>bikin file .env di root folder</strong> jika dari terminal: <code>touch .env</code> jika dari code editor: new file -&gt; .env</p><p><em>.env merupakan file yang digunakan untuk menyimpan variable environment atau konfigurasi proyek. File ini biasanya digunakan untuk menyimpan informasi yang tidak boleh dibagikan kepada orang lain, seperti password, API key, atau konfigurasi database. Dengan menggunakan file .env, Anda dapat dengan mudah mengelola konfigurasi proyek Anda tanpa perlu mengubah kode sumber proyek Anda.**</em></p><p>pada file .gitignore terdapat .env pada daftar, yang artinya file ini tidak dibagikan ke publik.</p><p><strong>tambahkan .env ke hardhat.config.js</strong> <code>require(&quot;dotenv&quot;).config();</code> konfigurasi selengkapnya akan dibahas di catatan berikutnya.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f1b9e20fdd31b8bbd44360a31725b071704ed7abda9d6d69a1285bccbb248993.png" alt="nambahin dotenv ke hardhat.config.js (cek line 2)" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">nambahin dotenv ke hardhat.config.js (cek line 2)</figcaption></figure><p>========</p><p><em>Git adalah sistem pengontrol versi yang digunakan untuk mengelola perubahan pada dokumen atau file dari waktu ke waktu. Ini sangat berguna jika Anda bekerja pada proyek yang membutuhkan banyak colaborator, atau jika Anda ingin mengatur versi dari dokumen atau file yang Anda buat. **</em></p><p><em>Git menyimpan sejarah perubahan yang telah dilakukan pada file atau dokumen, sehingga Anda dapat dengan mudah kembali ke versi sebelumnya jika diperlukan. Git juga memungkinkan Anda untuk mengelola branch (cabang) proyek, yang memungkinkan Anda untuk mengembangkan fitur baru atau memperbaiki bug tanpa mengganggu versi utama proyek.**</em></p><p><strong><em>Jadi git bisa dipakai untuk:</em></strong></p><ul><li><p><strong><em>mengontrol versi file/dokumen.</em></strong></p></li><li><p><strong><em>mengelola perubahan yang dilakukan baik oleh diri sendiri maupun orang lain.</em></strong></p></li><li><p><strong><em>berkolaborasi dalam pengembangan proyek dengan orang lain.</em></strong></p></li><li><p><strong><em>mengelola branch proyek untuk perbaikan bug atau pengembangan fitur.</em></strong></p></li><li><p><strong><em>kembali ke versi sebelumnya jika versi terbaru ada kesalahan.</em></strong></p></li></ul><p><strong>cek git status untuk melihat file yang di-track</strong> <code>git status</code></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b01c4d2f8b274bca232584390ebb4a7da38b9fa4ef59ba397e2dff08be52436d.png" alt="file belum di-track ditandai dengan warna merah" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">file belum di-track ditandai dengan warna merah</figcaption></figure><p><strong>tambahkan semua file ke repository git.</strong> <em>&quot;git add .&quot; adalah perintah yang digunakan untuk menambahkan semua file yang telah diubah ke daftar file yang akan di-commit (disimpan) ke repository Git. Perintah ini akan menambahkan semua file yang ada di direktori kerja Anda ke daftar file yang akan di-commit, termasuk file baru yang belum pernah di-commit sebelumnya. **</em> <code>git add .</code> cek git status untuk melihat perubahannya.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5262f06cbcd855e63127e8ae600d8fb310d7d060e24f03ce994b8ffa4fa759ea.png" alt="file sudah ditrack setelah menjalankan perintah &quot;git add .&quot; ditandai dengan warna hijau" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">file sudah ditrack setelah menjalankan perintah &quot;git add .&quot; ditandai dengan warna hijau</figcaption></figure><p><strong>simpan file ke repository</strong> <em>&quot;git commit -am&quot; adalah perintah yang digunakan untuk menyimpan perubahan pada file yang telah diubah ke repository Git. Perintah ini akan menambahkan semua file yang telah diubah ke daftar file yang akan di-commit, lalu menyimpan perubahan tersebut ke repository Git sebagai satu commit baru.</em></p><p><em>Perintah git commit -am merupakan gabungan dari dua perintah Git yaitu &quot;git add .&quot; dan &quot;git commit.&quot; &quot;git add .&quot; akan menambahkan semua file yang telah diubah ke daftar file yang akan di-commit, sedangkan git commit akan menyimpan perubahan tersebut ke repository Git. Perintah git commit -am sangat berguna jika Anda ingin menyimpan perubahan pada file yang telah diubah tanpa perlu menjalankan perintah git add terlebih dahulu. Namun, perintah ini hanya dapat digunakan untuk file yang telah di-track (dimonitor) oleh Git, yaitu file yang telah pernah di-commit sebelumnya atau file yang telah ditambahkan ke daftar file yang akan di-commit dengan git add. **</em></p><p><code>git commit -am &quot;komentar&quot;</code></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bf7f8d77eceb998a8dad87b0e5ac1a89dfc478d046609738203073c5c83d0412.png" alt="commit proyek" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">commit proyek</figcaption></figure><p>==========</p><p>Begitulah, catatan mengenai membuat--atau lebih tepatnya mempersiapkan--proyek blockchain baru. Mudah-mudahan bisa belajar sampai kelar.</p><p>sumber belajar:<br>** copas dari bang chatGPT<br>install npm: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://stackoverflow.com/questions/39981828/installing-nodejs-and-npm-on-linux">https://stackoverflow.com/questions/39981828/installing-nodejs-and-npm-on-linux</a> install npx: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://stackoverflow.com/questions/49894620/npx-command-not-found">https://stackoverflow.com/questions/49894620/npx-command-not-found</a> install git: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.atlassian.com/git/tutorials/install-git#linux">https://www.atlassian.com/git/tutorials/install-git#linux</a> install ekstensi bahasa soliditi pada visual code studio: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity">https://marketplace.visualstudio.com/items?ItemName=JuanBlanco.solidity</a> lain-lain: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://create-react-app.dev/docs/getting-started/">https://create-react-app.dev/docs/getting-started/</a> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/hardhat-runner/docs/getting-started#overview">https://hardhat.org/hardhat-runner/docs/getting-started#overview</a> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.ethers.org/v5/">https://docs.ethers.org/v5/</a> Mbah Google</p><p>Alat Tempur:<br>OS Linux distro Garuda Visual Studio Code<br>Internet</p><p>repository github:</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/aspaltumpahdimuka/dallan">https://github.com/aspaltumpahdimuka/dallan</a></p>]]></content:encoded>
            <author>she-now-with-ai@newsletter.paragraph.com (She Now with AI)</author>
        </item>
    </channel>
</rss>