Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 996a412

Browse files
fmolettajuanbono
andauthored
Add recursive calls tests using library_call & call_contract syscalls (#1072)
* Add recursive library call test * Add test programs * Change base changes * Add recursive test for call_contract * fmt + clippy * Add test for 100 contract calls * clippy + fmt * Update test values --------- Co-authored-by: Juan Bono <juanbono94@gmail.com>
1 parent cb7b277 commit 996a412

File tree

5 files changed

+621
-5
lines changed

5 files changed

+621
-5
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#[abi]
2+
trait Math {
3+
#[external]
4+
fn square_root(n: felt252) -> felt252;
5+
}
6+
7+
#[contract]
8+
mod SquareRoot {
9+
use super::MathDispatcherTrait;
10+
use super::MathLibraryDispatcher;
11+
use starknet::ClassHash;
12+
13+
#[external]
14+
fn square_root_recursive(n: felt252, math_class_hash: ClassHash, n_iterations: u32) -> felt252 {
15+
square_root_recursive_inner(n, math_class_hash, n_iterations)
16+
}
17+
18+
fn square_root_recursive_inner(n: felt252, math_class_hash: ClassHash, n_iterations: u32) -> felt252 {
19+
if n_iterations == 0 {
20+
return n;
21+
}
22+
square_root_recursive_inner(MathLibraryDispatcher {class_hash: math_class_hash}.square_root(n), math_class_hash, n_iterations - 1)
23+
}
24+
}

starknet_programs/cairo1/wallet_wrapper.cairo

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,13 @@ mod WalletWrapper {
2222
fn increase_balance(amount: felt252, simple_wallet_contract_address: ContractAddress) {
2323
SimpleWalletDispatcher {contract_address: simple_wallet_contract_address}.increase_balance(amount)
2424
}
25+
26+
#[external]
27+
fn increase_balance_recursive(amount: felt252, simple_wallet_contract_address: ContractAddress) {
28+
if amount == 0 {
29+
return();
30+
}
31+
SimpleWalletDispatcher {contract_address: simple_wallet_contract_address}.increase_balance(1);
32+
increase_balance_recursive(amount - 1, simple_wallet_contract_address)
33+
}
2534
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use starknet::ClassHash;
2+
3+
#[starknet::interface]
4+
trait Math<TContractState> {
5+
fn square_root(self: @TContractState, n: felt252) -> felt252;
6+
}
7+
8+
#[starknet::interface]
9+
trait ISquareRoot<TContractState> {
10+
fn square_root(self: @TContractState, n: felt252, math_class_hash: ClassHash, n_iterations: u32) -> felt252;
11+
}
12+
13+
14+
#[starknet::contract]
15+
mod SquareRoot {
16+
use super::MathDispatcherTrait;
17+
use super::MathLibraryDispatcher;
18+
use starknet::ClassHash;
19+
20+
#[storage]
21+
struct Storage{
22+
}
23+
24+
#[external(v0)]
25+
impl SquareRoot of super::ISquareRoot<ContractState> {
26+
fn square_root(self: @ContractState, n: felt252, math_class_hash: ClassHash, n_iterations: u32) -> felt252 {
27+
square_root_recursive_inner(n, math_class_hash, n_iterations)
28+
}
29+
}
30+
31+
fn square_root_recursive_inner(n: felt252, math_class_hash: ClassHash, n_iterations: u32) -> felt252 {
32+
if n_iterations == 0 {
33+
return n;
34+
}
35+
square_root_recursive_inner(MathLibraryDispatcher {class_hash: math_class_hash}.square_root(n), math_class_hash, n_iterations - 1)
36+
}
37+
}

starknet_programs/cairo2/wallet_wrapper.cairo

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ trait SimpleWallet<TContractState> {
77
#[starknet::interface]
88
trait IWalletWrapper<TContractState> {
99
fn get_balance(self: @TContractState, simple_wallet_contract_address: starknet::ContractAddress) -> felt252;
10-
fn increase_balance(ref self: TContractState, amount: felt252, simple_wallet_contract_address: starknet::ContractAddress);
10+
fn increase_balance(ref self: TContractState, amount: felt252, simple_wallet_contract_address: starknet::ContractAddress);
11+
fn increase_balance_recursive(ref self: TContractState, amount: felt252, simple_wallet_contract_address: starknet::ContractAddress);
1112
}
1213

1314
#[starknet::contract]
@@ -28,5 +29,16 @@ mod WalletWrapper {
2829
fn increase_balance(ref self: ContractState, amount: felt252, simple_wallet_contract_address: ContractAddress) {
2930
SimpleWalletDispatcher {contract_address: simple_wallet_contract_address}.increase_balance(amount)
3031
}
32+
fn increase_balance_recursive(ref self: ContractState, amount: felt252, simple_wallet_contract_address: ContractAddress) {
33+
increase_balance_recursive_inner(amount, simple_wallet_contract_address)
34+
}
35+
}
36+
37+
fn increase_balance_recursive_inner(amount: felt252, simple_wallet_contract_address: ContractAddress) {
38+
if amount == 0 {
39+
return();
40+
}
41+
SimpleWalletDispatcher {contract_address: simple_wallet_contract_address}.increase_balance(1);
42+
increase_balance_recursive_inner(amount - 1, simple_wallet_contract_address)
3143
}
3244
}

0 commit comments

Comments
 (0)