diff --git a/contracts/src/fundManager.cairo b/contracts/src/fundManager.cairo old mode 100644 new mode 100755 index 36426d8..7b815ac --- a/contracts/src/fundManager.cairo +++ b/contracts/src/fundManager.cairo @@ -6,13 +6,15 @@ pub trait IFundManager { fn newFund(ref self: TContractState, name: felt252, goal: u64); fn getCurrentId(self: @TContractState) -> u128; fn getFund(self: @TContractState, id: u128) -> ContractAddress; + fn getOwner(self: @TContractState) -> ContractAddress; + fn getFundClassHash(self: @TContractState) -> ClassHash; } #[starknet::contract] mod FundManager { - // ************************************************************************* + // *************************************************************************************** // IMPORT - // ************************************************************************* + // *************************************************************************************** use core::array::ArrayTrait; use core::traits::TryInto; use starknet::ContractAddress; @@ -20,9 +22,9 @@ mod FundManager { use starknet::class_hash::ClassHash; use starknet::get_caller_address; - // ************************************************************************* + // *************************************************************************************** // STORAGE - // ************************************************************************* + // *************************************************************************************** #[storage] struct Storage { owner: ContractAddress, @@ -31,9 +33,9 @@ mod FundManager { fund_class_hash: ClassHash, } - // ************************************************************************* + // *************************************************************************************** // CONSTRUCTOR - // ************************************************************************* + // *************************************************************************************** #[constructor] fn constructor(ref self: ContractState, fund_class_hash: felt252) { self.owner.write(get_caller_address()); @@ -41,9 +43,9 @@ mod FundManager { self.current_id.write(0); } - // ************************************************************************* + // *************************************************************************************** // EXTERNALS - // ************************************************************************* + // *************************************************************************************** #[abi(embed_v0)] impl FundManagerImpl of super::IFundManager { fn newFund(ref self: ContractState, name: felt252, goal: u64) { @@ -56,8 +58,8 @@ mod FundManager { self.fund_class_hash.read(), 12345, calldata.span(), false ) .unwrap(); - self.funds.write(self.current_id.read(), address_0); self.current_id.write(self.current_id.read() + 1); + self.funds.write(self.current_id.read(), address_0); } fn getCurrentId(self: @ContractState) -> u128 { return self.current_id.read(); @@ -65,5 +67,11 @@ mod FundManager { fn getFund(self: @ContractState, id: u128) -> ContractAddress { return self.funds.read(id); } + fn getOwner(self: @ContractState) -> ContractAddress { + return self.owner.read(); + } + fn getFundClassHash(self: @ContractState) -> ClassHash { + return self.fund_class_hash.read(); + } } -} +} \ No newline at end of file diff --git a/contracts/tests/test_fund_manager.cairo b/contracts/tests/test_fund_manager.cairo new file mode 100755 index 0000000..25ae3c2 --- /dev/null +++ b/contracts/tests/test_fund_manager.cairo @@ -0,0 +1,83 @@ +// *************************************************************************************** +// FUND MANAGER TEST +// *************************************************************************************** +use starknet::{ContractAddress, contract_address_const}; +use starknet::class_hash::{ClassHash}; +use starknet::syscalls::deploy_syscall; + +use snforge_std::{ + ContractClass, declare, ContractClassTrait, start_cheat_caller_address_global, get_class_hash +}; + +use openzeppelin::utils::serde::SerializedAppend; + +use gostarkme::fundManager::IFundManagerDispatcher; +use gostarkme::fundManager::IFundManagerDispatcherTrait; + +fn ID() -> u128 { + 1 +} +fn OWNER() -> ContractAddress { + contract_address_const::<'OWNER'>() +} +fn OTHER_USER() -> ContractAddress { + contract_address_const::<'USER'>() +} +fn NAME() -> felt252 { + 'NAME_FUND_TEST' +} +fn REASON() -> ByteArray { + "Lorem impsum, Lorem impsum, Lorem impsum, Lorem impsum, Lorem impsum, Lorem impsum, Lorem impsum, Lorem impsum" +} +fn GOAL() -> u64 { + 1000 +} + +fn _setup_() -> (ContractAddress, ClassHash) { + // Fund + let fund = declare("Fund").unwrap(); + let mut fund_calldata: Array = array![]; + fund_calldata.append_serde(ID()); + fund_calldata.append_serde(OWNER()); + fund_calldata.append_serde(NAME()); + fund_calldata.append_serde(GOAL()); + let (fund_contract_address, _) = fund.deploy(@fund_calldata).unwrap(); + let fund_class_hash = get_class_hash(fund_contract_address); + + // Fund Manager + let fund_manager = declare("FundManager").unwrap(); + let mut fund_manager_calldata: Array = array![]; + fund_manager_calldata.append_serde(fund_class_hash); + let (contract_address, _) = fund_manager.deploy(@fund_manager_calldata).unwrap(); + + return (contract_address, fund_class_hash,); +} + +// ****************************************************************************** +// TEST +// ****************************************************************************** + +#[test] +fn test_constructor() { + start_cheat_caller_address_global(OWNER()); + let (contract_address, fund_class_hash) = _setup_(); + let fund_manager_contract = IFundManagerDispatcher { contract_address }; + let expected_fund_address = fund_manager_contract.getFundClassHash(); + let owner = fund_manager_contract.getOwner(); + assert(owner == OWNER(), 'Invalid owner'); + assert(fund_class_hash == expected_fund_address, 'Invalid fund class hash'); +} + +#[test] +fn test_new_fund(){ + start_cheat_caller_address_global(OWNER()); + let (contract_address, fund_class_hash) = _setup_(); + let fund_manager_contract = IFundManagerDispatcher { contract_address }; + fund_manager_contract.newFund(NAME(), GOAL()); + let expected_fund_class_hash = get_class_hash( + fund_manager_contract.getFund(1) + ); + let current_id = fund_manager_contract.getCurrentId(); + assert(expected_fund_class_hash == fund_class_hash, 'Invalid fund address'); + assert(current_id == 1, 'Invalid current ID'); +} \ No newline at end of file