DERO Virtual Machine

DERO Virtual Machine represents entire DERO Smart Contracts eco-system which runs on the DERO block chain.

Documentation

DVM is a decentralized platform that runs both public and private smart contracts: applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third-party interference.Public Smart contracts are open versions. However, the DVM is being designed to support Private Smart Contracts where everything is hidden, eg parties, and information involved. Smart Contracts are nothing but rules which apply on transacting parties.

Current version of DVM is an interpretor based system to avoid security vulneribilities, issues and compiler backdoors. This also allows easy audits of Smart Contracts for quality,bug-testing and security assurances. DVM supports a new language DVM-BASIC.

DVM apps run on a from scratch custom built privacy supporting, encrypted blockchain, an enormously powerful shared global infrastructure that can move value around and represent the ownership of assets/property without leaking any information.No one knows who owns what and who transferred to whom.

  • This enables developers to create puzzles, games, voting, markets, store registries of debts or promises, move funds in accordance with instructions given long in the past (like a will or a futures contract) and many other ideas/things that have not been invented yet, all without a middleman or counterparty risk.

  • DVM-BASIC is a contract-oriented, high-level language for implementing smart contracts. It is influenced by GW-BASIC, Visual Basic and C and is designed to target the DERO Virtual Machine (DVM). It is very easy to program and very readable.

  • DVM runs Smart Contracts which are a collection of functions written in DVM-BASIC. These functions can be invoked over the blockchain to do something. SCs can act as libraries for other SCs.

  • DVM supports number of comments formats such as ‘, // , /* */ as good documentation is necessary.

Example Factorial Program

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
             ' This is a comment
             // This comment is supported
             /* this is multi-line comment  */
             // printf is not supported in latest DVM. Please comment or remove printf from all old Smart Contracts.
              Function Factorial(s Uint64) Uint64   // this is a commment
                     10  DIM result,scopy as Uint64     /* this is also comment */
                     15  LET scopy =  s
                     20  LET result = 1
                     30  LET result = result * s
                     40  LET s = s - 1
                     50  IF s >= 2 THEN GOTO 30
                     //60  PRINTF "FACTORIAL of %d = %d" scopy result // printf is not supported in latest DVM.
                     70  RETURN result
             End Function

DVM are written in a DVM-BASIC custom BASIC style language with line numbers.

DVM supports uint64 and string data-types.

DVM interprets the smart-contract and processes the SC line-line

  • uint64 supports almost all operators namely +,-,*,/,%

  • uint64 support following bitwise operators & ,|, ^, ! , >> , <<

  • uint64 supports following logical operators >, >= , <, <=, == , !=

  • string supports only + operator. string support concatenation with a uint64.

  • string supports ==, != logical operators.

  • All DVM variables are mandatory to define and are initialized to default values namely 0 and “”.

A SC execution must return 0 to persist any changes made during execution. During execution, no panics should occur.

DIM Statement

DIM stands for data in memory and is used to define variable names within a function

syntax

10 DIM variable1 as type 20 DIM variable1,variable2 as type

type can be any type supported by DVM

Defining a varible initializes a variable to its ZERO value.

Function statement

Function statement is used to define a function. See eg, below for a function which adds 2 numbers

1
2
3
             Function ADD(x uint64, y uint64) uint64
             10 RETURN x + y
             End Function

Function syntax is of 2 types

  1. Function function_name( 0 or more arguments )

  2. Function function_name( 0 or more arguments ) return type

The rules for functions are as follows

  • All functions begin with Function keyword

  • Function name should be alpha-numeric. If the first letter of the function is Upper case alphabet, it can be invoked by blockchain and other smart-contracts. Otherwise the function can only be called by other functions within the smart contract.

  • Function may or may not have a return type

  • All functions must use RETURN to return from function or to return a value. RETURN is mandatory.

  • All functions must end with End Function. End Function is mandatory

  • A function can have a implicit parameter value of type uint64, which contains amount of DERO value sent with the transaction.

Any error caused during processing will immediately stop execution and discard all changes that occur during SC execution.

