Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
target
target/
3 changes: 0 additions & 3 deletions .vscode/settings.json

This file was deleted.

17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,20 @@ This Cairo Bootcamp is designed to:
---

## 📁 Repository Structure
The repository is organized into the following directories
.
├── cairo_programs/ # Pure Cairo programs (stateless logic)
├── cairo_program/ # Pure Cairo programs (stateless logic)
│ ├── README.md
│ ├── Scarb.lock
│ ├── Scarb.toml
│ ├── src
│ └── target
├── README.md
├── starknet_contracts/ # Smart contracts (stateful logic)
└── README.md
│ ├── Scarb.lock
│ ├── Scarb.toml
│ ├── snfoundry.toml
│ └── src
└── target
├── CACHEDIR.TAG
└── cairo-language-server
3 changes: 0 additions & 3 deletions cairo_program/.vscode/settings.json

This file was deleted.

18 changes: 18 additions & 0 deletions cairo_program/Scarb.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,21 @@ version = 1
[[package]]
name = "cairo_6"
version = "0.1.0"
dependencies = [
"snforge_std",
]

[[package]]
name = "snforge_scarb_plugin"
version = "0.59.0"
source = "registry+https://scarbs.xyz/"
checksum = "sha256:871fba677c03b66a1bf40815dac0ab1b385eb1b9be6e6c3cf2ad9788eeb2b6bb"

[[package]]
name = "snforge_std"
version = "0.59.0"
source = "registry+https://scarbs.xyz/"
checksum = "sha256:3620924fa08bd2d740b2b5b01ef86c8dab3d4b9c2206387c8dbdc8d2ec15133e"
dependencies = [
"snforge_scarb_plugin",
]
16 changes: 10 additions & 6 deletions cairo_program/Scarb.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ name = "cairo_6"
version = "0.1.0"
edition = "2025_12"

# See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html
[lib]

[executable]
[dependencies]

[cairo]
enable-gas = false
[dev-dependencies]
snforge_std = "0.59.0"
assert_macros = "2.18.0"

[dependencies]
cairo_execute = "2.18.0"
[scripts]
test = "snforge test"

[tool.scarb]
allow-prebuilt-plugins = ["snforge_std"]


