diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d0709c6..97b79c6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ on: [push, pull_request] env: SCARB_VERSION: 2.4.0 - SNFORGE_VERSION: 0.13.0 + SNFORGE_VERSION: 0.13.1 jobs: check: diff --git a/flex_marketplace/src/lib.cairo b/flex_marketplace/src/lib.cairo index aaae449..986d1f2 100644 --- a/flex_marketplace/src/lib.cairo +++ b/flex_marketplace/src/lib.cairo @@ -1,8 +1,9 @@ use core::fmt::{Display, Error, Formatter, Debug}; +use starknet::contract_address_to_felt252; impl DisplayContractAddress of Display { fn fmt(self: @starknet::ContractAddress, ref f: Formatter) -> Result<(), Error> { - write!(f, "{}", *self) + write!(f, "{}", contract_address_to_felt252(*self)) } } @@ -49,3 +50,7 @@ mod marketplace { mod transfer_manager_ERC1155; mod transfer_selector_NFT; } + +mod mocks { + mod erc1155; +} diff --git a/flex_marketplace/src/marketplace/transfer_manager_ERC1155.cairo b/flex_marketplace/src/marketplace/transfer_manager_ERC1155.cairo index a7509e8..10c79ef 100644 --- a/flex_marketplace/src/marketplace/transfer_manager_ERC1155.cairo +++ b/flex_marketplace/src/marketplace/transfer_manager_ERC1155.cairo @@ -17,24 +17,14 @@ trait IERC1155TransferManager { fn upgrade(ref self: TState, impl_hash: ClassHash); } -#[starknet::interface] -trait IERC1155 { - fn safe_transfer_from( - ref self: TContractState, - from: ContractAddress, - to: ContractAddress, - id: u256, - amount: u128, - data: Span - ); -} - #[starknet::contract] mod ERC1155TransferManager { - use starknet::{ContractAddress, contract_address_const}; + use starknet::{ContractAddress, contract_address_const, get_caller_address}; + use super::ClassHash; - use super::{IERC1155Dispatcher, IERC1155DispatcherTrait}; - use starknet::get_caller_address; + use flex::{DebugContractAddress, DisplayContractAddress}; + use flex::mocks::erc1155::{IERC1155Dispatcher, IERC1155DispatcherTrait}; + use openzeppelin::access::ownable::OwnableComponent; component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); #[abi(embed_v0)] @@ -84,7 +74,11 @@ mod ERC1155TransferManager { ) { let caller: ContractAddress = get_caller_address(); let marketplace: ContractAddress = self.get_marketplace(); - assert(caller == marketplace, 'caller is not marketplace'); + assert!( + caller == marketplace, + "ERC1155TransferManager: caller {} is not marketplace", + caller + ); IERC1155Dispatcher { contract_address: collection } .safe_transfer_from(from, to, token_id, amount, data); } diff --git a/flex_marketplace/src/mocks/erc1155.cairo b/flex_marketplace/src/mocks/erc1155.cairo new file mode 100644 index 0000000..8243270 --- /dev/null +++ b/flex_marketplace/src/mocks/erc1155.cairo @@ -0,0 +1,30 @@ +#[starknet::interface] +trait IERC1155 { + fn safe_transfer_from( + ref self: TContractState, + from: starknet::ContractAddress, + to: starknet::ContractAddress, + id: u256, + amount: u128, + data: Span + ); +} + +#[starknet::contract] +mod ERC1155 { + #[storage] + struct Storage {} + + #[external(v0)] + impl ERC1155Impl of super::IERC1155 { + fn safe_transfer_from( + ref self: ContractState, + from: starknet::ContractAddress, + to: starknet::ContractAddress, + id: u256, + amount: u128, + data: Span + ) {} + } +} + diff --git a/flex_marketplace/tests/transfer_manager_erc1155_test.cairo b/flex_marketplace/tests/transfer_manager_erc1155_test.cairo index eccf5d4..055a9a7 100644 --- a/flex_marketplace/tests/transfer_manager_erc1155_test.cairo +++ b/flex_marketplace/tests/transfer_manager_erc1155_test.cairo @@ -1,32 +1,58 @@ -use tests::utils::{setup, initialize_test}; +use snforge_std::{start_prank, stop_prank, PrintTrait, CheatTarget}; + +use flex::marketplace::transfer_manager_ERC1155::{ + IERC1155TransferManagerDispatcher, IERC1155TransferManagerDispatcherTrait +}; +use tests::utils::{ + setup, initialize_test, ACCOUNT1, ACCOUNT2, OWNER, ZERO_ADDRESS, deploy_mock_1155 +}; + +const TOKEN_ID: u256 = 1; #[test] fn test_transfer_non_fungible_token_success() { let dsp = setup(); initialize_test(dsp); -// TODO + let collection = deploy_mock_1155(); + + start_prank( + CheatTarget::One(dsp.transfer_manager_erc1155.contract_address), + dsp.marketplace.contract_address + ); + dsp + .transfer_manager_erc1155 + .transfer_non_fungible_token( + collection, ACCOUNT1(), ACCOUNT2(), TOKEN_ID, 1, array![].span() + ); } #[test] -#[should_panic()] +#[should_panic(expected: ("ERC1155TransferManager: caller 0 is not marketplace",))] fn test_transfer_non_fungible_token_fails_caller_not_marketplace() { let dsp = setup(); initialize_test(dsp); - assert(false, ''); -// TODO + let collection = deploy_mock_1155(); + + start_prank(CheatTarget::One(dsp.transfer_manager_erc1155.contract_address), ZERO_ADDRESS()); + dsp + .transfer_manager_erc1155 + .transfer_non_fungible_token( + collection, ACCOUNT1(), ACCOUNT2(), TOKEN_ID, 1, array![].span() + ); } #[test] fn test_update_marketplace_success() { let dsp = setup(); initialize_test(dsp); -// TODO -} + let collection = deploy_mock_1155(); + let new_marketplace = starknet::contract_address_const::<'new_marketplace'>(); -// TESTS VIEWS -#[test] -fn test_get_marketplace() { - let dsp = setup(); - initialize_test(dsp); -// TODO + start_prank(CheatTarget::One(dsp.transfer_manager_erc1155.contract_address), OWNER()); + dsp.transfer_manager_erc1155.update_marketplace(new_marketplace); + + let actual_marketplace = dsp.transfer_manager_erc1155.get_marketplace(); + + assert(actual_marketplace == new_marketplace, 'update marketplace failed'); } + diff --git a/flex_marketplace/tests/utils.cairo b/flex_marketplace/tests/utils.cairo index 045e2e2..2f9cff0 100644 --- a/flex_marketplace/tests/utils.cairo +++ b/flex_marketplace/tests/utils.cairo @@ -34,6 +34,8 @@ use flex::marketplace::{ }, }; +use flex::mocks::erc1155::ERC1155; + const HASH_DOMAIN: felt252 = 'HASH_DOMAIN'; const FEE_LIMIT: u128 = 1_000; @@ -71,6 +73,9 @@ fn ACCOUNT4() -> ContractAddress { fn PROXY_ADMIN() -> ContractAddress { contract_address_const::<'PROXY_ADMIN'>() } +fn ZERO_ADDRESS() -> ContractAddress { + contract_address_const::<0>() +} fn setup() -> Dispatchers { let contract = declare('MarketPlace'); @@ -155,6 +160,11 @@ fn initialize_test(dsp: Dispatchers) { dsp.transfer_manager_erc1155.initializer(dsp.marketplace.contract_address, OWNER()); } +fn deploy_mock_1155() -> ContractAddress { + let contract = declare('ERC1155'); + contract.deploy(@array![]).expect('failed marketplace') +} + #[test] fn deploy_test() { let dsp = setup();