Sui Move Language - Counter Contract

Jay NalamJay Nalam
3 min read

Hello Everyone..

Welcome to another day of exploring Web3 Engineering. In our series, we are exploring the Sui Move language and it's features. In today's article, let us write our first smart contract. So, without any further ado, lets get started.

Let us write a Counter contract which gives user a counter object and the value in the object can be incremented and decrement as per requirements.

First create a new sui move project with the command

sui move new counter

This will create a new folder named counter in our current directory which has the following folder structure.

We will the code in the counters.move file in the sources folder. And the test cases will go into the counters_tests.move file in the tests folder.

Let us create a Counter object on the code with one attribute called count and the type of the attribute is u64 and also since our object needs to be transferred it must have key ability.

public struct Counter has key, store {
    id: UID,
    val: u64
}

Now let us create a function to create this Counter object. This function will create a new Counter object and will return it to the caller.

public fun new(ctx: &mut TxContext): Counter {
    Counter {
        id: object::new(ctx),
        val:0
    }
}

The increment function will take the mutable reference of the counter object and will update the value in it.

public fun increment(c: &mut Counter) {
    c.val = c.val + 1
}

Since we are only taking taking a reference to the object, the contract don't own the object and hence no need to return it to user.

Now, let us write the decrement function. Here we have to make sure that we are not trying to decrement the value to a negative number. So that we have added an assert condition for that.

const ENegativeDecrement: u64 = 0;

public fun decrement(c: &mut Counter) {
    assert!(c.val > 0, ENegativeDecrement);
    c.val = c.val - 1
}

We also declare a error type on the contract to specify the error reason.

Now the full contract should look like below

/// Module: counter
module counter::counter {

    const ENegativeDecrement: u64 = 0;

    public struct Counter has key,store{
        id: UID,
        val: u64
    }

    public fun new(ctx: &mut TxContext): Counter {
        Counter {
            id: object::new(ctx),
            val:0
        }
    }

    public fun increment(c: &mut Counter) {
        c.val = c.val + 1
    }

    public fun decrement(c: &mut Counter) {
        assert!(c.val > 0, ENegativeDecrement);
        c.val = c.val - 1
    }

}

We can compile the contract using the command

sui move build

And then we will publish the package with the following command

sui move publish sources/counter.move --gas-budget 10000000000

NOTE: Before trying to publish the package, don't forget to have an active wallet and the environment.

The full code can be found here: https://github.com/jveer634/sui_contracts.git

0
Subscribe to my newsletter

Read articles from Jay Nalam directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Jay Nalam
Jay Nalam

Hi, I'm Jay Nalam, a seasoned Web3 Engineer committed to advancing decentralized technologies. Specializing in EVM-based blockchains, smart contracts, and web3 protocols, I've developed NFTs, DeFi protocols, and more, pushing boundaries in the crypto realm.