Skip to main content

Storage

Contract parameter​

A contract parameter is a storage element whose value is set at deployment (origination) time.

Variable​

A contract variable is a storage element whose value is set at declaration time. It is declared with the variable keyword followed by an identifier, a type and the initial value.

For example:

variable counter : nat = 0
variable admin_candidate : option<address> = none

The value of a storage variable may be modified by assignment instructions in entrypoints.

Asset​

An asset collection is declared with the asset keyword followed by the asset collection identifier and the list of fields (identifier and type).

For example, the following declares the vehicle asset:

asset vehicle {
vin : string;
manufacturer : string;
release : date;
nbdoors : nat;
}

Asset key​

By default, the first field serves as the asset key. Any comparable field of the asset may be declared as the asset key with the identified by modifier; hence the declaration above is equivalent to:

asset vehicle identified by vin {
vin : string;
/* ... */
}

Several fields may be declared to form the asset key; for example the liquidity asset is identified by two fields:

asset liquidity identified by token_id owner {
token_id : string;
owner : address;
amount : nat;
}

The key is then the tuple of fields' value, which is in Michelson the right comb of pairs of values; for example, the expression to retrieve the amount of token 0 of tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb is:

var a = liquidity[(0,tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb)].amount;

See access operator [] for more information.

Default field value​

It is possible to define a default value for an asset field; for example:

asset vehicle {
vin : string;
manufacturer : string;
release : date = now;
nbdoors : nat = 5;
}

Fields with default value are not required when adding a new asset in collection; for example, the following instruction adds a new vehicle asset with release date equal to now and nbdoors equal to 5:

vehicle.add({ vin = "1G1AF1F57A7192174"; manufacturer = "Renault" })

See the add instruction for more information.

Big map​

The to big_map modifier compiles the collection as a big_map.

For example:

asset vehicle to big_map {
vin : string;
/* ... */
}

Iterable big map​

The to iterable_big_map modifier compiles the collection as an iterable_big_map.

For example:

asset vehicle to iterable_big_map {
vin : string;
/* ... */
}

Initial collection​

It is possible to specify the initial value of the asset collection at origination.

Inlined​

Initialize the collection with the initialized with modifier followed by the collection literal: a set of asset definitions.

For example, the following declaration initializes the vehicle asset with 2 assets:

asset vehicle {
vin : string;
manufacturer : string;
release : date;
nbdoors : nat;
} initialized with {
{ "1G1AF1F57A7192174"; "Renault"; 2021-06-28; 5 };
{ "JNKCV61E49M014581"; "Peugeot"; 2021-07-12; 3 }
}

The initial value of an asset collection is interpreted by the completium CLI's deploy command to set the initial storage Michelson value.

Constant parameter​

It is also possible to parameter the initial collection value with a constant parameter:

archetype sample_vehicle(const initial_collection : map<string, (string * date * nat)>)

asset vehicle {
vin : string;
manufacturer : string;
release : date;
nbdoors : nat;
} initialized with initial_collection

Michelson representation​

The asset collection is compiled to Michelson as a map (or big_map) of records (right comb of pairs of annotated data).

An asset with only one field is compiled to a Michelson set.

For example, the declaration above is quasi equivalent to the following lower-level code:

record vehicle_data {
manufacturer : string;
release : date;
nbdoors : nat;
}

variable vehicle : map<string, vehicle_data> = [
("1G1AF1F57A7192174", { "Renault"; 2021-06-28; 5 });
("JNKCV61E49M014581", { "Peugeot"; 2021-07-12; 3 })
]