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