> For the complete documentation index, see [llms.txt](https://learn.fi-code.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.fi-code.com/overview/types.md).

# 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:

## Boolean

**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

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

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).&#x20;

> 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;
```

## Timestamp

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;
```

## Address

Addresses are untyped native contract addresses stored on the Tezos blockchain.&#x20;

**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...";
```

## Signature

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

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;
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://learn.fi-code.com/overview/types.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
