Skip to content

Commit

Permalink
Added StorageValue packing trait. (#3676)
Browse files Browse the repository at this point in the history
  • Loading branch information
orizi authored Jul 13, 2023
1 parent c74cbe8 commit c9a2f44
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 3 deletions.
4 changes: 2 additions & 2 deletions corelib/src/starknet.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ use zeroable::Zeroable;
// StorageValue
mod storage_access;
use storage_access::{
StorageValue, StorageAddress, StorageBaseAddress, storage_base_address_const,
storage_base_address_from_felt252, storage_address_from_base,
StorageValue, StorageValuePacking, StorageAddress, StorageBaseAddress,
storage_base_address_const, storage_base_address_from_felt252, storage_address_from_base,
storage_address_from_base_and_offset, storage_address_to_felt252,
storage_address_try_from_felt252
};
Expand Down
39 changes: 39 additions & 0 deletions corelib/src/starknet/storage_access.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,45 @@ trait StorageValue<T> {
fn size() -> u8;
}

trait StorageValuePacking<T, PackedT> {
fn pack(value: T) -> PackedT;
fn unpack(value: PackedT) -> T;
}

impl StorageValueUsingPacking<
T,
PackedT,
impl TPacking: StorageValuePacking<T, PackedT>,
impl PackedTStorageValue: StorageValue<PackedT>
> of StorageValue<T> {
#[inline(always)]
fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult<T> {
Result::Ok(TPacking::unpack(PackedTStorageValue::read(address_domain, base)?))
}
#[inline(always)]
fn write(address_domain: u32, base: StorageBaseAddress, value: T) -> SyscallResult<()> {
PackedTStorageValue::write(address_domain, base, TPacking::pack(value))
}
#[inline(always)]
fn read_at_offset(
address_domain: u32, base: StorageBaseAddress, offset: u8
) -> SyscallResult<T> {
Result::Ok(
TPacking::unpack(PackedTStorageValue::read_at_offset(address_domain, base, offset)?)
)
}
#[inline(always)]
fn write_at_offset(
address_domain: u32, base: StorageBaseAddress, offset: u8, value: T
) -> SyscallResult<()> {
PackedTStorageValue::write_at_offset(address_domain, base, offset, TPacking::pack(value))
}
#[inline(always)]
fn size() -> u8 {
PackedTStorageValue::size()
}
}

impl StorageValueFelt252 of StorageValue<felt252> {
#[inline(always)]
fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult<felt252> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,22 @@ struct Abc {
c: u32,
}

#[derive(Drop, Serde, PartialEq, Copy)]
struct TupleStructure {
v1: u256,
v2: u256,
}
impl TupleStructureStorageValuePacking of starknet::StorageValuePacking<TupleStructure,
(felt252, felt252)> {
fn pack(value: TupleStructure) -> (felt252, felt252) {
(value.v1.try_into().unwrap(), value.v2.try_into().unwrap())
}
fn unpack(value: (felt252, felt252)) -> TupleStructure {
let (v1, v2) = value;
TupleStructure { v1: v1.into(), v2: v2.into(), }
}
}

#[derive(Drop, Serde, PartialEq, Copy, starknet::StorageValue)]
struct AbcEtc {
a: u8,
Expand All @@ -40,6 +56,7 @@ struct AbcEtc {
j: bool,
k: EthAddress,
abc: Abc,
ts: TupleStructure,
}


Expand All @@ -64,7 +81,7 @@ mod test_contract {
}

#[test]
#[available_gas(900000)]
#[available_gas(2000000)]
fn write_read_struct() {
let x = AbcEtc {
a: 1_u8,
Expand All @@ -80,6 +97,8 @@ fn write_read_struct() {
k: 123_felt252.try_into().unwrap(),
abc: Abc {
a: 1_u8, b: 2_u16, c: 3_u32,
}, ts: TupleStructure {
v1: 1_u256, v2: 2_u256,
}
};

Expand Down

0 comments on commit c9a2f44

Please sign in to comment.