Writing a smart contract in TypeScript (TS)

Sample contract functionality

The sample contract serves as a demonstration of general QVM logic.

It is capable of:

  • registering users into the database

  • storing the last registered user's name in the database

  • echoing the previous user's name to STDOUT

  • incrementing the total registered user count

  • storing above counter in the database

Sample code

function contract(args: string[]) {

  // THIS SAMPLE ONLY SUPPORTS THE "register" FUNCTION
  if (args && args.length === 2 && args[0] === "register") {

    // GET THE CURRENT USER'S NAME OR DEFAULT TO "unknown" IF THIS IS THE FIRST CALL
    const previous_name: string = process.env.DB_USER_CURRENT || "unknown";

    // GET THE TOTAL USER COUNT
    const total_user_count: number = parseInt(process.env.DB_TOTALUSERS || "0");

    // WRITE PREVIOUS USER NAME TO STDOUT
    process.stdout.write(`OUT=prevname: ${previous_name}\n`);

    // UPDATE CURRENT USER NAME BY WRITING IT TO DB
    process.stdout.write(`DBW=USER_CURRENT=${args[1]}\n`);

    // STORE USER NAME UNDER A STORAGE SLOT FOR PERSISTENCE (CURRENT GETS OVERWRITTEN ON EACH CALL)
    process.stdout.write(`DBW=USER_${total_user_count}=${args[1]}\n`);

    // INCREMENT THE TOTAL USER COUNT
    process.stdout.write(`DBW=TOTALUSERS=${(total_user_count + 1)}\n`);
    process.exit(0);
  }

  if (args.length >= 1) {
    process.stderr.write(`Wrong CMD: ${args[0]}\n`);
    process.exit(1);
  }

  process.stderr.write("Wrong args!\n");
  process.exit(1);
}

contract(process.argv.slice(2));

Save the contract

Open a text editor and save above sample contract as main.ts file.

Last updated