Any Entrypoint which returns uint64 value 0 is termed as success and will make transaction to commit all state changes.

GOTO Statement

It is used to jump to any point within the function. It cannot cross function-boundary

syntax GOTO line-number

IF

If statement is used to evaluate expression and make decisions.It has following forms

  1. IF expr1 condition expr2 THEN GOTO line number

  2. IF expr1 condition expr2 THEN GOTO line number ELSE GOTO line number

This is used to change execution flow based on conditions. Conditions can be as complex expressions

LET Statement

LET is used to assign a value to a variable. value can be as complex as possible and can contain complex expression

syntax

line number LET variable_name = expression;

expression can invoke other functions,eg

10 LET x = 2 + 3 + ADD(2,3)

ANY assignments within DVM can only be done using LET

Return Statement

It is used to return from a function and can be used anywhere within a function

syntax

1.RETURN ( return nil ) 2.RETURN expression ( evaluates expression and returns value )

Any return value must match with the type defined while declaring function

Support Functions

LOAD(variable)

LOAD loads a variable which was previously stored in the blockchain using STORE function. Return type will be Uint64/String depending on what is stored. It will panic if the value does NOT exists

Uint64 EXISTS(variable)

EXISTS return 1 if the variable is store in DB and 0 otherwise

STORE(key variable, value variable)

STORE stores key and value in the DB. All storage state of the SC is accessible only from the SC which created it.

Uint64 RANDOM()

Uint64 RANDOM(limit Uin64)

RANDOM returns a random using a PRNG seeded on BLID,SCID,TXID. First form gives a uint64, second form returns random number in the range 0 - (limit), 0 is inclusive, limit is exclusive

String SCID()

Returns SMART CONTRACT ID which is currently running

String BLID()

Returns current BLOCK ID which contains current execution-in-progress TXID

String TXID()

Returns current TXID which is execution-in-progress.

Uint64 BLOCK_HEIGHT()

Returns current chain height of BLID()

Uint64 BLOCK_TOPOHEIGHT()

Returns current topoheight of BLID()

String SIGNER()

Returns address of who signed this transaction

Uint64 IS_ADDRESS_VALID(p String)

Returns 1 if address is valid, 0 otherwise

String ADDRESS_RAW(p String)

Returns address in RAW form as 33 byte keys, stripping away textual/presentation form. 2 address should always be compared in RAW form

SEND_DERO_TO_ADDRESS(a String, amount Uint64)

Sends amount DERO from SC DERO balance to a address which should be raw form. address must in string form DERO/DETO form If the SC does not have enough balance, it will panic

ADD_VALUE(a String, amount Uint64)

Send specific number of token to specific account. If account is bring touched for the first time, it is done simply. If account is already initialized ( it already has some balance, but SC does not know how much). So, it gives additional balance homomorphically

Lotter SC Guide

Dero Stargate DVM Smart Contracts guide to install and test various function of lottery Smart Contract.

Download DERO Stargate testnet source and binaries.

./derod-linux-amd64  --testnet;

Start DERO wallet in testnet.

dero-wallet-cli-linux-amd64 --rpc-server --wallet-file testnet.wallet --testnet;

Start Dero wallet second instance to test transfer/ownership functions etc.

dero-wallet-cli-linux-amd64 --wallet-file testnet2.wallet --testnet --rpc-server --rpc-bind=127.0.0.1:40403;

Dero testnet Explorer

./explorer-linux-amd64  --rpc-server-address 127.0.0.1:30306 --http-address=0.0.0.0:8080;

DERO Stargate Testnet Explorer

https://testnetexplorer.dero.io/

Installing Smart Contract

Download Lottery.bas <https://git.dero.io/DeroProject/derosuite_stargate/src/master/cmd/dvm/lottery.bas>

curl  --request POST --data-binary   @lottery.bas http://127.0.0.1:40403/install_sc;

Download SC Code,check balance and variables from chain

curl http://127.0.0.1:40402/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"getsc","params":{ "scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af" , "code":false, "keysstring":["deposit_count"]}}' -H 'Content-Type: application/json';

