From 75e3034c6c0e8de70a83fd63969024b49cf74120 Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Wed, 29 Apr 2026 07:34:36 +0100 Subject: [PATCH 1/8] feat: add number 1 and 2 Co-authored-by: Copilot --- cairo_program/src/integer.cairo | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/cairo_program/src/integer.cairo b/cairo_program/src/integer.cairo index 9501eca..eca6eb1 100644 --- a/cairo_program/src/integer.cairo +++ b/cairo_program/src/integer.cairo @@ -7,6 +7,20 @@ fn main() { let sub_result: u8 = sub_num(10, 5); println!("sub result is: {}", sub_result); assert(sub_result == 5, 'invalid sub logic'); + + // Test subtraction that should panic (10 - 15 = negative) + // sub_num(10, 15); // This would panic + + let mul_result: u8 = mul_num(3, 4); + println!("mul result is: {}", mul_result); + assert(mul_result == 12, 'invalid mul logic'); + + let div_result: u8 = div_num(20, 4); + println!("div result is: {}", div_result); + assert(div_result == 5, 'invalid div logic'); + + // Test division by zero - should panic + // div_num(10, 0); // This would panic } // addition logic @@ -14,7 +28,23 @@ fn add_num(x: u8, y: u8) -> u8 { x + y } -// subtraction logic +// subtraction logic with negative check fn sub_num(x: u8, y: u8) -> u8 { + if (y > x) { + panic_with_felt252('negative result not allowed'); + } return x - y; } + +// multiplication logic +fn mul_num(x: u8, y: u8) -> u8 { + x * y +} + +// division logic with division by zero check +fn div_num(x: u8, y: u8) -> u8 { + if (y == 0) { + panic_with_felt252('division by zero'); + } + x / y +} From c9c53e2f22ab233bd1cc03d1c0a1f315a046208b Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Wed, 29 Apr 2026 07:43:42 +0100 Subject: [PATCH 2/8] feat: add number 3 Co-authored-by: Copilot --- starknet_contracts/src/lib.cairo | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/starknet_contracts/src/lib.cairo b/starknet_contracts/src/lib.cairo index f1b82bb..3f91d9a 100644 --- a/starknet_contracts/src/lib.cairo +++ b/starknet_contracts/src/lib.cairo @@ -12,17 +12,29 @@ pub trait ICounter { #[starknet::contract] mod Counter { use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; + use starknet::get_caller_address; #[storage] struct Storage { count: u32, + owner: felt252, + } + + #[constructor] + fn constructor(ref self: ContractState) { + self.owner.write(get_caller_address().into()); } #[abi(embed_v0)] impl CounterImpl of super::ICounter { fn increase_count(ref self: ContractState, amount: u32) { + // Only owner check + assert(self.owner.read() == get_caller_address().into(), 'Caller is not the owner'); + assert(amount != 0, 'Amount cannot be 0'); - self.count.write(self.count.read() + amount); + // Read current count and add the amount + let current_count = self.count.read(); + self.count.write(current_count + amount); } fn get_count(self: @ContractState) -> u32 { From fc3ed646abbe2ae57e65cde3ebaae7a88dfa93fc Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Wed, 29 Apr 2026 07:53:56 +0100 Subject: [PATCH 3/8] chore: format code --- cairo_program/src/bool.cairo | 4 ++-- cairo_program/src/bytearray.cairo | 2 +- cairo_program/src/integer.cairo | 3 +-- cairo_program/src/lib.cairo | 2 +- starknet_contracts/src/lib.cairo | 4 ++-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/cairo_program/src/bool.cairo b/cairo_program/src/bool.cairo index cafad1e..aa231ac 100644 --- a/cairo_program/src/bool.cairo +++ b/cairo_program/src/bool.cairo @@ -3,7 +3,7 @@ fn main() { let result: bool = is_adult(18); println!("bool result = {}", result); - let is_even_result: bool = is_even(17); + let is_even_result: bool = is_even(17); println!("result = {}", is_even_result); } @@ -23,7 +23,7 @@ fn is_adult(x: u8) -> bool { fn is_even(x: u8) -> bool { if x % 2 == 0 { return true; - } + } return false; } diff --git a/cairo_program/src/bytearray.cairo b/cairo_program/src/bytearray.cairo index 0c7f306..d356eac 100644 --- a/cairo_program/src/bytearray.cairo +++ b/cairo_program/src/bytearray.cairo @@ -2,4 +2,4 @@ fn main() { let text: ByteArray = "We are writing Cairo in this session and it's going to be fun"; println!("full text here: {}", text); -} \ No newline at end of file +} diff --git a/cairo_program/src/integer.cairo b/cairo_program/src/integer.cairo index eca6eb1..7934cbb 100644 --- a/cairo_program/src/integer.cairo +++ b/cairo_program/src/integer.cairo @@ -18,9 +18,8 @@ fn main() { let div_result: u8 = div_num(20, 4); println!("div result is: {}", div_result); assert(div_result == 5, 'invalid div logic'); - // Test division by zero - should panic - // div_num(10, 0); // This would panic +// div_num(10, 0); // This would panic } // addition logic diff --git a/cairo_program/src/lib.cairo b/cairo_program/src/lib.cairo index acc7644..0c0d0b3 100644 --- a/cairo_program/src/lib.cairo +++ b/cairo_program/src/lib.cairo @@ -2,4 +2,4 @@ // mod short_string; // mod integer; // mod bool; -mod bytearray; \ No newline at end of file +mod bytearray; diff --git a/starknet_contracts/src/lib.cairo b/starknet_contracts/src/lib.cairo index 3f91d9a..2cbd97e 100644 --- a/starknet_contracts/src/lib.cairo +++ b/starknet_contracts/src/lib.cairo @@ -11,8 +11,8 @@ pub trait ICounter { /// Simple contract for managing count. #[starknet::contract] mod Counter { - use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; use starknet::get_caller_address; + use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; #[storage] struct Storage { @@ -30,7 +30,7 @@ mod Counter { fn increase_count(ref self: ContractState, amount: u32) { // Only owner check assert(self.owner.read() == get_caller_address().into(), 'Caller is not the owner'); - + assert(amount != 0, 'Amount cannot be 0'); // Read current count and add the amount let current_count = self.count.read(); From e0c47ab5ba9049e4bbef3384b99d75c26ffcac32 Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Wed, 29 Apr 2026 08:20:50 +0100 Subject: [PATCH 4/8] fix: add proper contract address data type --- starknet_contracts/src/lib.cairo | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/starknet_contracts/src/lib.cairo b/starknet_contracts/src/lib.cairo index 2cbd97e..66a06bb 100644 --- a/starknet_contracts/src/lib.cairo +++ b/starknet_contracts/src/lib.cairo @@ -11,25 +11,25 @@ pub trait ICounter { /// Simple contract for managing count. #[starknet::contract] mod Counter { - use starknet::get_caller_address; use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; + use starknet::{ContractAddress, get_caller_address}; #[storage] struct Storage { count: u32, - owner: felt252, + owner: ContractAddress, } #[constructor] fn constructor(ref self: ContractState) { - self.owner.write(get_caller_address().into()); + self.owner.write(get_caller_address()); // no .into() needed } #[abi(embed_v0)] impl CounterImpl of super::ICounter { fn increase_count(ref self: ContractState, amount: u32) { // Only owner check - assert(self.owner.read() == get_caller_address().into(), 'Caller is not the owner'); + assert(self.owner.read() == get_caller_address(), 'Caller is not the owner'); assert(amount != 0, 'Amount cannot be 0'); // Read current count and add the amount From 83b99b4eba51d6053d55143cff105027b500b431 Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Wed, 29 Apr 2026 09:08:46 +0100 Subject: [PATCH 5/8] fix: replace deprecated panic function with shorthand assert --- cairo_program/src/integer.cairo | 8 ++------ cairo_program/src/lib.cairo | 5 +++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/cairo_program/src/integer.cairo b/cairo_program/src/integer.cairo index 7934cbb..3ee235f 100644 --- a/cairo_program/src/integer.cairo +++ b/cairo_program/src/integer.cairo @@ -29,9 +29,7 @@ fn add_num(x: u8, y: u8) -> u8 { // subtraction logic with negative check fn sub_num(x: u8, y: u8) -> u8 { - if (y > x) { - panic_with_felt252('negative result not allowed'); - } + assert(y <= x, 'negative result not allowed'); return x - y; } @@ -42,8 +40,6 @@ fn mul_num(x: u8, y: u8) -> u8 { // division logic with division by zero check fn div_num(x: u8, y: u8) -> u8 { - if (y == 0) { - panic_with_felt252('division by zero'); - } + assert(y != 0, 'division by zero'); x / y } diff --git a/cairo_program/src/lib.cairo b/cairo_program/src/lib.cairo index 0c0d0b3..de0053b 100644 --- a/cairo_program/src/lib.cairo +++ b/cairo_program/src/lib.cairo @@ -1,5 +1,6 @@ // mod hello_world; // mod short_string; -// mod integer; +mod integer; // mod bool; -mod bytearray; +// mod bytearray; + From 452ea3dfa9d77a6e4548c07f081468499eeee712 Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Thu, 30 Apr 2026 10:14:24 +0100 Subject: [PATCH 6/8] feat: add reduce count function Co-authored-by: Copilot --- starknet_contracts/src/lib.cairo | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/starknet_contracts/src/lib.cairo b/starknet_contracts/src/lib.cairo index 66a06bb..56351fd 100644 --- a/starknet_contracts/src/lib.cairo +++ b/starknet_contracts/src/lib.cairo @@ -4,6 +4,8 @@ pub trait ICounter { /// Increase count. fn increase_count(ref self: T, amount: u32); + /// Decrease count. + fn reduce_count(ref self: T, amount: u32); /// Retrieve count. fn get_count(self: @T) -> u32; } @@ -37,6 +39,17 @@ mod Counter { self.count.write(current_count + amount); } + fn reduce_count(ref self: ContractState, amount: u32) { + // Only owner check + assert(self.owner.read() == get_caller_address(), 'Caller is not the owner'); + + assert(amount != 0, 'Amount cannot be 0'); + // Read current count and subtract the amount + let current_count = self.count.read(); + assert(current_count >= amount, 'Insufficient count'); + self.count.write(current_count - amount); + } + fn get_count(self: @ContractState) -> u32 { self.count.read() } From 7c2b3c172138ad335638eaea9296fec394363a55 Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Thu, 30 Apr 2026 10:25:57 +0100 Subject: [PATCH 7/8] fix: resolve only owner constructor problem --- starknet_contracts/src/lib.cairo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/starknet_contracts/src/lib.cairo b/starknet_contracts/src/lib.cairo index 56351fd..ee4abef 100644 --- a/starknet_contracts/src/lib.cairo +++ b/starknet_contracts/src/lib.cairo @@ -23,8 +23,8 @@ mod Counter { } #[constructor] - fn constructor(ref self: ContractState) { - self.owner.write(get_caller_address()); // no .into() needed + fn constructor(ref self: ContractState, owner: ContractAddress) { + self.owner.write(owner); } #[abi(embed_v0)] From 5d76e39528f66223d576e2ec8fa39b51c77f2396 Mon Sep 17 00:00:00 2001 From: JTKaduma Date: Wed, 20 May 2026 12:54:10 +0100 Subject: [PATCH 8/8] fix: update .gitignore to include target directory and add account configuration to snfoundry.toml --- .gitignore | 2 +- starknet_contracts/snfoundry.toml | 2 ++ .../2.18.0_proc_macro.cache | Bin 15413 -> 3 bytes 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index eb5a316..2f7896d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -target +target/ diff --git a/starknet_contracts/snfoundry.toml b/starknet_contracts/snfoundry.toml index c06aab7..83cc417 100644 --- a/starknet_contracts/snfoundry.toml +++ b/starknet_contracts/snfoundry.toml @@ -1,3 +1,5 @@ +[sncast.default] +account = "cairoTest1" # Visit https://foundry-rs.github.io/starknet-foundry/appendix/snfoundry-toml.html # and https://foundry-rs.github.io/starknet-foundry/projects/configuration.html for more information diff --git a/target/cairo-language-server/2.18.0_proc_macro.cache b/target/cairo-language-server/2.18.0_proc_macro.cache index 9a48e13bcbd69a2d1ebbb364d1124538540e3eb1..4227ca4e8736af63036e7457e2db376ddf7e5795 100644 GIT binary patch literal 3 KcmZQzU;qFB0{{U4 literal 15413 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