72 changes: 57 additions & 15 deletions cairo_program/src/integer.cairo
Original file line number Diff line number Diff line change
@@ -1,20 +1,62 @@
#[executable]
fn main() {
let result: u8 = add_num(5, 6);
println!("the sum of x & y is: {}", result);
assert(result == 11, 'invalid sum logic');

let sub_result: u8 = sub_num(10, 5);
println!("sub result is: {}", sub_result);
assert(sub_result == 5, 'invalid sub logic');
// === Arithmetic Functions
pub fn add_num(x: u32, y: u32) -> Result<u32, felt252> {
let result: u256 = x.into() + y.into();
result.try_into().ok_or('Addition overflow')
}

// addition logic
fn add_num(x: u8, y: u8) -> u8 {
x + y
pub fn sub_num(x: u32, y: u32) -> Result<u32, felt252> {
if x < y {
Result::Err('Subtraction underflow')
} else {
Result::Ok(x - y)
}
}

// subtraction logic
fn sub_num(x: u8, y: u8) -> u8 {
return x - y;
pub fn multiply_num(x: u32, y: u32) -> Result<u32, felt252> {
let result: u256 = x.into() * y.into();
result.try_into().ok_or('Multiplication overflow')
}

pub fn divide_num(x: u32, y: u32) -> Result<u32, felt252> {
if y == 0 {
Result::Err('Division by zero')
} else {
Result::Ok(x / y)
}
}

// === Tests
#[cfg(test)]
mod tests {
use super::{add_num, sub_num, multiply_num, divide_num};

#[test]
fn test_add_num() {
assert!(add_num(20, 7) == Result::Ok(27), "add failed");
}

#[test]
fn test_sub_num_ok() {
assert!(sub_num(16, 9) == Result::Ok(7), "sub failed");
}

#[test]
fn test_sub_num_underflow() {
assert!(sub_num(3, 10) == Result::Err('Subtraction underflow'), "underflow check failed");
}

#[test]
fn test_multiply_num() {
assert!(multiply_num(5, 6) == Result::Ok(30), "multiply failed");
}

#[test]
fn test_divide_num_ok() {
assert!(divide_num(20, 5) == Result::Ok(4), "divide failed");
}

#[test]
fn test_divide_by_zero() {
assert!(divide_num(10, 0) == Result::Err('Division by zero'), "div zero check failed");
}
}
4 changes: 2 additions & 2 deletions cairo_program/src/lib.cairo
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// mod hello_world;
// mod short_string;
// mod integer;
pub mod integer;
// mod bool;
mod bytearray;
// mod bytearray;
13 changes: 13 additions & 0 deletions cairo_runner/Scarb.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Code generated by scarb DO NOT EDIT.
version = 1

[[package]]
name = "cairo_6"
version = "0.1.0"

[[package]]
name = "cairo_runner"
version = "0.1.0"
dependencies = [
"cairo_6",
]
13 changes: 13 additions & 0 deletions cairo_runner/Scarb.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[package]
name = "cairo_runner"
version = "0.1.0"
edition = "2025_12"

[executable]

[cairo]
enable-gas = false

[dependencies]
cairo_execute = "2.18.0"
cairo_6 = { path = "../cairo_program" }
54 changes: 54 additions & 0 deletions cairo_runner/src/lib.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
use cairo_6::integer::{add_num, sub_num, multiply_num, divide_num};

#[executable]
fn main() {
// === Addition
let a: u32 = 20;
let b: u32 = 7;
match add_num(a, b) {
Result::Ok(val) => println!("Adding {} + {} = {}.", a, b, val),
Result::Err(err) => println!("Adding {} + {} failed: {}.", a, b, err),
}

// === Subtraction
let (c, d) = (16_u32, 9_u32);
match sub_num(c, d) {
Result::Ok(val) => println!("Subtracting {} - {} = {}.", c, d, val),
Result::Err(err) => println!("Subtracting {} - {} failed: {}.", c, d, err),
}

// Underflow case
let (e, f) = (3_u32, 10_u32);
match sub_num(e, f) {
Result::Ok(val) => println!("Subtracting {} - {} = {}.", e, f, val),
Result::Err(err) => println!("Subtracting {} - {} failed: {}.", e, f, err),
}

// === Multiplication
let (g, h) = (5_u32, 6_u32);
match multiply_num(g, h) {
Result::Ok(val) => println!("Multiplying {} * {} = {}.", g, h, val),
Result::Err(err) => println!("Multiplying {} * {} failed: {}.", g, h, err),
}

// Overflow case
let (i, j) = (4294967295_u32, 2_u32);
match multiply_num(i, j) {
Result::Ok(val) => println!("Multiplying {} * {} = {}.", i, j, val),
Result::Err(err) => println!("Multiplying {} * {} failed: {}.", i, j, err),
}

// === Division
let (k, l) = (20_u32, 5_u32);
match divide_num(k, l) {
Result::Ok(val) => println!("{} / {} = {}", k, l, val),
Result::Err(err) => println!("{} / {} failed: {}", k, l, err),
}

// By zero
let (m, n) = (10_u32, 0_u32);
match divide_num(m, n) {
Result::Ok(val) => println!("Dividing {} / {} = {}.", m, n, val),
Result::Err(err) => println!("Dividing {} / {} failed: {}.", m, n, err),
}
}
13 changes: 9 additions & 4 deletions starknet_contracts/Scarb.lock
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
# Code generated by scarb DO NOT EDIT.
version = 1

[[package]]
name = "cairo_6"
version = "0.1.0"

[[package]]
name = "snforge_scarb_plugin"
version = "0.56.0"
version = "0.59.0"
source = "registry+https://scarbs.xyz/"
checksum = "sha256:d5f2d878f7ae36c8149c517e2d618a95d7833598a76083cb12ea3f00da06a618"
checksum = "sha256:871fba677c03b66a1bf40815dac0ab1b385eb1b9be6e6c3cf2ad9788eeb2b6bb"

[[package]]
name = "snforge_std"
version = "0.56.0"
version = "0.59.0"
source = "registry+https://scarbs.xyz/"
checksum = "sha256:87dfe06ffd5cf1d5a075b7a5c8dff442b66d0eeaf27921140cf446213eb29a68"
checksum = "sha256:3620924fa08bd2d740b2b5b01ef86c8dab3d4b9c2206387c8dbdc8d2ec15133e"
dependencies = [
"snforge_scarb_plugin",
]
Expand All @@ -20,5 +24,6 @@ dependencies = [
name = "starknet_contracts"
version = "0.1.0"
dependencies = [
"cairo_6",
"snforge_std",
]
5 changes: 4 additions & 1 deletion starknet_contracts/Scarb.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@ edition = "2024_07"

[dependencies]
starknet = "2.18.0"
cairo_6 = { path = "../cairo_program" }

[dev-dependencies]
snforge_std = "0.56.0"
snforge_std = "0.59.0"
assert_macros = "2.18.0"

[[target.starknet-contract]]
sierra = true

[lib]

[scripts]
test = "snforge test"

Expand Down
2 changes: 2 additions & 0 deletions starknet_contracts/snfoundry.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
[sncast.default]
account = "cairo_account"
# 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

Expand Down
Loading