Examples of various lottery Smart Contract functions Eg: To play lottery

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af","sc_rpc":[{"name":"entrypoint","datatype":"S","value":"Lottery"}] }}' -H 'Content-Type: application/json';

Eg: Withdraw balance only for smart contract owner

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"Withdraw"}, {"name":"amount","datatype":"U","value":2 }] }}' -H 'Content-Type: application/json';

Eg: To transfer ownership

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"TransferOwnership"}, {"name":"newowner","datatype":"S","value":"deto1qxsplx7vzgydacczw6vnrtfh3fxqcjevyxcvlvl82fs8uykjkmaxgfgulfha5" }] }}' -H 'Content-Type: application/json';

Eg: To claim ownership

curl http://127.0.0.1:40403/json_rpc -d ‘{“jsonrpc”:“2.0”,“id”:“0”,“method”:“transfer”,“params”:{ “transfers”:[{“amount”:111111,“destination”:“deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu”}],“scid”:“aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af”, “sc_rpc”:[{“name”:“entrypoint”,“datatype”:“S”,“value”:“ClaimOwnership”}] }}’ -H ‘Content-Type: application/json’;

Lottery.bas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
             /* Lotter Smart Contract in DVM-BASIC
This lottery smart contract  will give lottery wins every  xth try.
     */

     Function Lottery(value Uint64) Uint64
     10  dim deposit_count,winner as Uint64
     20  LET deposit_count =  LOAD("deposit_count")+1
     25  IF value == 0 THEN GOTO 110  // if deposit amount is 0, simply return
     30  STORE("depositor_address" + (deposit_count-1), SIGNER()) // store address for later on payment
     40  STORE("deposit_total", LOAD("deposit_total") + value )
     50  STORE("deposit_count",deposit_count)
     60  IF LOAD("lotteryeveryXdeposit") > deposit_count THEN GOTO 110 // we will wait till X players join in
       // we are here means all players have joined in, roll the DICE,
     70  LET winner  = RANDOM() % deposit_count // we have a winner
     80  SEND_DERO_TO_ADDRESS(LOAD("depositor_address" + winner) , LOAD("lotterygiveback")*LOAD("deposit_total")/10000)

         // Re initialize for another round
 90   STORE("deposit_count", 0)   //  initial players
     100  STORE("deposit_total", 0)   //  total deposit of all players
     110  RETURN 0
     End Function


     // this function is used to initialize parameters during install time
     Function Initialize() Uint64
     10  STORE("owner", SIGNER())   // store in DB  ["owner"] = address
     20  STORE("lotteryeveryXdeposit", 2)   // lottery will reward every X deposits
     // how much will lottery giveback in 1/10000 parts, granularity .01 %
     30  STORE("lotterygiveback", 9900)   // lottery will give reward 99% of deposits, 1 % is accumulated for owner to withdraw
     33  STORE("deposit_count", 0)   //  initial players
     34  STORE("deposit_total", 0)   //  total deposit of all players
     // 35 printf "Initialize executed"
     40 RETURN 0
     End Function



 // Used to tune lottery parameters
     Function TuneLotteryParameters(input Uint64, lotteryeveryXdeposit Uint64, lotterygiveback Uint64) Uint64
     10  dim key,stored_owner as String
     20  dim value_uint64 as Uint64
     30  IF LOAD("owner") == SIGNER() THEN GOTO 100  // check whether owner is real owner
     40  RETURN 1

     100  STORE("lotteryeveryXdeposit", lotteryeveryXdeposit)   // lottery will reward every X deposits
     130  STORE("lotterygiveback", value_uint64)   // how much will lottery giveback in 1/10000 parts, granularity .01 %
     140  RETURN 0 // return success
     End Function



     // This function is used to change owner
     // owner is an string form of address
     Function TransferOwnership(newowner String) Uint64
     10  IF LOAD("owner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  STORE("tmpowner",ADDRESS_RAW(newowner))
     40  RETURN 0
     End Function

     // Until the new owner claims ownership, existing owner remains owner
     Function ClaimOwnership() Uint64
     10  IF LOAD("tmpowner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  STORE("owner",SIGNER()) // ownership claim successful
     40  RETURN 0
     End Function

     // if signer is owner, withdraw any requested funds
     // if everthing is okay, they will be showing in signers wallet
     Function Withdraw( amount Uint64) Uint64
     10  IF LOAD("owner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  SEND_DERO_TO_ADDRESS(SIGNER(),amount)
     40  RETURN 0
     End Function

     // if signer is owner, provide him rights to update code anytime
 // make sure update is always available to SC
     Function UpdateCode( code String) Uint64
     10  IF LOAD("owner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  UPDATE_SC_CODE(code)
     40  RETURN 0
     End Function

Token SC Guide

Dero Stargate DVM Smart Contracts guide to install and test various function of private token Smart Contract.

Notes: 1. All wallet Addressess need to be registerd first with SC before they need to interact with. This condition will be removed in future. 2. Requirement of detoAnyRandomAddressFromExplorer during SC invocation will be removed in future. 3. burn is equal to deposit if SCID is defined else DERO/token will dissappear/burn from network forever. burn will renamed to something more meaningful. This can be proved with cryptographic proof.

Download DERO Stargate testnet source and binaries.

Start Dero daemon in testnet mode

./derod-linux-amd64  --testnet;

Start Dero wallet in testnet.

dero-wallet-cli-linux-amd64 --rpc-server --wallet-file testnet.wallet --testnet;

Start Dero wallet second instance to test transfer/ownership functions etc.

dero-wallet-cli-linux-amd64 --wallet-file testnet2.wallet --testnet --rpc-server --rpc-bind=127.0.0.1:40403;

Dero testnet Explorer, Not required but if you want to host your own explorer for privacy reasons.

./explorer-linux-amd64  --http-address=0.0.0.0:8080 ;

Connect to explorer using browser on localhost:8080

Dero Stargate Testnet Explorer https://testnetexplorer.dero.io/

To send DERO to multiple users in one transaction

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":100000,"destination":"deto1ADDRESS1"},{"amount":300000,"destination":"deto1ADDRESS12}] }}' -H 'Content-Type: application/json';

