DEV Community

darkvallen
darkvallen

Posted on

Event-Driven Smart Contract using Soroban AssemblyScript SDK

Hi! in my previous post, i already illustrates how to use the Soroban AssemblyScript SDK to store and retrieve data in a simple smart contract, and now we will dive into the realm of contract events in a Soroban smart contract using Soroban Assembly Script SDK.

We will explore how to create an event-driven smart contract on the Soroban smart contract platform using AssemblyScript SDK. This example will showcase publishEvent function provided by the as-soroban-sdk library.

The Contract Code

The contract code will be similar to my previous post with additional code to emits an event each time it is called.Let's dive into the code:

import {RawVal, fromU32, fromSymbolStr, toU32} from 'as-soroban-sdk/lib/value';
import * as ledger from "as-soroban-sdk/lib/ledger";
import {Vec} from 'as-soroban-sdk/lib/vec';
import {publishEvent} from 'as-soroban-sdk/lib/context';
Enter fullscreen mode Exit fullscreen mode

In this section, two additional modules added vec and context module. These modules will give us functionality to emits event.

export function increment(): RawVal {

  let data = "COUNTER";
  var counter = 0;
  if (ledger.hasDataFor(data)) {
    let dataObj = ledger.getDataFor(data);
    counter = toU32(dataObj);
  }
  counter ++;
  ledger.putDataFor(data, fromU32(counter));

  let topics = new Vec();
  topics.pushBack(fromSymbolStr(data));
  topics.pushBack(fromSymbolStr("increment"));
  publishEvent(topics, fromU32(counter));

  return ledger.getDataFor(data);

}
Enter fullscreen mode Exit fullscreen mode

The increment function works exactly like the code before with additional topics.pushBack() function to add topics to the events, and publishEvent() function to publish the event. A new Vec instance to store the event's topics. Two topics are added to the Vec: the COUNTER data and an "increment" label. Both are converted to their RawVal representation using the fromSymbolStr function. The publishEvent function is then called with the topics and the updated counter value as arguments. Finally, the updated counter value is retrieved from the ledger and returned as the function's output.

Next, create contract.json file in your project directory, this file contains metadata for the contract.

{
    "name": "Store and Retrieve Data Contract (With Events)",
    "version": "0.1.0",
    "description": "example",
    "host_functions_version": 29,
    "functions": [
        {
            "name" : "increment",
            "arguments": [],
            "returns" : "u32"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Before compiling the contract, we need to edit the asconfig.json file of your project. Replace its content with the following:

{
  "extends": "as-soroban-sdk/sdkasconfig",
  "targets": {
    "release": {
      "outFile": "build/release.wasm",
      "textFile": "build/release.wat"
    },
    "debug": {
      "outFile": "build/debug.wasm",
      "textFile": "build/debug.wat"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

The asconfig.json file is used by the AssemblyScript compiler (asc) to define the configuration for your project.

Compiling the Contract

You need to compile it into WebAssembly first. To do this, you'll use the following command :

npx asc assembly/index.ts --target release
Enter fullscreen mode Exit fullscreen mode

Now you should see two new files in the build/ directory: release.wasm and release.wat.

Running The Contract on Sandbox

Let's run the contract to see if it's works, we're gonna run the contract using soroban-cli on sandbox using the following command :

soroban contract invoke --wasm build/release.wasm --id 1 --fn increment
Enter fullscreen mode Exit fullscreen mode

You should get the output:

1
#0: event: {"ext":"v0","contract_id":"0000000000000000000000000000000000000000000000000000000000000009","type_":"contract","body":{"v0":{"topics":[{"symbol":"COUNTER"},{"symbol":"increment"}],"data":{"u32":1}}}}
Enter fullscreen mode Exit fullscreen mode

Run it once more, you should get output:

2
#0: event: {"ext":"v0","contract_id":"0000000000000000000000000000000000000000000000000000000000000009","type_":"contract","body":{"v0":{"topics":[{"symbol":"COUNTER"},{"symbol":"increment"}],"data":{"u32":2}}}}
Enter fullscreen mode Exit fullscreen mode

event

Closing

This example demonstrates how to create an event-driven smart contract using the Soroban AssemblyScript SDK. By leveraging the ledger, context, value, and vec modules, we can easily interact with the blockchain storage, manage data, and publish events. With this foundation, you can move on to build more advanced and feature-rich smart contracts on the Soroban platform. Happy coding!

Top comments (4)

Collapse
 
icolomina profile image
Nacho Colomina Torregrosa

Great !! really interesting. How can we subscribe to the topics ?

Collapse
 
darkvallen profile image
darkvallen

Hey thanks for your support!! You can follow me, you will get notified everytime i post something new, and you could check all my previous post, maybe you could find another interesting posts! Once more Thank You!

Collapse
 
icolomina profile image
Nacho Colomina Torregrosa

Yoo're welcome. I'm trying to learn more about smart contracts ecosystem since sounds like an exciting field

Thread Thread
 
darkvallen profile image
darkvallen

Hey you could join stelardev discord here : discord.gg/stellardev and you could check soroban documentation here : soroban.stellar.org/docs