Basic Types

fi is a statically typed language, where a variable must be typed on declaration and that type cannot change. When you are setting a variable to a literal value, you must also ensure the type is declared.

storage nat Foo;

entry Test(int Bar){
    let string Hello = string "World"; 
    #We must declare the type of all literals

During compilation, types are strictly checked and enforced. These types reflect the native Michelson types. All available basic types are defined below:


bool - possible values being either true or false.

let bool available = bool true;

Integers & Natural Numbers

Integers and naturals are arbitrary-precision, meaning the only size limit is fuel. The only difference is that Natural Numbers are unsigned.

int - possible values being any integer value (negative and positive) nat - possible values being any positive integer value

let nat n1 = nat 1;
let nat n2 = nat 2;
let nat n3 = sub(n1, n2); # Fail - must be declared as an int
let int n4 = sub(n1, n2); # OK
let nat n5 = to_int(sub(n1, n2)); # Also OK

Note: Some arithmetic functions will return a different type based on the input types. You can use to_* functions if you need to typecast a specific value.


Strings are used to hold a value in text form.

string - possible value being anything, but must be encompassed by double-quotes "text"

let string name = string "John";


Mutez is the native Michelson type for defining a variable to represent a mutez, the native currency of Tezos in its smallest denomination (e.g. 0.000001 tez).

Mutez are internally represented by a 64 bit signed integer. There are restrictions to prevent creating a negative amount of mutez. Operations are limited to prevent overflow and mixing them with other numerical types by mistake. They are also checked for under/overflows.

mutez - possible values being any positive integer value

let mutez amount = mutez 100000000;


Timestamps represent a date/time value.

timestamp - valid RFC 339 notation, encompassed by double-quotes, or alternatively number of seconds since Unix Epoch.

let timestamp today = timestamp "2019-02-20 00:00:00";
let timestamp alsotoday = timestamp 1550638795;


Addresses are untyped native contract addresses stored on the Tezos blockchain.

address - must be a valid public address and must be provided in the base58-check encoded version encompassed by double quotes (e.g. "KT1...", "tz1...").

let address payee = address "tz1...";

Public Key

Public keys are used for verifying a signed message using the verify function, or can be converted to a public key hash (pkh/key_hash) and used for on-chain operations (delegation, origination and transfer).

key - must be a valid public key, encompassed by double quotes, in the base58-check encoded format (e.g. "edpk...", "p2pk")

let key signer = key "edpk...";

Public Key Hash

Public key hashes are the hashed form of a key, and can also be used to create an implicit contract (and therefore address using typecasting). This type can be declared as key_hash or via an alias, pkh.

key_hash|pkh - must be a valid public key hash, encompassed by double quotes, in the base58-check encoded format (e.g. "tz1...", "tz2...").

let key_hash signer = pkh "tz1...";


Signatures are base58-check encoded signatures (e.g. "edsig..."). These can be generated by the node-client to sign a message with a users private key. This can then be verified within fi using the verify function.

signature - must be a valid base58-check encoded signature, encompassed by double-quotes "..."

let signature sig = signature "edsig...";


Bytes are defined as hexadecimal, and can be used for multiple purposes.

bytes - must be valid hex, starting with 0x. This should not be wrapped in double quotes;

let bytes b = bytes 0x08aa28;

Last updated