DERO has 2 types of SCs, public and private.

1.Public SCs are public with all data/code/exchanges are public. 2.Private SCs have their smart contract data public. But no one knows how many tokens a particular user own or how much is he sending or how much is he receiving. Best example is to understand private SCs as banks and private tokens as cash. Once cash is out from the bank, Bank doesn’t know “who has what amount or how is it being used/sent/received etc.”. This makes all private tokens completely private.

Installing Private Smart Contract.

Download token.bas <https://git.dero.io/DeroProject/derosuite_stargate/src/master/cmd/dvm/token.bas>

curl  --request POST --data-binary   @token.bas http://127.0.0.1:40403/install_sc;

To check private token balance in wallet, type this command in wallet.

balance SCID;

Download SC Code,check SC balance and variables from chain

curl http://127.0.0.1:40402/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"getsc","params":{ "scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af" , "code":true}}' -H 'Content-Type: application/json';

Examples of various private token Smart Contract functions Eg: To send private tokens from one wallet to another wallet, this does not involve SC Eg: this also showcases to send multiple assets( DERO and other tokens on DERO Network) within a single transaction

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"},{"amount":333333,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu","scid": "aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af" }] }}' -H 'Content-Type: application/json';

Eg: Convert DERO to tokens 1:1 swap, we are swapping 44 DERO atomic units to get some tokens

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{"transfers":[{"amount":1,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu", "burn":44}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"IssueTOKENX"}] }}' -H 'Content-Type: application/json';

Convert tokens to DERO 1:1 swap, we are swapping 9 token atomic units to get 9 DERO atomic units This tx shows transferring tokens natively, no dero fees etc, this is under evaluation, **Currently these show as coinbase rewards **

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{"transfers":[{"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "amount":1,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu", "burn":9}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"ConvertTOKENX"}] }}' -H 'Content-Type: application/json';

Eg: To withdraw balance only for smart contract owner

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"Withdraw"}, {"name":"amount","datatype":"U","value":2 }] }}' -H 'Content-Type: application/json';

