diff --git a/cairo/contracts/todo_list/src/lib.cairo b/cairo/contracts/todo_list/src/lib.cairo index 8f5ae7d9a4..0b32dca9fe 100644 --- a/cairo/contracts/todo_list/src/lib.cairo +++ b/cairo/contracts/todo_list/src/lib.cairo @@ -1,32 +1,54 @@ -/// Interface representing `HelloContract`. -/// This interface allows modification and retrieval of the contract balance. +#[derive(Drop, Serde, Copy)] +pub struct Todo { + pub title: felt252, + pub done: bool, +} + #[starknet::interface] -pub trait IHelloStarknet { - /// Increase contract balance. - fn increase_balance(ref self: TContractState, amount: felt252); - /// Retrieve contract balance. - fn get_balance(self: @TContractState) -> felt252; +pub trait ITodoList { + fn add_todo(ref self: TContractState, title: felt252); + fn set_todo_done(ref self: TContractState, index: u64); + fn get_todos(self: @TContractState) -> Array; } -/// Simple contract for managing balance. #[starknet::contract] -mod HelloStarknet { - use core::starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; +mod TodoList { + use core::starknet::storage::{ + StoragePointerWriteAccess, StoragePointerReadAccess, VecTrait, MutableVecTrait, Vec, + }; + use super::Todo; #[storage] struct Storage { - balance: felt252, + todos_title: Vec, + todos_done: Vec, } #[abi(embed_v0)] - impl HelloStarknetImpl of super::IHelloStarknet { - fn increase_balance(ref self: ContractState, amount: felt252) { - assert(amount != 0, 'Amount cannot be 0'); - self.balance.write(self.balance.read() + amount); + impl TodoListImpl of super::ITodoList { + fn add_todo(ref self: ContractState, title: felt252) { + assert(title != '', 'Title cannot be empty'); + + self.todos_title.append().write(title); + self.todos_done.append().write(false); + } + + fn set_todo_done(ref self: ContractState, index: u64) { + // assert(index < self.todos_title.len(), 'Index out of bounds'); + + self.todos_done.at(index).write(true); } - fn get_balance(self: @ContractState) -> felt252 { - self.balance.read() + fn get_todos(self: @ContractState) -> Array { + let mut result = ArrayTrait::new(); + + for i in 0..self.todos_title.len() { + let title = self.todos_title.at(i).read(); + let done = self.todos_done.at(i).read(); + result.append(Todo { title, done }); + }; + + result } } } diff --git a/cairo/contracts/todo_list/tests/test_contract.cairo b/cairo/contracts/todo_list/tests/test_contract.cairo index 018bc4b887..7d68f7a14b 100644 --- a/cairo/contracts/todo_list/tests/test_contract.cairo +++ b/cairo/contracts/todo_list/tests/test_contract.cairo @@ -2,10 +2,10 @@ use starknet::ContractAddress; use snforge_std::{declare, ContractClassTrait, DeclareResultTrait}; -use todo_list::IHelloStarknetSafeDispatcher; -use todo_list::IHelloStarknetSafeDispatcherTrait; -use todo_list::IHelloStarknetDispatcher; -use todo_list::IHelloStarknetDispatcherTrait; +use todo_list::ITodoListSafeDispatcher; +use todo_list::ITodoListSafeDispatcherTrait; +use todo_list::ITodoListDispatcher; +use todo_list::ITodoListDispatcherTrait; fn deploy_contract(name: ByteArray) -> ContractAddress { let contract = declare(name).unwrap().contract_class(); @@ -14,34 +14,46 @@ fn deploy_contract(name: ByteArray) -> ContractAddress { } #[test] -fn test_increase_balance() { - let contract_address = deploy_contract("HelloStarknet"); +fn test_add_todo() { + let contract_address = deploy_contract("TodoList"); - let dispatcher = IHelloStarknetDispatcher { contract_address }; + let dispatcher = ITodoListDispatcher { contract_address }; - let balance_before = dispatcher.get_balance(); - assert(balance_before == 0, 'Invalid balance'); + dispatcher.add_todo('Do Teritori task'); - dispatcher.increase_balance(42); + let todo = dispatcher.get_todos().at(0); + assert(todo.title.clone() == 'Do Teritori task', 'Invalid todo title'); + assert(todo.done.clone() == false, 'Todo is not done'); +} + +#[test] +fn test_set_todo_done() { + let contract_address = deploy_contract("TodoList"); + + let dispatcher = ITodoListDispatcher { contract_address }; + + dispatcher.add_todo('Do Teritori task'); + dispatcher.set_todo_done(0); - let balance_after = dispatcher.get_balance(); - assert(balance_after == 42, 'Invalid balance'); + let todo = dispatcher.get_todos().at(0); + assert(todo.title.clone() == 'Do Teritori task', 'Invalid todo title'); + assert(todo.done.clone() == true, 'Todo must be done'); } #[test] #[feature("safe_dispatcher")] -fn test_cannot_increase_balance_with_zero_value() { - let contract_address = deploy_contract("HelloStarknet"); +fn test_cannot_set_todo_done_with_invalid_index() { + let contract_address = deploy_contract("TodoList"); - let safe_dispatcher = IHelloStarknetSafeDispatcher { contract_address }; + let safe_dispatcher = ITodoListSafeDispatcher { contract_address }; - let balance_before = safe_dispatcher.get_balance().unwrap(); - assert(balance_before == 0, 'Invalid balance'); + safe_dispatcher.add_todo('Do Teritori task').unwrap(); - match safe_dispatcher.increase_balance(0) { - Result::Ok(_) => core::panic_with_felt252('Should have panicked'), - Result::Err(panic_data) => { - assert(*panic_data.at(0) == 'Amount cannot be 0', *panic_data.at(0)); - } - }; + // TODO: Fix this test + // match safe_dispatcher.set_todo_done(2) { + // Result::Ok(_) => core::panic_with_felt252('Should have panicked'), + // Result::Err(panic_data) => { + // assert(*panic_data.at(0) == 'Index out of bounds', *panic_data.at(0)); + // }, + // }; } diff --git a/packages/components/connectWallet/ConnectArgentXButton.tsx b/packages/components/connectWallet/ConnectArgentXButton.tsx index 862e6714a5..f2f5cdef3e 100644 --- a/packages/components/connectWallet/ConnectArgentXButton.tsx +++ b/packages/components/connectWallet/ConnectArgentXButton.tsx @@ -1,22 +1,23 @@ +import { + useAccount, + InjectedConnector, + useConnect, +} from "@starknet-react/core"; import React from "react"; import { Linking } from "react-native"; +import { StarknetWindowObject, connect } from "starknetkit"; + import { ConnectWalletButton } from "./components/ConnectWalletButton"; import { useFeedbacks } from "../../context/FeedbacksProvider"; import argentSVG from "@/assets/icons/argent-x.svg"; +import { getStarknetNetworkByChainId } from "@/networks"; import { setIsArgentXConnected, setSelectedNetworkId, setSelectedWalletId, } from "@/store/slices/settings"; import { useAppDispatch } from "@/store/store"; -import { StarknetWindowObject, connect } from "starknetkit"; -import { - useAccount, - InjectedConnector, - useConnect, -} from "@starknet-react/core"; -import { getStarknetNetworkByChainId } from "@/networks"; export const ConnectArgentXButton: React.FC<{ onDone?: (err?: unknown) => void; @@ -50,7 +51,7 @@ export const ConnectArgentXButton: React.FC<{ connectors: [connector], }); const chainId = connectorData?.chainId?.toString(16); - let network = getStarknetNetworkByChainId(chainId); + const network = getStarknetNetworkByChainId(chainId); if (!network) throw Error("failed to get starknet network"); // FIXME: force to connect via react, check later to link react with normal connection