Smart Contract Counter

๐Ÿš€ Panduan Lengkap: Membuat Smart Contract Counter di Cedra

๐Ÿ”ง Kontrak ini akan menyimpan angka, menambahkannya, menguranginya, mengatur ulang, dan melihat nilainya โ€” cocok untuk belajar dasar Move!


๐Ÿ“ฆ 1. Persiapan Awal

Pastikan kamu sudah:

โœ… Menginstall Cedra CLI โœ… Melakukan cedra init dan punya account address & private key โœ… Paham dasar CLI dan konsep akun di blockchain


๐Ÿ—๏ธ 2. Buat Proyek Move Baru

mkdir counter-project
cd counter-project
cedra move init --name counter

Struktur proyek akan seperti ini:

counter/
โ”œโ”€โ”€ Move.toml
โ””โ”€โ”€ sources/

โœ๏ธ 3. Update Move.toml

Edit bagian [addresses] dan tambahkan address kamu:

[addresses]
counter = "0xYOUR_ACCOUNT_ADDRESS"

Ganti 0xYOUR_ACCOUNT_ADDRESS dengan address dari hasil cedra init.


๐Ÿงฑ 4. Buat File Smart Contract

Buat file baru:

nano sources/counter.move

Tempel kode berikut:

module counter::simple_counter {
    use std::signer;

    struct Counter has key {
        value: u64,
    }

    const E_COUNTER_NOT_EXISTS: u64 = 1;

    public entry fun initialize(account: &signer) {
        let counter = Counter { value: 0 };
        move_to(account, counter);
    }

    public entry fun increment(account: &signer) acquires Counter {
        let addr = signer::address_of(account);
        assert!(exists<Counter>(addr), E_COUNTER_NOT_EXISTS);
        let counter = borrow_global_mut<Counter>(addr);
        counter.value = counter.value + 1;
    }

    public entry fun decrement(account: &signer) acquires Counter {
        let addr = signer::address_of(account);
        assert!(exists<Counter>(addr), E_COUNTER_NOT_EXISTS);
        let counter = borrow_global_mut<Counter>(addr);
        if (counter.value > 0) {
            counter.value = counter.value - 1;
        };
    }

    public entry fun reset(account: &signer) acquires Counter {
        let addr = signer::address_of(account);
        assert!(exists<Counter>(addr), E_COUNTER_NOT_EXISTS);
        let counter = borrow_global_mut<Counter>(addr);
        counter.value = 0;
    }

    #[view]
    public fun get_count(addr: address): u64 acquires Counter {
        assert!(exists<Counter>(addr), E_COUNTER_NOT_EXISTS);
        let counter = borrow_global<Counter>(addr);
        counter.value
    }
}

๐Ÿงช 5. Tambahkan Unit Test (Opsional tapi Disarankan)

Di file yang sama (counter.move), tambahkan di bawah:

#[test_only]
module counter::counter_tests {
    use std::signer;
    use counter::simple_counter;

    #[test(account = @0x1)]
    public fun test_initialize_and_get_count(account: &signer) {
        simple_counter::initialize(account);
        let count = simple_counter::get_count(signer::address_of(account));
        assert!(count == 0, 1);
    }

    #[test(account = @0x1)]
    public fun test_increment(account: &signer) {
        simple_counter::initialize(account);
        simple_counter::increment(account);
        simple_counter::increment(account);
        let count = simple_counter::get_count(signer::address_of(account));
        assert!(count == 2, 2);
    }

    #[test(account = @0x1)]
    public fun test_decrement(account: &signer) {
        simple_counter::initialize(account);
        simple_counter::increment(account);
        simple_counter::decrement(account);
        let count = simple_counter::get_count(signer::address_of(account));
        assert!(count == 0, 3);
    }

    #[test(account = @0x1)]
    public fun test_reset(account: &signer) {
        simple_counter::initialize(account);
        simple_counter::increment(account);
        simple_counter::reset(account);
        let count = simple_counter::get_count(signer::address_of(account));
        assert!(count == 0, 4);
    }
}

โš™๏ธ 6. Compile & Jalankan Tes

cedra move compile
cedra move test

โœ… Semua test harus berhasil


๐Ÿš€ 7. Deploy ke Cedra Testnet

cedra move publish

Ketik yes saat diminta konfirmasi. Modul akan dipublikasikan ke akun kamu di testnet.


๐ŸŽฎ 8. Interaksi dengan Smart Contract

๐Ÿงฑ Inisialisasi Counter

cedra move run --function-id default::simple_counter::initialize

๐Ÿ”ผ Tambah Nilai Counter

cedra move run --function-id default::simple_counter::increment

๐Ÿ” Cek Nilai Counter

cedra move view --function-id default::simple_counter::get_count --args address:default

๐Ÿ”„ Tambah & Cek Lagi

cedra move run --function-id default::simple_counter::increment
cedra move view --function-id default::simple_counter::get_count --args address:default

Kamu akan melihat nilai counter bertambah!


๐Ÿ’ก Tips Lanjut:

  • Ganti default::... jika kamu pakai profil atau address lain

  • Gunakan --profile <nama_profile> jika ada lebih dari satu akun

  • Kamu bisa melihat hasil deploy dengan:

    cedra account list --query modules --account <alamat>

๐ŸŽ‰ Selesai!

Kamu baru saja: โœ… Membuat โœ… Menguji โœ… Mendeploy โœ… Menggunakan smart contract pertamamu di Cedra.

Last updated