Eg: To transfer ownership of smart contract to new address/owner

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"TransferOwnership"}, {"name":"newowner","datatype":"S","value":"deto1qxsplx7vzgydacczw6vnrtfh3fxqcjevyxcvlvl82fs8uykjkmaxgfgulfha5" }] }}' -H 'Content-Type: application/json';

Eg: To claim ownership of smart contract

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"ClaimOwnership"}] }}' -H 'Content-Type: application/json';

Eg: To update smart contract code

curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"transfer","params":{ "transfers":[{"amount":111111,"destination":"deto1qxqqen6lqmksmzmxmfqmxp2y8zvkldtcq8jhkzqflmyczepjw9dp46gc3cczu"}],"scid":"aacaa7bb2388d06e523e5bc0783e4e131738270641406c12978155ba033373af", "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"UpdateCode"}, {"name":"code","datatype":"S","value":"new code should be placed here" }] }}' -H 'Content-Type: application/json';

Token.bas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
     /* Private Token Smart Contract Example in DVM-BASIC.
DERO Smart Contracts Tokens privacy can be understood just like banks handle cash. Once cash is out from the bank, bank is not aware about it (who owns what value), until it is deposited back.
Smart contract only maintains supply and other necessary items to keep it working.
DERO Tokens can be tranfered to other wallets just like native DERO with Homomorphic Encryption and without involvement of issuing Smart Contracts.
Token issuing Smart Contract cannot hold/freeze/control their tokens once they are issued and sent to any wallet.
This token is Private. Use Function InitializePrivate() Uint64 to make any Smart Contract private.

     */


 // Issue tokens after depositing DERO (Convert DERO to TOKENX)
 Function IssueTOKENX() Uint64
     10  ADD_VALUE(SIGNER(), DEROVALUE())   // Increment balance of user, without knowing original balance, this is done homomorphically
     20  RETURN 0
     End Function

 // Convert TOKENX to DERO after depositing TOKENX. Smart Contract can give DERO, Only if DERO balance exists.
 Function ConvertTOKENX() Uint64
     10  SEND_DERO_TO_ADDRESS(SIGNER(),TOKENVALUE())   // Increment balance of user, without knowing original balance, this is done using Homomorphic Encryption.
     20  RETURN 0
     End Function

 // This function is used to initialize parameters during install time
 // InitializePrivate initializes a private SC
     Function InitializePrivate() Uint64
     10  STORE("owner", SIGNER())   // Store in DB  ["owner"] = address
     20  ADD_VALUE(ADDRESS_RAW("deto1qxsplx7vzgydacczw6vnrtfh3fxqcjevyxcvlvl82fs8uykjkmaxgfgulfha5"), 1900000)   // Gives initial encrypted balance.
  30  ADD_VALUE(SIGNER(), 1600000)   // Gives initial encrypted balance of 1600000.
     40  RETURN 0
     End Function


     // This function is used to change owner
     // owner is an string form of address
     Function TransferOwnership(newowner String) Uint64
     10  IF LOAD("owner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  STORE("tmpowner",ADDRESS_RAW(newowner))
     40  RETURN 0
     End Function

     // Until the new owner claims ownership, existing owner remains owner
 Function ClaimOwnership() Uint64
     10  IF LOAD("tmpowner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  STORE("owner",SIGNER()) // ownership claim successful
     40  RETURN 0
     End Function

     // if signer is owner, withdraw any requested funds
     // if everthing is okay, they will be showing in signers wallet
 Function Withdraw( amount Uint64) Uint64
     10  IF LOAD("owner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  SEND_DERO_TO_ADDRESS(SIGNER(),amount)
     40  RETURN 0
     End Function

     // if signer is owner, provide him rights to update code anytime
 // make sure update is always available to SC
 Function UpdateCode( code String) Uint64
     10  IF LOAD("owner") == SIGNER() THEN GOTO 30
     20  RETURN 1
     30  UPDATE_SC_CODE(code)
     40  RETURN 0
     End Function