Storing Custom Types
While native types can be stored in a contract's storage without any additional work, custom types require a bit more work. This is because at compile time, the compiler does not know how to store custom types in storage. To solve this, we need to implement the Store
trait for our custom type. It is enough to just derive this trait, unless our custom type contains arrays or dictionaries.
// Deriving the starknet::Store trait
// allows us to store the `Person` struct in the contract's storage.
#[derive(Drop, Serde, Copy, starknet::Store)]
pub struct Person {
pub age: u8,
pub name: felt252,
}
#[starknet::contract]
pub mod StoringCustomType {
use starknet::storage::StoragePointerWriteAccess;
use super::Person;
#[storage]
struct Storage {
pub person: Person,
}
#[abi(embed_v0)]
impl StoringCustomType of super::IStoringCustomType<ContractState> {
fn set_person(ref self: ContractState, person: Person) {
self.person.write(person);
}
fn set_name(ref self: ContractState, name: felt252) {
self.person.name.write(name);
}
}
}
Note that it is also possible to individually access the members of the stored struct.
This is possible because deriving the Store
trait also generates the corresponding StoragePointer
for each member.
fn set_name(ref self: ContractState, name: felt252) {
self.person.name.write(name);
}