Skip to content

Commit ce2e541

Browse files
fix: repair Cairo 1 nested and enum tuple handling
* fix: tuples response parser, for nested tuples, or tuple including Result enum * refactor: shorten tuple utility code --------- Co-authored-by: Petar Penovic <pp@spaceshard.io>
1 parent fdcc7fb commit ce2e541

File tree

6 files changed

+7576
-7
lines changed

6 files changed

+7576
-7
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
// Use Cairo 2.5.3
2+
use starknet::eth_address::EthAddress;
3+
use starknet::eth_address::{EthAddressSerde, Felt252TryIntoEthAddress};
4+
5+
#[derive(Drop, Serde)]
6+
struct Order2 {
7+
p1: felt252,
8+
p2: Array<felt252>,
9+
}
10+
11+
#[derive(Drop, Serde)]
12+
enum Direction {
13+
North,
14+
East: Result<u16, felt252>
15+
}
16+
17+
#[starknet::interface]
18+
trait ITupleStarknet<TContractState> {
19+
fn simple(self: @TContractState) -> u8;
20+
fn get_tuple1(self: @TContractState) -> (u8, Array<u16>, bool);
21+
fn get_tuple2(self: @TContractState) -> (bytes31, ByteArray);
22+
fn get_tuple3(self: @TContractState) -> (u256, Order2);
23+
fn get_tuple4(self: @TContractState) -> (EthAddress, u256);
24+
fn get_tuple5(self: @TContractState) -> (Result<u64, u8>, u8);
25+
fn get_tuple6(self: @TContractState) -> (Option<u64>, u8);
26+
fn get_tuple7(self: @TContractState) -> (Direction, u8);
27+
fn get_tuple8(self: @TContractState) -> ((u256, Array<u16>), u8);
28+
fn get_tuple9(
29+
self: @TContractState, l0: ((u256, (u16, Order2)), u8)
30+
) -> ((u256, (u16, Order2)), u8);
31+
fn get_tuple10(self: @TContractState) -> (u256,Array<Result<u256, u8>>);
32+
fn get_tuple11(self: @TContractState) -> (u16,Option<Result<u16, felt252>>);
33+
fn get_tuple12(self: @TContractState) -> (Direction, u8);
34+
}
35+
36+
37+
#[starknet::contract]
38+
mod HelloStarknet {
39+
use starknet::eth_address::EthAddress;
40+
use starknet::eth_address::{EthAddressSerde, Felt252TryIntoEthAddress};
41+
use super::{Order2, Direction};
42+
43+
#[storage]
44+
struct Storage {}
45+
46+
#[abi(embed_v0)]
47+
impl HelloStarknetImpl of super::ITupleStarknet<ContractState> {
48+
fn simple(self: @ContractState) -> u8 {
49+
26_u8
50+
}
51+
52+
fn get_tuple1(self: @ContractState) -> (u8, Array<u16>, bool) {
53+
let arr = array![5000_u16, 6000_u16];
54+
let a: (u8, Array<u16>, bool) = (100_u8, arr, true);
55+
a
56+
}
57+
58+
fn get_tuple2(self: @ContractState) -> (bytes31, ByteArray) {
59+
//let str:bytes31="a";
60+
let mess: bytes31 = bytes31_const::<0x496e707574>(); // "Input"
61+
let long_mess: ByteArray = "Zorg is very verbose and creates only long sentences.";
62+
let a: (bytes31, ByteArray) = (mess, long_mess);
63+
a
64+
}
65+
66+
fn get_tuple3(self: @ContractState) -> (u256, Order2) {
67+
let arr = array![1_felt252, 2_felt252, 3_felt252];
68+
let structure = Order2 { p1: 10_felt252, p2: arr };
69+
let a: (u256, Order2) = (123456_u256, structure);
70+
a
71+
}
72+
73+
fn get_tuple4(self: @ContractState) -> (EthAddress, u256) {
74+
let ethA: EthAddress = 123_felt252.try_into().unwrap();
75+
let a: (EthAddress, u256) = (ethA, 500_u256);
76+
a
77+
}
78+
79+
fn get_tuple5(self: @ContractState) -> (Result<u64, u8>, u8) {
80+
let r: Result<u64, u8> = Result::Ok(18_u64);
81+
let a: (Result<u64, u8>, u8) = (r, 4_u8);
82+
a
83+
}
84+
85+
fn get_tuple6(self: @ContractState) -> (Option<u64>, u8) {
86+
let o: Option<u64> = Option::Some(18_u64);
87+
let a: (Option<u64>, u8) = (o, 4_u8);
88+
a
89+
}
90+
91+
fn get_tuple7(self: @ContractState) -> (Direction, u8) {
92+
let r: Direction = Direction::North;
93+
let a: (Direction, u8) = (r, 4_u8);
94+
a
95+
}
96+
97+
fn get_tuple8(self: @ContractState) -> ((u256, Array<u16>), u8) {
98+
let arr = array![1_u16, 2_u16, 3_u16];
99+
let t: (u256, Array<u16>) = (600_u256, arr);
100+
let a: ((u256, Array<u16>), u8) = (t, 8_u8);
101+
a
102+
}
103+
104+
fn get_tuple9(
105+
self: @ContractState, l0: ((u256, (u16, Order2)), u8)
106+
) -> ((u256, (u16, Order2)), u8) {
107+
let ((my_u256, (my_u16, my_order2)), my_u8) = l0;
108+
let arr = my_order2.p2;
109+
let o = Order2 { p1: my_order2.p1, p2: arr };
110+
let r: (u16, Order2) = (my_u16, o);
111+
let t: (u256, (u16, Order2)) = (my_u256, r);
112+
let a: ((u256, (u16, Order2)), u8) = (t, my_u8);
113+
a
114+
}
115+
116+
fn get_tuple10(self: @ContractState) -> (u256,Array<Result<u256, u8>>) {
117+
let r1: Result<u256, u8> = Result::Ok(6000_u256);
118+
let r2: Result<u256, u8> = Result::Ok(7000_u256);
119+
let arr = array![r1, r2];
120+
let a: (u256,Array<Result<u256, u8>>) = (8000_u256,arr);
121+
a
122+
}
123+
124+
fn get_tuple11(self: @ContractState) -> (u16,Option<Result<u16, felt252>>) {
125+
let r: Result<u16, felt252> = Result::Ok(2000_u16);
126+
let o: Option<Result<u16, felt252>> = Option::Some(r);
127+
let a: (u16,Option<Result<u16, felt252>>) = (400_u16,o);
128+
a
129+
}
130+
131+
fn get_tuple12(self: @ContractState) -> (Direction, u8) {
132+
let r: Result<u16, felt252> = Result::Ok(2000_u16);
133+
let e: Direction = Direction::East(r);
134+
let a: (Direction, u8) = (e, 4_u8);
135+
a
136+
}
137+
138+
}
139+
}

0 commit comments

Comments
 (0)