Smart contracts examples

ERC-20 on AssemblyScript example

import {JSON} from "assemblyscript-json";

// Declare imports
@external("klyntar", "getFromState")
declare function getFromState(key: string): string;

@external("klyntar", "setToState")
declare function setToState(key: string, value: string): void;

@external("klyntar", "getCallerAddress")
declare function getCallerAddress(): string;


// Constants to store data

const ACCOUNT_KEY_PREFIX = "account:";


function getParsedAccount(accountID: string):JSON.Obj {

    return <JSON.Obj>(JSON.parse(getFromState(ACCOUNT_KEY_PREFIX+accountID)));

}


export function totalSupply(): string {
    return getFromState("totalSupply");
}


export function balanceOf(address: string): string {
    
    let account: JSON.Obj = <JSON.Obj>(JSON.parse(getFromState(ACCOUNT_KEY_PREFIX+address))); // {balance:1337}

    let balance: JSON.Integer | null = account.getInteger("balance");

    if(balance!== null){

        return balance.stringify();

    } else return "0"

}


// ERC-20: Transfer from address to address
// Input example: {to:"recipientAccount",amount:1337}
export function transfer(objWithToAndAmount: string): boolean {
    
    let callerAddress = getCallerAddress();

    let handlerWithToAndAmount: JSON.Obj = <JSON.Obj>(JSON.parse(objWithToAndAmount));

    // Parse <to> and <amount>

    let recipientAddress: JSON.Str | null = handlerWithToAndAmount.getString("to");

    let amountToTransfer: JSON.Integer | null = handlerWithToAndAmount.getInteger("amount");



    if(recipientAddress !== null && amountToTransfer !== null && amountToTransfer._num > 0) {

        // Get accounts

        let senderAccount: JSON.Obj = getParsedAccount(callerAddress); // {balance:1337}

        let recipientAccount: JSON.Obj = getParsedAccount(recipientAddress._str); // {balance:1337}

        if(recipientAccount.getInteger("balance") === null){

            recipientAccount = JSON.Value.Object();

            recipientAccount.set("balance",JSON.from(0));

        }

        let senderBalance: JSON.Integer | null = senderAccount.getInteger("balance");

        if(senderBalance !== null && senderBalance >= amountToTransfer){

            senderAccount.set("balance",JSON.from(senderBalance._num-amountToTransfer._num));

            let recipientBalance: JSON.Integer | null = recipientAccount.getInteger("balance");

            if(recipientBalance !== null){

                recipientAccount.set("balance",JSON.from(recipientBalance._num-amountToTransfer._num));

            }

            return true;

        } else return false;

    } else  return false;

}


export function mint(initialSupplyStr: string): void {}

ERC-20 using Rust language

Getter/Setter using AssemblyScript

import {JSON} from "assemblyscript-json";



@external("klyntar","getFromState")
declare function getFromState(key: string): string;

@external("klyntar","setToState")
declare function setToState(key: string, value: string): void;



/*

    1) In parameter we receive object like {name:"NewName"} in JSON serialized form
    2) Get the object {name:"OldNameValue"} from state using <getFromState> function
    3) Using <setToState> function - set new value of .name field and store the whole object to state

*/
export function changeName(objWithNewName:string):void {

    // objWithNewName has format: {name:"NewNameValue"}

    let handlerWithNewName: JSON.Obj = <JSON.Obj>(JSON.parse(objWithNewName));

    let newPotentialName: JSON.Str | null = handlerWithNewName.getString("name");


    let handlerWithOldName: JSON.Obj = <JSON.Obj>(JSON.parse(getFromState("nameHandler")));

    let oldName: JSON.Str | null = handlerWithOldName.getString("name");


    if(newPotentialName !== null && newPotentialName !== oldName) {

        setToState("nameHandler",handlerWithNewName.stringify());

    }

}

Last updated