diff --git a/CHANGELOG.md b/CHANGELOG.md index 2079d48b1..b35b45f1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Bump scarb to v2.8.3 (#1166) +- Bump scarb to v2.8.4 (#1146) ### Changed (Breaking) +- Bump snforge to 0.31.0 - Remove openzeppelin_utils::selectors (#1163) - Remove `DualCase dispatchers` (#1163) - Remove `try_selector_with_fallback` from `openzeppelin_utils` diff --git a/Scarb.lock b/Scarb.lock index 4d1eb7904..fabb1d34d 100644 --- a/Scarb.lock +++ b/Scarb.lock @@ -60,6 +60,7 @@ version = "0.17.0" dependencies = [ "openzeppelin_access", "openzeppelin_introspection", + "openzeppelin_test_common", "openzeppelin_testing", "openzeppelin_utils", "snforge_std", @@ -69,6 +70,7 @@ dependencies = [ name = "openzeppelin_introspection" version = "0.17.0" dependencies = [ + "openzeppelin_test_common", "snforge_std", ] @@ -99,6 +101,7 @@ dependencies = [ name = "openzeppelin_security" version = "0.17.0" dependencies = [ + "openzeppelin_test_common", "openzeppelin_testing", "snforge_std", ] @@ -110,6 +113,8 @@ dependencies = [ "openzeppelin_access", "openzeppelin_account", "openzeppelin_finance", + "openzeppelin_introspection", + "openzeppelin_security", "openzeppelin_testing", "openzeppelin_token", "openzeppelin_upgrades", @@ -150,21 +155,22 @@ dependencies = [ name = "openzeppelin_utils" version = "0.17.0" dependencies = [ + "openzeppelin_test_common", "openzeppelin_testing", "snforge_std", ] [[package]] name = "snforge_scarb_plugin" -version = "0.2.0" +version = "0.31.0" source = "registry+https://scarbs.xyz/" -checksum = "sha256:2e4ce3ebe3f49548bd26908391b5d78537a765d827df0d96c32aeb88941d0d67" +checksum = "sha256:1fce075fcbf7fce1b0935f6f9a034549704837fb221da212d3b6e9134cebfdaa" [[package]] name = "snforge_std" -version = "0.30.0" +version = "0.31.0" source = "registry+https://scarbs.xyz/" -checksum = "sha256:2f3c4846881813ac0f5d1460981249c9f5e2a6831e752beedf9b70975495b4ec" +checksum = "sha256:60ac980b297281f9a59a5f1668cb56bdea1b28fd2f8008008270f9a3c91ad3ba" dependencies = [ "snforge_scarb_plugin", ] diff --git a/Scarb.toml b/Scarb.toml index 7fb7c15a4..8106757db 100644 --- a/Scarb.toml +++ b/Scarb.toml @@ -24,8 +24,8 @@ keywords.workspace = true [workspace.package] version = "0.17.0" edition = "2024_07" -cairo-version = "2.8.2" -scarb-version = "2.8.3" +cairo-version = "2.8.4" +scarb-version = "2.8.4" authors = ["OpenZeppelin Community "] description = "OpenZeppelin Contracts written in Cairo for Starknet, a decentralized ZK Rollup" documentation = "https://docs.openzeppelin.com/contracts-cairo" @@ -40,9 +40,9 @@ keywords = [ ] [workspace.dependencies] -assert_macros = "2.8.2" -starknet = "2.8.2" -snforge_std = "0.30.0" +assert_macros = "2.8.4" +starknet = "2.8.4" +snforge_std = "0.31.0" [dependencies] starknet.workspace = true @@ -59,7 +59,6 @@ openzeppelin_upgrades = { path = "packages/upgrades" } openzeppelin_utils = { path = "packages/utils" } [dev-dependencies] -assert_macros.workspace = true snforge_std.workspace = true openzeppelin_test_common = { path = "packages/test_common" } openzeppelin_testing = { path = "packages/testing" } diff --git a/packages/access/src/lib.cairo b/packages/access/src/lib.cairo index b9ab604d4..5c758695e 100644 --- a/packages/access/src/lib.cairo +++ b/packages/access/src/lib.cairo @@ -1,4 +1,5 @@ pub mod accesscontrol; pub mod ownable; -pub mod tests; +#[cfg(test)] +mod tests; diff --git a/packages/access/src/tests.cairo b/packages/access/src/tests.cairo index 4cb72b65b..173ef02da 100644 --- a/packages/access/src/tests.cairo +++ b/packages/access/src/tests.cairo @@ -1,8 +1,3 @@ -pub(crate) mod mocks; - -#[cfg(test)] mod test_accesscontrol; -#[cfg(test)] mod test_ownable; -#[cfg(test)] mod test_ownable_twostep; diff --git a/packages/access/src/tests/mocks.cairo b/packages/access/src/tests/mocks.cairo deleted file mode 100644 index 4f4ebc2d9..000000000 --- a/packages/access/src/tests/mocks.cairo +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod accesscontrol_mocks; -pub(crate) mod ownable_mocks; diff --git a/packages/access/src/tests/mocks/accesscontrol_mocks.cairo b/packages/access/src/tests/mocks/accesscontrol_mocks.cairo deleted file mode 100644 index 13f0b8722..000000000 --- a/packages/access/src/tests/mocks/accesscontrol_mocks.cairo +++ /dev/null @@ -1,39 +0,0 @@ -#[starknet::contract] -pub(crate) mod DualCaseAccessControlMock { - use crate::accesscontrol::AccessControlComponent; - use crate::accesscontrol::DEFAULT_ADMIN_ROLE; - use openzeppelin_introspection::src5::SRC5Component; - use starknet::ContractAddress; - - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // AccessControlMixin - #[abi(embed_v0)] - impl AccessControlMixinImpl = - AccessControlComponent::AccessControlMixinImpl; - impl AccessControlInternalImpl = AccessControlComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub accesscontrol: AccessControlComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - AccessControlEvent: AccessControlComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState, admin: ContractAddress) { - self.accesscontrol.initializer(); - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, admin); - } -} diff --git a/packages/access/src/tests/mocks/ownable_mocks.cairo b/packages/access/src/tests/mocks/ownable_mocks.cairo deleted file mode 100644 index 996a23f91..000000000 --- a/packages/access/src/tests/mocks/ownable_mocks.cairo +++ /dev/null @@ -1,60 +0,0 @@ -#[starknet::contract] -pub(crate) mod DualCaseOwnableMock { - use crate::ownable::OwnableComponent; - use starknet::ContractAddress; - - component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); - - #[abi(embed_v0)] - impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl; - impl InternalImpl = OwnableComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub ownable: OwnableComponent::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - OwnableEvent: OwnableComponent::Event - } - - #[constructor] - fn constructor(ref self: ContractState, owner: ContractAddress) { - self.ownable.initializer(owner); - } -} - -#[starknet::contract] -pub(crate) mod DualCaseTwoStepOwnableMock { - use crate::ownable::OwnableComponent; - use starknet::ContractAddress; - - component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); - - #[abi(embed_v0)] - impl OwnableTwoStepMixinImpl = - OwnableComponent::OwnableTwoStepMixinImpl; - impl InternalImpl = OwnableComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - ownable: OwnableComponent::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - OwnableEvent: OwnableComponent::Event - } - - #[constructor] - fn constructor(ref self: ContractState, owner: ContractAddress) { - self.ownable.initializer(owner); - } -} diff --git a/packages/access/src/tests/test_accesscontrol.cairo b/packages/access/src/tests/test_accesscontrol.cairo index 9f06a54da..81adcddfb 100644 --- a/packages/access/src/tests/test_accesscontrol.cairo +++ b/packages/access/src/tests/test_accesscontrol.cairo @@ -3,8 +3,8 @@ use crate::accesscontrol::AccessControlComponent::{ }; use crate::accesscontrol::interface::{IAccessControl, IAccessControlCamel, IACCESSCONTROL_ID}; use crate::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE}; -use crate::tests::mocks::accesscontrol_mocks::DualCaseAccessControlMock; use openzeppelin_introspection::interface::ISRC5; +use openzeppelin_test_common::mocks::access::DualCaseAccessControlMock; use openzeppelin_testing::constants::{ ADMIN, AUTHORIZED, OTHER, OTHER_ADMIN, ROLE, OTHER_ROLE, ZERO }; diff --git a/packages/access/src/tests/test_ownable.cairo b/packages/access/src/tests/test_ownable.cairo index 0c7fed3aa..46c9d56da 100644 --- a/packages/access/src/tests/test_ownable.cairo +++ b/packages/access/src/tests/test_ownable.cairo @@ -2,8 +2,7 @@ use core::num::traits::Zero; use crate::ownable::OwnableComponent::InternalTrait; use crate::ownable::OwnableComponent; use crate::ownable::interface::{IOwnable, IOwnableCamelOnly}; -use crate::tests::mocks::ownable_mocks::DualCaseOwnableMock; - +use openzeppelin_test_common::mocks::access::DualCaseOwnableMock; use openzeppelin_test_common::ownable::OwnableSpyHelpers; use openzeppelin_testing::constants::{ZERO, OTHER, OWNER, RECIPIENT}; use snforge_std::{spy_events, test_address, start_cheat_caller_address}; diff --git a/packages/access/src/tests/test_ownable_twostep.cairo b/packages/access/src/tests/test_ownable_twostep.cairo index eff125e82..ec6d6242b 100644 --- a/packages/access/src/tests/test_ownable_twostep.cairo +++ b/packages/access/src/tests/test_ownable_twostep.cairo @@ -2,7 +2,7 @@ use core::num::traits::Zero; use crate::ownable::OwnableComponent::{InternalTrait, OwnershipTransferStarted}; use crate::ownable::OwnableComponent; use crate::ownable::interface::{IOwnableTwoStep, IOwnableTwoStepCamelOnly}; -use crate::tests::mocks::ownable_mocks::DualCaseTwoStepOwnableMock; +use openzeppelin_test_common::mocks::access::DualCaseTwoStepOwnableMock; use openzeppelin_test_common::ownable::OwnableSpyHelpers; use openzeppelin_testing::constants::{ZERO, OWNER, OTHER, NEW_OWNER}; use openzeppelin_testing::events::EventSpyExt; diff --git a/packages/account/Scarb.toml b/packages/account/Scarb.toml index df108ed9f..722e1ee5e 100644 --- a/packages/account/Scarb.toml +++ b/packages/account/Scarb.toml @@ -38,3 +38,11 @@ openzeppelin_test_common = { path = "../test_common" } allowed-libfuncs-list.name = "experimental" sierra = true casm = false + +[[test]] +build-external-contracts = [ + "openzeppelin_test_common::mocks::account::DualCaseAccountMock", + "openzeppelin_test_common::mocks::account::DualCaseEthAccountMock", + "openzeppelin_test_common::mocks::src9::SRC9AccountMock", + "openzeppelin_test_common::mocks::simple::SimpleMock", +] diff --git a/packages/account/src/lib.cairo b/packages/account/src/lib.cairo index 366b3eb8f..f26af3904 100644 --- a/packages/account/src/lib.cairo +++ b/packages/account/src/lib.cairo @@ -3,7 +3,8 @@ pub mod eth_account; pub mod extensions; pub mod interface; -pub mod tests; +#[cfg(test)] +mod tests; pub mod utils; pub use account::AccountComponent; diff --git a/packages/account/src/tests.cairo b/packages/account/src/tests.cairo index 660465d02..0780cf6a0 100644 --- a/packages/account/src/tests.cairo +++ b/packages/account/src/tests.cairo @@ -1,11 +1,6 @@ mod extensions; -pub(crate) mod mocks; -#[cfg(test)] mod test_account; -#[cfg(test)] mod test_eth_account; -#[cfg(test)] mod test_secp256k1; -#[cfg(test)] mod test_signature; diff --git a/packages/account/src/tests/extensions.cairo b/packages/account/src/tests/extensions.cairo index ea5d3f334..b3ecde616 100644 --- a/packages/account/src/tests/extensions.cairo +++ b/packages/account/src/tests/extensions.cairo @@ -1,4 +1,2 @@ -#[cfg(test)] mod test_snip12_utils; -#[cfg(test)] mod test_src9; diff --git a/packages/account/src/tests/extensions/test_src9.cairo b/packages/account/src/tests/extensions/test_src9.cairo index 74f098489..9547ce586 100644 --- a/packages/account/src/tests/extensions/test_src9.cairo +++ b/packages/account/src/tests/extensions/test_src9.cairo @@ -3,8 +3,8 @@ use crate::extensions::SRC9Component; use crate::extensions::src9::interface::{ISRC9_V2Dispatcher, ISRC9_V2DispatcherTrait}; use crate::extensions::src9::interface::{OutsideExecution, ISRC9_V2_ID}; use crate::extensions::src9::snip12_utils::OutsideExecutionStructHash; -use crate::tests::mocks::src9_mocks::SRC9AccountMock; use openzeppelin_introspection::interface::{ISRC5, ISRC5_ID}; +use openzeppelin_test_common::mocks::src9::SRC9AccountMock; use openzeppelin_testing as utils; use openzeppelin_testing::constants::{RECIPIENT, OWNER, OTHER, FELT_VALUE}; use openzeppelin_utils::cryptography::snip12::OffchainMessageHash; diff --git a/packages/account/src/tests/mocks.cairo b/packages/account/src/tests/mocks.cairo deleted file mode 100644 index e9e44bf5d..000000000 --- a/packages/account/src/tests/mocks.cairo +++ /dev/null @@ -1,4 +0,0 @@ -pub(crate) mod account_mocks; -pub(crate) mod eth_account_mocks; -pub(crate) mod simple_mock; -pub(crate) mod src9_mocks; diff --git a/packages/account/src/tests/mocks/account_mocks.cairo b/packages/account/src/tests/mocks/account_mocks.cairo deleted file mode 100644 index 893a339c1..000000000 --- a/packages/account/src/tests/mocks/account_mocks.cairo +++ /dev/null @@ -1,45 +0,0 @@ -#[starknet::contract(account)] -pub(crate) mod DualCaseAccountMock { - use crate::AccountComponent; - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: AccountComponent, storage: account, event: AccountEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // Account - #[abi(embed_v0)] - impl SRC6Impl = AccountComponent::SRC6Impl; - #[abi(embed_v0)] - impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl; - #[abi(embed_v0)] - impl DeclarerImpl = AccountComponent::DeclarerImpl; - #[abi(embed_v0)] - impl DeployableImpl = AccountComponent::DeployableImpl; - impl AccountInternalImpl = AccountComponent::InternalImpl; - - // SCR5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub account: AccountComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - AccountEvent: AccountComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState, public_key: felt252) { - self.account.initializer(public_key); - } -} diff --git a/packages/account/src/tests/mocks/eth_account_mocks.cairo b/packages/account/src/tests/mocks/eth_account_mocks.cairo deleted file mode 100644 index 71ddeb787..000000000 --- a/packages/account/src/tests/mocks/eth_account_mocks.cairo +++ /dev/null @@ -1,43 +0,0 @@ -#[starknet::contract(account)] -pub(crate) mod DualCaseEthAccountMock { - use crate::EthAccountComponent; - use crate::interface::EthPublicKey; - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - #[abi(embed_v0)] - impl SRC6Impl = EthAccountComponent::SRC6Impl; - #[abi(embed_v0)] - impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl; - #[abi(embed_v0)] - impl DeclarerImpl = EthAccountComponent::DeclarerImpl; - #[abi(embed_v0)] - impl DeployableImpl = EthAccountComponent::DeployableImpl; - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - impl EthAccountInternalImpl = EthAccountComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub eth_account: EthAccountComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - EthAccountEvent: EthAccountComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState, public_key: EthPublicKey) { - self.eth_account.initializer(public_key); - } -} diff --git a/packages/account/src/tests/test_account.cairo b/packages/account/src/tests/test_account.cairo index 9b906e756..4924f3ab4 100644 --- a/packages/account/src/tests/test_account.cairo +++ b/packages/account/src/tests/test_account.cairo @@ -4,11 +4,11 @@ use crate::AccountComponent::{PublicKeyCamelImpl, PublicKeyImpl}; use crate::AccountComponent; use crate::interface::{AccountABIDispatcherTrait, AccountABIDispatcher}; use crate::interface::{ISRC6, ISRC6_ID}; -use crate::tests::mocks::account_mocks::DualCaseAccountMock; -use crate::tests::mocks::simple_mock::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait}; use openzeppelin_introspection::interface::{ISRC5, ISRC5_ID}; use openzeppelin_test_common::account::{AccountSpyHelpers, SignedTransactionData}; use openzeppelin_test_common::account::{SIGNED_TX_DATA, get_accept_ownership_signature}; +use openzeppelin_test_common::mocks::account::DualCaseAccountMock; +use openzeppelin_test_common::mocks::simple::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait}; use openzeppelin_testing as utils; use openzeppelin_testing::constants::stark::{KEY_PAIR, KEY_PAIR_2}; use openzeppelin_testing::constants::{ diff --git a/packages/account/src/tests/test_eth_account.cairo b/packages/account/src/tests/test_eth_account.cairo index cae546168..cfa32e99e 100644 --- a/packages/account/src/tests/test_eth_account.cairo +++ b/packages/account/src/tests/test_eth_account.cairo @@ -3,8 +3,6 @@ use crate::EthAccountComponent::{PublicKeyCamelImpl, PublicKeyImpl}; use crate::EthAccountComponent; use crate::interface::{EthAccountABIDispatcherTrait, EthAccountABIDispatcher}; use crate::interface::{ISRC6, ISRC6_ID}; -use crate::tests::mocks::eth_account_mocks::DualCaseEthAccountMock; -use crate::tests::mocks::simple_mock::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait}; use crate::utils::secp256k1::{DebugSecp256k1Point, Secp256k1PointPartialEq}; use crate::utils::signature::EthSignature; use openzeppelin_introspection::interface::{ISRC5, ISRC5_ID}; @@ -12,6 +10,8 @@ use openzeppelin_test_common::eth_account::EthAccountSpyHelpers; use openzeppelin_test_common::eth_account::{ SIGNED_TX_DATA, SignedTransactionData, get_accept_ownership_signature }; +use openzeppelin_test_common::mocks::account::DualCaseEthAccountMock; +use openzeppelin_test_common::mocks::simple::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait}; use openzeppelin_testing as utils; use openzeppelin_testing::constants::secp256k1::{KEY_PAIR, KEY_PAIR_2}; use openzeppelin_testing::constants::{ diff --git a/packages/finance/Scarb.toml b/packages/finance/Scarb.toml index e1cdf8cb5..a80e942cf 100644 --- a/packages/finance/Scarb.toml +++ b/packages/finance/Scarb.toml @@ -37,3 +37,10 @@ openzeppelin_test_common = { path = "../test_common" } allowed-libfuncs-list.name = "experimental" sierra = true casm = false + +[[test]] +build-external-contracts = [ + "openzeppelin_test_common::mocks::vesting::LinearVestingMock", + "openzeppelin_test_common::mocks::vesting::StepsVestingMock", + "openzeppelin_test_common::mocks::vesting::ERC20OptionalTransferPanicMock", +] diff --git a/packages/finance/src/lib.cairo b/packages/finance/src/lib.cairo index a5a96a4c0..c8f018c2e 100644 --- a/packages/finance/src/lib.cairo +++ b/packages/finance/src/lib.cairo @@ -1,2 +1,4 @@ +#[cfg(test)] mod tests; + pub mod vesting; diff --git a/packages/finance/src/tests.cairo b/packages/finance/src/tests.cairo index 2ccfca4b9..cb61539ba 100644 --- a/packages/finance/src/tests.cairo +++ b/packages/finance/src/tests.cairo @@ -1,7 +1,4 @@ -#[cfg(test)] pub(crate) mod common; -pub(crate) mod mocks; -#[cfg(test)] + mod test_vesting_linear; -#[cfg(test)] mod test_vesting_steps; diff --git a/packages/finance/src/tests/common.cairo b/packages/finance/src/tests/common.cairo index 8dc623a80..bad9056f6 100644 --- a/packages/finance/src/tests/common.cairo +++ b/packages/finance/src/tests/common.cairo @@ -51,7 +51,7 @@ fn deploy_erc20_mock(recipient: ContractAddress, initial_supply: u256) -> IERC20 calldata.append_serde(initial_supply); calldata.append_serde(recipient); - let contract_address = utils::declare_and_deploy("ERC20Mock", calldata); + let contract_address = utils::declare_and_deploy("ERC20OptionalTransferPanicMock", calldata); IERC20Dispatcher { contract_address } } diff --git a/packages/finance/src/tests/mocks.cairo b/packages/finance/src/tests/mocks.cairo deleted file mode 100644 index c5a78361f..000000000 --- a/packages/finance/src/tests/mocks.cairo +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod erc20_mocks; -pub(crate) mod vesting_mocks; diff --git a/packages/finance/src/tests/mocks/erc20_mocks.cairo b/packages/finance/src/tests/mocks/erc20_mocks.cairo deleted file mode 100644 index 21bdec7d9..000000000 --- a/packages/finance/src/tests/mocks/erc20_mocks.cairo +++ /dev/null @@ -1,91 +0,0 @@ -#[starknet::contract] -pub(crate) mod ERC20Mock { - use openzeppelin_token::erc20::interface::IERC20; - use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl}; - use starknet::ContractAddress; - use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; - - component!(path: ERC20Component, storage: erc20, event: ERC20Event); - - #[abi(embed_v0)] - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; - - impl InternalImpl = ERC20Component::InternalImpl; - - #[storage] - struct Storage { - transfer_should_fail: bool, - #[substorage(v0)] - erc20: ERC20Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC20Event: ERC20Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - name: ByteArray, - symbol: ByteArray, - initial_supply: u256, - recipient: ContractAddress - ) { - self.erc20.initializer(name, symbol); - self.erc20.mint(recipient, initial_supply); - } - - #[abi(embed_v0)] - impl ERC20Impl of IERC20 { - fn total_supply(self: @ContractState) -> u256 { - self.erc20.total_supply() - } - - fn balance_of(self: @ContractState, account: ContractAddress) -> u256 { - self.erc20.balance_of(account) - } - - fn allowance( - self: @ContractState, owner: ContractAddress, spender: ContractAddress - ) -> u256 { - self.erc20.allowance(owner, spender) - } - - fn transfer(ref self: ContractState, recipient: ContractAddress, amount: u256) -> bool { - if self.transfer_should_fail.read() { - false - } else { - self.erc20.transfer(recipient, amount) - } - } - - fn transfer_from( - ref self: ContractState, - sender: ContractAddress, - recipient: ContractAddress, - amount: u256 - ) -> bool { - if self.transfer_should_fail.read() { - false - } else { - self.erc20.transfer_from(sender, recipient, amount) - } - } - - fn approve(ref self: ContractState, spender: ContractAddress, amount: u256) -> bool { - self.erc20.approve(spender, amount) - } - } - - #[generate_trait] - #[abi(per_item)] - impl ExternalImpl of ExternalTrait { - #[external(v0)] - fn set_transfer_should_fail(ref self: ContractState, should_fail: bool) { - self.transfer_should_fail.write(should_fail); - } - } -} diff --git a/packages/finance/src/tests/test_vesting_linear.cairo b/packages/finance/src/tests/test_vesting_linear.cairo index 8ed5ecf4b..fc4045c8a 100644 --- a/packages/finance/src/tests/test_vesting_linear.cairo +++ b/packages/finance/src/tests/test_vesting_linear.cairo @@ -1,9 +1,9 @@ use crate::tests::common::{VestingStrategy, TestData, setup, set_transfer_to_fail}; -use crate::tests::mocks::vesting_mocks::LinearVestingMock; use crate::vesting::VestingComponent::InternalImpl; use crate::vesting::VestingComponent; use crate::vesting::interface::IVestingDispatcherTrait; use openzeppelin_access::ownable::interface::{IOwnableDispatcher, IOwnableDispatcherTrait}; +use openzeppelin_test_common::mocks::vesting::LinearVestingMock; use openzeppelin_test_common::vesting::VestingSpyHelpers; use openzeppelin_testing::constants::{OWNER, OTHER}; use openzeppelin_token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait}; diff --git a/packages/finance/src/tests/test_vesting_steps.cairo b/packages/finance/src/tests/test_vesting_steps.cairo index 9c71eb043..a1ec4cbfc 100644 --- a/packages/finance/src/tests/test_vesting_steps.cairo +++ b/packages/finance/src/tests/test_vesting_steps.cairo @@ -1,9 +1,9 @@ use crate::tests::common::{VestingStrategy, TestData, setup, set_transfer_to_fail}; -use crate::tests::mocks::vesting_mocks::StepsVestingMock; use crate::vesting::VestingComponent::InternalImpl; use crate::vesting::VestingComponent; use crate::vesting::interface::IVestingDispatcherTrait; use openzeppelin_access::ownable::interface::{IOwnableDispatcher, IOwnableDispatcherTrait}; +use openzeppelin_test_common::mocks::vesting::StepsVestingMock; use openzeppelin_test_common::vesting::VestingSpyHelpers; use openzeppelin_testing::constants::{OWNER, OTHER}; use openzeppelin_token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait}; diff --git a/packages/governance/Scarb.toml b/packages/governance/Scarb.toml index dfc2f80b5..7a70d71ee 100644 --- a/packages/governance/Scarb.toml +++ b/packages/governance/Scarb.toml @@ -29,8 +29,9 @@ openzeppelin_introspection = { path = "../introspection" } [dev-dependencies] assert_macros.workspace = true snforge_std.workspace = true -openzeppelin_testing = { path = "../testing" } openzeppelin_utils = { path = "../utils" } +openzeppelin_testing = { path = "../testing" } +openzeppelin_test_common = { path = "../test_common" } [lib] @@ -38,3 +39,10 @@ openzeppelin_utils = { path = "../utils" } allowed-libfuncs-list.name = "experimental" sierra = true casm = false + +[[test]] +build-external-contracts = [ + "openzeppelin_test_common::mocks::timelock::TimelockControllerMock", + "openzeppelin_test_common::mocks::timelock::MockContract", + "openzeppelin_test_common::mocks::timelock::TimelockAttackerMock", +] diff --git a/packages/governance/src/lib.cairo b/packages/governance/src/lib.cairo index 852e24521..1320484fb 100644 --- a/packages/governance/src/lib.cairo +++ b/packages/governance/src/lib.cairo @@ -1,3 +1,4 @@ +#[cfg(test)] mod tests; pub mod timelock; diff --git a/packages/governance/src/tests.cairo b/packages/governance/src/tests.cairo index 221670eec..3aa8297b3 100644 --- a/packages/governance/src/tests.cairo +++ b/packages/governance/src/tests.cairo @@ -1,6 +1,2 @@ -pub(crate) mod mocks; - -#[cfg(test)] mod test_timelock; -#[cfg(test)] mod test_utils; diff --git a/packages/governance/src/tests/mocks.cairo b/packages/governance/src/tests/mocks.cairo deleted file mode 100644 index 6d38a6715..000000000 --- a/packages/governance/src/tests/mocks.cairo +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod non_implementing_mock; -pub(crate) mod timelock_mocks; diff --git a/packages/governance/src/tests/test_timelock.cairo b/packages/governance/src/tests/test_timelock.cairo index a110683b5..5851ab178 100644 --- a/packages/governance/src/tests/test_timelock.cairo +++ b/packages/governance/src/tests/test_timelock.cairo @@ -1,8 +1,5 @@ use core::hash::{HashStateTrait, HashStateExTrait}; use core::pedersen::PedersenTrait; -use crate::tests::mocks::timelock_mocks::{IMockContractDispatcher, IMockContractDispatcherTrait}; -use crate::tests::mocks::timelock_mocks::{ITimelockAttackerDispatcher}; -use crate::tests::mocks::timelock_mocks::{TimelockControllerMock}; use crate::timelock::OperationState; use crate::timelock::TimelockControllerComponent::{ CallScheduled, CallExecuted, CallSalt, CallCancelled, MinDelayChanged @@ -21,6 +18,11 @@ use openzeppelin_access::accesscontrol::interface::IACCESSCONTROL_ID; use openzeppelin_access::accesscontrol::interface::IAccessControl; use openzeppelin_introspection::interface::ISRC5_ID; use openzeppelin_introspection::src5::SRC5Component::SRC5Impl; +use openzeppelin_test_common::mocks::timelock::ITimelockAttackerDispatcher; +use openzeppelin_test_common::mocks::timelock::TimelockControllerMock; +use openzeppelin_test_common::mocks::timelock::{ + IMockContractDispatcher, IMockContractDispatcherTrait +}; use openzeppelin_testing as utils; use openzeppelin_testing::constants::{ADMIN, ZERO, OTHER, SALT, FELT_VALUE as VALUE}; use openzeppelin_testing::events::EventSpyExt; diff --git a/packages/introspection/Scarb.toml b/packages/introspection/Scarb.toml index c9567c1e9..32049773b 100644 --- a/packages/introspection/Scarb.toml +++ b/packages/introspection/Scarb.toml @@ -28,6 +28,7 @@ starknet.workspace = true [dev-dependencies] assert_macros.workspace = true snforge_std.workspace = true +openzeppelin_test_common = { path = "../test_common" } [lib] diff --git a/packages/introspection/src/lib.cairo b/packages/introspection/src/lib.cairo index 6134bb225..01a03e7d8 100644 --- a/packages/introspection/src/lib.cairo +++ b/packages/introspection/src/lib.cairo @@ -1,4 +1,5 @@ pub mod interface; pub mod src5; +#[cfg(test)] mod tests; diff --git a/packages/introspection/src/tests.cairo b/packages/introspection/src/tests.cairo index 72a21d551..32094b462 100644 --- a/packages/introspection/src/tests.cairo +++ b/packages/introspection/src/tests.cairo @@ -1,4 +1 @@ -pub(crate) mod mocks; - -#[cfg(test)] mod test_src5; diff --git a/packages/introspection/src/tests/mocks.cairo b/packages/introspection/src/tests/mocks.cairo deleted file mode 100644 index dc995e8e3..000000000 --- a/packages/introspection/src/tests/mocks.cairo +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod src5_mocks; diff --git a/packages/introspection/src/tests/mocks/src5_mocks.cairo b/packages/introspection/src/tests/mocks/src5_mocks.cairo deleted file mode 100644 index 81e65d236..000000000 --- a/packages/introspection/src/tests/mocks/src5_mocks.cairo +++ /dev/null @@ -1,22 +0,0 @@ -#[starknet::contract] -pub(crate) mod SRC5Mock { - use crate::src5::SRC5Component; - - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - SRC5Event: SRC5Component::Event - } -} diff --git a/packages/introspection/src/tests/test_src5.cairo b/packages/introspection/src/tests/test_src5.cairo index 1f131eeab..0473c8f31 100644 --- a/packages/introspection/src/tests/test_src5.cairo +++ b/packages/introspection/src/tests/test_src5.cairo @@ -1,7 +1,7 @@ use crate::interface::{ISRC5_ID, ISRC5}; use crate::src5::SRC5Component::InternalTrait; use crate::src5::SRC5Component; -use crate::tests::mocks::src5_mocks::SRC5Mock; +use openzeppelin_test_common::mocks::src5::SRC5Mock; const OTHER_ID: felt252 = 0x12345678; diff --git a/packages/presets/Scarb.toml b/packages/presets/Scarb.toml index 2b7d7c2d9..9e6a4dbdb 100644 --- a/packages/presets/Scarb.toml +++ b/packages/presets/Scarb.toml @@ -42,3 +42,18 @@ openzeppelin_test_common = { path = "../test_common" } allowed-libfuncs-list.name = "experimental" sierra = true casm = false + +[[test]] +build-external-contracts = [ + "openzeppelin_test_common::mocks::account::DualCaseAccountMock", + "openzeppelin_test_common::mocks::account::SnakeAccountMock", + "openzeppelin_test_common::mocks::account::SnakeEthAccountMock", + "openzeppelin_test_common::mocks::erc20::DualCaseERC20Mock", + "openzeppelin_test_common::mocks::erc20::SnakeERC20Mock", + "openzeppelin_test_common::mocks::erc721::SnakeERC721Mock", + "openzeppelin_test_common::mocks::erc721::DualCaseERC721ReceiverMock", + "openzeppelin_test_common::mocks::erc1155::DualCaseERC1155ReceiverMock", + "openzeppelin_test_common::mocks::erc1155::SnakeERC1155Mock", + "openzeppelin_test_common::mocks::src5::SRC5Mock", + "openzeppelin_test_common::mocks::non_implementing::NonImplementingMock", +] diff --git a/packages/presets/src/lib.cairo b/packages/presets/src/lib.cairo index 5dd344f9d..20d787138 100644 --- a/packages/presets/src/lib.cairo +++ b/packages/presets/src/lib.cairo @@ -5,7 +5,9 @@ pub mod erc721; pub mod eth_account; pub mod interfaces; +#[cfg(test)] mod tests; + pub mod universal_deployer; pub mod vesting; diff --git a/packages/presets/src/tests.cairo b/packages/presets/src/tests.cairo index 68fc25020..211c76d41 100644 --- a/packages/presets/src/tests.cairo +++ b/packages/presets/src/tests.cairo @@ -1,16 +1,7 @@ -mod mocks; - -#[cfg(test)] mod test_account; -#[cfg(test)] mod test_erc1155; -#[cfg(test)] mod test_erc20; -#[cfg(test)] mod test_erc721; -#[cfg(test)] mod test_eth_account; -#[cfg(test)] mod test_universal_deployer; -#[cfg(test)] mod test_vesting; diff --git a/packages/presets/src/tests/mocks.cairo b/packages/presets/src/tests/mocks.cairo deleted file mode 100644 index 2037caeeb..000000000 --- a/packages/presets/src/tests/mocks.cairo +++ /dev/null @@ -1,9 +0,0 @@ -pub(crate) mod account_mocks; -pub(crate) mod erc1155_mocks; -pub(crate) mod erc1155_receiver_mocks; -pub(crate) mod erc20_mocks; -pub(crate) mod erc721_mocks; -pub(crate) mod erc721_receiver_mocks; -pub(crate) mod eth_account_mocks; -pub(crate) mod non_implementing_mock; -pub(crate) mod src5_mocks; diff --git a/packages/presets/src/tests/mocks/account_mocks.cairo b/packages/presets/src/tests/mocks/account_mocks.cairo deleted file mode 100644 index c92013f39..000000000 --- a/packages/presets/src/tests/mocks/account_mocks.cairo +++ /dev/null @@ -1,87 +0,0 @@ -#[starknet::contract(account)] -pub(crate) mod DualCaseAccountMock { - use openzeppelin_account::AccountComponent; - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: AccountComponent, storage: account, event: AccountEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // Account - #[abi(embed_v0)] - impl SRC6Impl = AccountComponent::SRC6Impl; - #[abi(embed_v0)] - impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl; - #[abi(embed_v0)] - impl DeclarerImpl = AccountComponent::DeclarerImpl; - #[abi(embed_v0)] - impl DeployableImpl = AccountComponent::DeployableImpl; - impl AccountInternalImpl = AccountComponent::InternalImpl; - - // SCR5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub account: AccountComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - AccountEvent: AccountComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState, public_key: felt252) { - self.account.initializer(public_key); - } -} - -#[starknet::contract(account)] -pub(crate) mod SnakeAccountMock { - use openzeppelin_account::AccountComponent; - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: AccountComponent, storage: account, event: AccountEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // Account - #[abi(embed_v0)] - impl SRC6Impl = AccountComponent::SRC6Impl; - #[abi(embed_v0)] - impl PublicKeyImpl = AccountComponent::PublicKeyImpl; - impl AccountInternalImpl = AccountComponent::InternalImpl; - - // SCR5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub account: AccountComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - AccountEvent: AccountComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState, public_key: felt252) { - self.account.initializer(public_key); - } -} diff --git a/packages/presets/src/tests/mocks/erc1155_mocks.cairo b/packages/presets/src/tests/mocks/erc1155_mocks.cairo deleted file mode 100644 index 8ebd48000..000000000 --- a/packages/presets/src/tests/mocks/erc1155_mocks.cairo +++ /dev/null @@ -1,50 +0,0 @@ -#[starknet::contract] -pub(crate) mod SnakeERC1155Mock { - use openzeppelin_introspection::src5::SRC5Component; - use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl}; - use starknet::ContractAddress; - - component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // ERC1155 - #[abi(embed_v0)] - impl ERC1155Impl = ERC1155Component::ERC1155Impl; - #[abi(embed_v0)] - impl ERC1155MetadataURIImpl = - ERC1155Component::ERC1155MetadataURIImpl; - impl ERC1155InternalImpl = ERC1155Component::InternalImpl; - - // SRC5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc1155: ERC1155Component::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC1155Event: ERC1155Component::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - base_uri: ByteArray, - recipient: ContractAddress, - token_id: u256, - value: u256 - ) { - self.erc1155.initializer(base_uri); - self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span()); - } -} diff --git a/packages/presets/src/tests/mocks/erc1155_receiver_mocks.cairo b/packages/presets/src/tests/mocks/erc1155_receiver_mocks.cairo deleted file mode 100644 index 30e722593..000000000 --- a/packages/presets/src/tests/mocks/erc1155_receiver_mocks.cairo +++ /dev/null @@ -1,38 +0,0 @@ -#[starknet::contract] -pub(crate) mod DualCaseERC1155ReceiverMock { - use openzeppelin_introspection::src5::SRC5Component; - use openzeppelin_token::erc1155::ERC1155ReceiverComponent; - - component!(path: SRC5Component, storage: src5, event: SRC5Event); - component!( - path: ERC1155ReceiverComponent, storage: erc1155_receiver, event: ERC1155ReceiverEvent - ); - - // ERC1155Receiver Mixin - #[abi(embed_v0)] - impl ERC1155ReceiverMixinImpl = - ERC1155ReceiverComponent::ERC1155ReceiverMixinImpl; - impl ERC1155ReceiverInternalImpl = ERC1155ReceiverComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc1155_receiver: ERC1155ReceiverComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC1155ReceiverEvent: ERC1155ReceiverComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.erc1155_receiver.initializer(); - } -} diff --git a/packages/presets/src/tests/mocks/erc20_mocks.cairo b/packages/presets/src/tests/mocks/erc20_mocks.cairo deleted file mode 100644 index a80b5c29c..000000000 --- a/packages/presets/src/tests/mocks/erc20_mocks.cairo +++ /dev/null @@ -1,79 +0,0 @@ -#[starknet::contract] -pub(crate) mod DualCaseERC20Mock { - use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl}; - use starknet::ContractAddress; - - component!(path: ERC20Component, storage: erc20, event: ERC20Event); - - #[abi(embed_v0)] - impl ERC20Impl = ERC20Component::ERC20Impl; - #[abi(embed_v0)] - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; - #[abi(embed_v0)] - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl; - impl InternalImpl = ERC20Component::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc20: ERC20Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC20Event: ERC20Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - name: ByteArray, - symbol: ByteArray, - initial_supply: u256, - recipient: ContractAddress - ) { - self.erc20.initializer(name, symbol); - self.erc20.mint(recipient, initial_supply); - } -} - -#[starknet::contract] -pub(crate) mod SnakeERC20Mock { - use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl}; - use starknet::ContractAddress; - - component!(path: ERC20Component, storage: erc20, event: ERC20Event); - - #[abi(embed_v0)] - impl ERC20Impl = ERC20Component::ERC20Impl; - #[abi(embed_v0)] - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; - impl InternalImpl = ERC20Component::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc20: ERC20Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC20Event: ERC20Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - name: ByteArray, - symbol: ByteArray, - initial_supply: u256, - recipient: ContractAddress - ) { - self.erc20.initializer(name, symbol); - self.erc20.mint(recipient, initial_supply); - } -} diff --git a/packages/presets/src/tests/mocks/erc721_mocks.cairo b/packages/presets/src/tests/mocks/erc721_mocks.cairo deleted file mode 100644 index bf7357b32..000000000 --- a/packages/presets/src/tests/mocks/erc721_mocks.cairo +++ /dev/null @@ -1,50 +0,0 @@ -#[starknet::contract] -pub(crate) mod SnakeERC721Mock { - use openzeppelin_introspection::src5::SRC5Component; - use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl}; - use starknet::ContractAddress; - - component!(path: ERC721Component, storage: erc721, event: ERC721Event); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // ERC721 - #[abi(embed_v0)] - impl ERC721Impl = ERC721Component::ERC721Impl; - #[abi(embed_v0)] - impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl; - impl ERC721InternalImpl = ERC721Component::InternalImpl; - - // SRC5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc721: ERC721Component::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC721Event: ERC721Component::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - name: ByteArray, - symbol: ByteArray, - base_uri: ByteArray, - recipient: ContractAddress, - token_id: u256 - ) { - self.erc721.initializer(name, symbol, base_uri); - self.erc721.mint(recipient, token_id); - } -} diff --git a/packages/presets/src/tests/mocks/erc721_receiver_mocks.cairo b/packages/presets/src/tests/mocks/erc721_receiver_mocks.cairo deleted file mode 100644 index b18b1d647..000000000 --- a/packages/presets/src/tests/mocks/erc721_receiver_mocks.cairo +++ /dev/null @@ -1,71 +0,0 @@ -const SUCCESS: felt252 = 'SUCCESS'; - -#[starknet::contract] -pub(crate) mod DualCaseERC721ReceiverMock { - use openzeppelin_introspection::src5::SRC5Component; - use openzeppelin_token::erc721::ERC721ReceiverComponent; - use starknet::ContractAddress; - - component!(path: ERC721ReceiverComponent, storage: erc721_receiver, event: ERC721ReceiverEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // ERC721Receiver - impl ERC721ReceiverImpl = ERC721ReceiverComponent::ERC721ReceiverImpl; - impl ERC721ReceiverInternalImpl = ERC721ReceiverComponent::InternalImpl; - - // SRC5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc721_receiver: ERC721ReceiverComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC721ReceiverEvent: ERC721ReceiverComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.erc721_receiver.initializer(); - } - - #[abi(per_item)] - #[generate_trait] - impl ExternalImpl of ExternalTrait { - #[external(v0)] - fn on_erc721_received( - self: @ContractState, - operator: ContractAddress, - from: ContractAddress, - token_id: u256, - data: Span - ) -> felt252 { - if *data.at(0) == super::SUCCESS { - self.erc721_receiver.on_erc721_received(operator, from, token_id, data) - } else { - 0 - } - } - - #[external(v0)] - fn onERC721Received( - self: @ContractState, - operator: ContractAddress, - from: ContractAddress, - tokenId: u256, - data: Span - ) -> felt252 { - Self::on_erc721_received(self, operator, from, tokenId, data) - } - } -} diff --git a/packages/presets/src/tests/mocks/eth_account_mocks.cairo b/packages/presets/src/tests/mocks/eth_account_mocks.cairo deleted file mode 100644 index 392bd12f8..000000000 --- a/packages/presets/src/tests/mocks/eth_account_mocks.cairo +++ /dev/null @@ -1,39 +0,0 @@ -#[starknet::contract(account)] -pub(crate) mod SnakeEthAccountMock { - use openzeppelin_account::EthAccountComponent; - use openzeppelin_account::interface::EthPublicKey; - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - #[abi(embed_v0)] - impl SRC6Impl = EthAccountComponent::SRC6Impl; - #[abi(embed_v0)] - impl PublicKeyImpl = EthAccountComponent::PublicKeyImpl; - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - impl EthAccountInternalImpl = EthAccountComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub eth_account: EthAccountComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - EthAccountEvent: EthAccountComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState, public_key: EthPublicKey) { - self.eth_account.initializer(public_key); - } -} diff --git a/packages/presets/src/tests/mocks/non_implementing_mock.cairo b/packages/presets/src/tests/mocks/non_implementing_mock.cairo deleted file mode 100644 index 67d632c72..000000000 --- a/packages/presets/src/tests/mocks/non_implementing_mock.cairo +++ /dev/null @@ -1,10 +0,0 @@ -#[starknet::contract] -pub(crate) mod NonImplementingMock { - #[storage] - pub struct Storage {} - - #[external(v0)] - fn nope(self: @ContractState) -> bool { - false - } -} diff --git a/packages/security/Scarb.toml b/packages/security/Scarb.toml index 1e8262f2e..ea4242943 100644 --- a/packages/security/Scarb.toml +++ b/packages/security/Scarb.toml @@ -28,6 +28,7 @@ starknet.workspace = true assert_macros.workspace = true snforge_std.workspace = true openzeppelin_testing = { path = "../testing" } +openzeppelin_test_common = { path = "../test_common" } [lib] @@ -35,3 +36,9 @@ openzeppelin_testing = { path = "../testing" } allowed-libfuncs-list.name = "experimental" sierra = true casm = false + +[[test]] +build-external-contracts = [ + "openzeppelin_test_common::mocks::security::ReentrancyMock", + "openzeppelin_test_common::mocks::security::Attacker", +] diff --git a/packages/security/src/lib.cairo b/packages/security/src/lib.cairo index f8ecbcedc..d479f9e05 100644 --- a/packages/security/src/lib.cairo +++ b/packages/security/src/lib.cairo @@ -3,6 +3,7 @@ pub mod interface; pub mod pausable; pub mod reentrancyguard; +#[cfg(test)] mod tests; pub use initializable::InitializableComponent; diff --git a/packages/security/src/tests.cairo b/packages/security/src/tests.cairo index 0f674d192..35c30a0e8 100644 --- a/packages/security/src/tests.cairo +++ b/packages/security/src/tests.cairo @@ -1,8 +1,3 @@ -pub(crate) mod mocks; - -#[cfg(test)] mod test_initializable; -#[cfg(test)] mod test_pausable; -#[cfg(test)] mod test_reentrancyguard; diff --git a/packages/security/src/tests/mocks.cairo b/packages/security/src/tests/mocks.cairo deleted file mode 100644 index 81134e172..000000000 --- a/packages/security/src/tests/mocks.cairo +++ /dev/null @@ -1,3 +0,0 @@ -pub(crate) mod initializable_mocks; -pub(crate) mod pausable_mocks; -pub(crate) mod reentrancy_mocks; diff --git a/packages/security/src/tests/mocks/initializable_mocks.cairo b/packages/security/src/tests/mocks/initializable_mocks.cairo deleted file mode 100644 index 096acb947..000000000 --- a/packages/security/src/tests/mocks/initializable_mocks.cairo +++ /dev/null @@ -1,23 +0,0 @@ -#[starknet::contract] -pub(crate) mod InitializableMock { - use crate::initializable::InitializableComponent; - - component!(path: InitializableComponent, storage: initializable, event: InitializableEvent); - - #[abi(embed_v0)] - impl InitializableImpl = - InitializableComponent::InitializableImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub initializable: InitializableComponent::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - InitializableEvent: InitializableComponent::Event - } -} diff --git a/packages/security/src/tests/mocks/pausable_mocks.cairo b/packages/security/src/tests/mocks/pausable_mocks.cairo deleted file mode 100644 index 383a02fdb..000000000 --- a/packages/security/src/tests/mocks/pausable_mocks.cairo +++ /dev/null @@ -1,23 +0,0 @@ -#[starknet::contract] -pub(crate) mod PausableMock { - use crate::pausable::PausableComponent; - - component!(path: PausableComponent, storage: pausable, event: PausableEvent); - - #[abi(embed_v0)] - impl PausableImpl = PausableComponent::PausableImpl; - impl InternalImpl = PausableComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub pausable: PausableComponent::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - PausableEvent: PausableComponent::Event - } -} diff --git a/packages/security/src/tests/test_initializable.cairo b/packages/security/src/tests/test_initializable.cairo index 6817ca6ef..0b7ac8fc7 100644 --- a/packages/security/src/tests/test_initializable.cairo +++ b/packages/security/src/tests/test_initializable.cairo @@ -1,6 +1,6 @@ use crate::InitializableComponent::{InitializableImpl, InternalImpl}; use crate::InitializableComponent; -use crate::tests::mocks::initializable_mocks::InitializableMock; +use openzeppelin_test_common::mocks::security::InitializableMock; type ComponentState = InitializableComponent::ComponentState; diff --git a/packages/security/src/tests/test_pausable.cairo b/packages/security/src/tests/test_pausable.cairo index de50a5683..486819c0e 100644 --- a/packages/security/src/tests/test_pausable.cairo +++ b/packages/security/src/tests/test_pausable.cairo @@ -1,7 +1,7 @@ use crate::PausableComponent::{InternalImpl, PausableImpl}; use crate::PausableComponent::{Paused, Unpaused}; use crate::PausableComponent; -use crate::tests::mocks::pausable_mocks::PausableMock; +use openzeppelin_test_common::mocks::security::PausableMock; use openzeppelin_testing::constants::CALLER; use openzeppelin_testing::events::EventSpyExt; use snforge_std::EventSpy; diff --git a/packages/security/src/tests/test_reentrancyguard.cairo b/packages/security/src/tests/test_reentrancyguard.cairo index aaa1db457..8647c9e9e 100644 --- a/packages/security/src/tests/test_reentrancyguard.cairo +++ b/packages/security/src/tests/test_reentrancyguard.cairo @@ -1,6 +1,6 @@ use crate::ReentrancyGuardComponent::InternalImpl; use crate::ReentrancyGuardComponent; -use crate::tests::mocks::reentrancy_mocks::{ +use openzeppelin_test_common::mocks::security::{ ReentrancyMock, IReentrancyMockDispatcher, IReentrancyMockDispatcherTrait }; use openzeppelin_testing as utils; diff --git a/packages/test_common/Scarb.toml b/packages/test_common/Scarb.toml index 1314cb3ea..1d488b357 100644 --- a/packages/test_common/Scarb.toml +++ b/packages/test_common/Scarb.toml @@ -16,13 +16,14 @@ keywords.workspace = true fmt.workspace = true [dependencies] -assert_macros.workspace = true starknet.workspace = true snforge_std.workspace = true openzeppelin_upgrades = { path = "../upgrades" } openzeppelin_access = { path = "../access" } openzeppelin_account = { path = "../account" } openzeppelin_finance = { path = "../finance" } +openzeppelin_introspection = { path = "../introspection" } +openzeppelin_security = { path = "../security" } openzeppelin_token = { path = "../token" } openzeppelin_testing = { path = "../testing" } openzeppelin_utils = { path = "../utils" } diff --git a/packages/test_common/src/lib.cairo b/packages/test_common/src/lib.cairo index 8013cedc4..55dcb574e 100644 --- a/packages/test_common/src/lib.cairo +++ b/packages/test_common/src/lib.cairo @@ -3,6 +3,7 @@ pub mod erc1155; pub mod erc20; pub mod erc721; pub mod eth_account; +pub mod mocks; pub mod ownable; pub mod upgrades; pub mod vesting; diff --git a/packages/test_common/src/mocks.cairo b/packages/test_common/src/mocks.cairo new file mode 100644 index 000000000..5cd4a9a96 --- /dev/null +++ b/packages/test_common/src/mocks.cairo @@ -0,0 +1,15 @@ +pub mod access; +pub mod account; +pub mod erc1155; +pub mod erc20; +pub mod erc2981; +pub mod erc721; +pub mod non_implementing; +pub mod nonces; +pub mod security; +pub mod simple; +pub mod src5; +pub mod src9; +pub mod timelock; +pub mod upgrades; +pub mod vesting; diff --git a/packages/test_common/src/mocks/access.cairo b/packages/test_common/src/mocks/access.cairo new file mode 100644 index 000000000..ccca94518 --- /dev/null +++ b/packages/test_common/src/mocks/access.cairo @@ -0,0 +1,100 @@ +#[starknet::contract] +pub mod DualCaseAccessControlMock { + use openzeppelin_access::accesscontrol::AccessControlComponent; + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE; + use openzeppelin_introspection::src5::SRC5Component; + use starknet::ContractAddress; + + component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // AccessControlMixin + #[abi(embed_v0)] + impl AccessControlMixinImpl = + AccessControlComponent::AccessControlMixinImpl; + impl AccessControlInternalImpl = AccessControlComponent::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub accesscontrol: AccessControlComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + AccessControlEvent: AccessControlComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState, admin: ContractAddress) { + self.accesscontrol.initializer(); + self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, admin); + } +} + +#[starknet::contract] +pub mod DualCaseOwnableMock { + use openzeppelin_access::ownable::OwnableComponent; + use starknet::ContractAddress; + + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + + #[abi(embed_v0)] + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl; + impl InternalImpl = OwnableComponent::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub ownable: OwnableComponent::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + OwnableEvent: OwnableComponent::Event + } + + #[constructor] + fn constructor(ref self: ContractState, owner: ContractAddress) { + self.ownable.initializer(owner); + } +} + +#[starknet::contract] +pub mod DualCaseTwoStepOwnableMock { + use openzeppelin_access::ownable::OwnableComponent; + use starknet::ContractAddress; + + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + + #[abi(embed_v0)] + impl OwnableTwoStepMixinImpl = + OwnableComponent::OwnableTwoStepMixinImpl; + impl InternalImpl = OwnableComponent::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + ownable: OwnableComponent::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + OwnableEvent: OwnableComponent::Event + } + + #[constructor] + fn constructor(ref self: ContractState, owner: ContractAddress) { + self.ownable.initializer(owner); + } +} diff --git a/packages/test_common/src/mocks/account.cairo b/packages/test_common/src/mocks/account.cairo new file mode 100644 index 000000000..69c6eaf02 --- /dev/null +++ b/packages/test_common/src/mocks/account.cairo @@ -0,0 +1,171 @@ +#[starknet::contract(account)] +pub mod DualCaseAccountMock { + use openzeppelin_account::AccountComponent; + use openzeppelin_introspection::src5::SRC5Component; + + component!(path: AccountComponent, storage: account, event: AccountEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // Account + #[abi(embed_v0)] + impl SRC6Impl = AccountComponent::SRC6Impl; + #[abi(embed_v0)] + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl; + #[abi(embed_v0)] + impl DeclarerImpl = AccountComponent::DeclarerImpl; + #[abi(embed_v0)] + impl DeployableImpl = AccountComponent::DeployableImpl; + impl AccountInternalImpl = AccountComponent::InternalImpl; + + // SCR5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub account: AccountComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + AccountEvent: AccountComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState, public_key: felt252) { + self.account.initializer(public_key); + } +} + +#[starknet::contract(account)] +pub mod SnakeAccountMock { + use openzeppelin_account::AccountComponent; + use openzeppelin_introspection::src5::SRC5Component; + + component!(path: AccountComponent, storage: account, event: AccountEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // Account + #[abi(embed_v0)] + impl SRC6Impl = AccountComponent::SRC6Impl; + #[abi(embed_v0)] + impl PublicKeyImpl = AccountComponent::PublicKeyImpl; + impl AccountInternalImpl = AccountComponent::InternalImpl; + + // SCR5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub account: AccountComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + AccountEvent: AccountComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState, public_key: felt252) { + self.account.initializer(public_key); + } +} + +#[starknet::contract(account)] +pub mod DualCaseEthAccountMock { + use openzeppelin_account::EthAccountComponent; + use openzeppelin_account::interface::EthPublicKey; + use openzeppelin_introspection::src5::SRC5Component; + + component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + #[abi(embed_v0)] + impl SRC6Impl = EthAccountComponent::SRC6Impl; + #[abi(embed_v0)] + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl; + #[abi(embed_v0)] + impl DeclarerImpl = EthAccountComponent::DeclarerImpl; + #[abi(embed_v0)] + impl DeployableImpl = EthAccountComponent::DeployableImpl; + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + impl EthAccountInternalImpl = EthAccountComponent::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub eth_account: EthAccountComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + EthAccountEvent: EthAccountComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState, public_key: EthPublicKey) { + self.eth_account.initializer(public_key); + } +} + +#[starknet::contract(account)] +pub mod SnakeEthAccountMock { + use openzeppelin_account::EthAccountComponent; + use openzeppelin_account::interface::EthPublicKey; + use openzeppelin_introspection::src5::SRC5Component; + + component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + #[abi(embed_v0)] + impl SRC6Impl = EthAccountComponent::SRC6Impl; + #[abi(embed_v0)] + impl PublicKeyImpl = EthAccountComponent::PublicKeyImpl; + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + impl EthAccountInternalImpl = EthAccountComponent::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub eth_account: EthAccountComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + EthAccountEvent: EthAccountComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState, public_key: EthPublicKey) { + self.eth_account.initializer(public_key); + } +} diff --git a/packages/test_common/src/mocks/erc1155.cairo b/packages/test_common/src/mocks/erc1155.cairo new file mode 100644 index 000000000..8c206e95e --- /dev/null +++ b/packages/test_common/src/mocks/erc1155.cairo @@ -0,0 +1,142 @@ +#[starknet::contract] +pub mod DualCaseERC1155Mock { + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl}; + use starknet::ContractAddress; + + component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // ERC1155 + #[abi(embed_v0)] + impl ERC1155Impl = ERC1155Component::ERC1155Impl; + #[abi(embed_v0)] + impl ERC1155MetadataURIImpl = + ERC1155Component::ERC1155MetadataURIImpl; + #[abi(embed_v0)] + impl ERC721Camel = ERC1155Component::ERC1155CamelImpl; + impl ERC1155InternalImpl = ERC1155Component::InternalImpl; + + // SRC5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc1155: ERC1155Component::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC1155Event: ERC1155Component::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor( + ref self: ContractState, + base_uri: ByteArray, + recipient: ContractAddress, + token_id: u256, + value: u256 + ) { + self.erc1155.initializer(base_uri); + self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span()); + } +} + +#[starknet::contract] +pub mod SnakeERC1155Mock { + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl}; + use starknet::ContractAddress; + + component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // ERC1155 + #[abi(embed_v0)] + impl ERC1155Impl = ERC1155Component::ERC1155Impl; + #[abi(embed_v0)] + impl ERC1155MetadataURIImpl = + ERC1155Component::ERC1155MetadataURIImpl; + impl ERC1155InternalImpl = ERC1155Component::InternalImpl; + + // SRC5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc1155: ERC1155Component::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC1155Event: ERC1155Component::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor( + ref self: ContractState, + base_uri: ByteArray, + recipient: ContractAddress, + token_id: u256, + value: u256 + ) { + self.erc1155.initializer(base_uri); + self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span()); + } +} + +#[starknet::contract] +pub mod DualCaseERC1155ReceiverMock { + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::erc1155::ERC1155ReceiverComponent; + + component!(path: SRC5Component, storage: src5, event: SRC5Event); + component!( + path: ERC1155ReceiverComponent, storage: erc1155_receiver, event: ERC1155ReceiverEvent + ); + + // ERC1155Receiver Mixin + #[abi(embed_v0)] + impl ERC1155ReceiverMixinImpl = + ERC1155ReceiverComponent::ERC1155ReceiverMixinImpl; + impl ERC1155ReceiverInternalImpl = ERC1155ReceiverComponent::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc1155_receiver: ERC1155ReceiverComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC1155ReceiverEvent: ERC1155ReceiverComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState) { + self.erc1155_receiver.initializer(); + } +} diff --git a/packages/token/src/tests/mocks/erc20_votes_mocks.cairo b/packages/test_common/src/mocks/erc20.cairo similarity index 52% rename from packages/token/src/tests/mocks/erc20_votes_mocks.cairo rename to packages/test_common/src/mocks/erc20.cairo index c777ec62f..650854aaa 100644 --- a/packages/token/src/tests/mocks/erc20_votes_mocks.cairo +++ b/packages/test_common/src/mocks/erc20.cairo @@ -1,8 +1,88 @@ #[starknet::contract] -pub(crate) mod DualCaseERC20VotesMock { - use crate::erc20::ERC20Component; - use crate::erc20::extensions::ERC20VotesComponent::InternalTrait as ERC20VotesInternalTrait; - use crate::erc20::extensions::ERC20VotesComponent; +pub mod DualCaseERC20Mock { + use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl}; + use starknet::ContractAddress; + + component!(path: ERC20Component, storage: erc20, event: ERC20Event); + + #[abi(embed_v0)] + impl ERC20Impl = ERC20Component::ERC20Impl; + #[abi(embed_v0)] + impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; + #[abi(embed_v0)] + impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl; + impl InternalImpl = ERC20Component::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc20: ERC20Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC20Event: ERC20Component::Event + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + initial_supply: u256, + recipient: ContractAddress + ) { + self.erc20.initializer(name, symbol); + self.erc20.mint(recipient, initial_supply); + } +} + +#[starknet::contract] +pub mod SnakeERC20Mock { + use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl}; + use starknet::ContractAddress; + + component!(path: ERC20Component, storage: erc20, event: ERC20Event); + + #[abi(embed_v0)] + impl ERC20Impl = ERC20Component::ERC20Impl; + #[abi(embed_v0)] + impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; + impl InternalImpl = ERC20Component::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc20: ERC20Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC20Event: ERC20Component::Event + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + initial_supply: u256, + recipient: ContractAddress + ) { + self.erc20.initializer(name, symbol); + self.erc20.mint(recipient, initial_supply); + } +} + +#[starknet::contract] +pub mod DualCaseERC20VotesMock { + use openzeppelin_token::erc20::ERC20Component; + use openzeppelin_token::erc20::extensions::ERC20VotesComponent::InternalTrait as ERC20VotesInternalTrait; + use openzeppelin_token::erc20::extensions::ERC20VotesComponent; use openzeppelin_utils::cryptography::nonces::NoncesComponent; use openzeppelin_utils::cryptography::snip12::SNIP12Metadata; use starknet::ContractAddress; @@ -47,7 +127,7 @@ pub(crate) mod DualCaseERC20VotesMock { } /// Required for hash computation. - pub(crate) impl SNIP12MetadataImpl of SNIP12Metadata { + pub impl SNIP12MetadataImpl of SNIP12Metadata { fn name() -> felt252 { 'DAPP_NAME' } diff --git a/packages/token/src/tests/mocks/erc2981_mocks.cairo b/packages/test_common/src/mocks/erc2981.cairo similarity index 92% rename from packages/token/src/tests/mocks/erc2981_mocks.cairo rename to packages/test_common/src/mocks/erc2981.cairo index ead9863d4..e60da6232 100644 --- a/packages/token/src/tests/mocks/erc2981_mocks.cairo +++ b/packages/test_common/src/mocks/erc2981.cairo @@ -1,7 +1,7 @@ #[starknet::contract] -pub(crate) mod ERC2981Mock { - use crate::common::erc2981::{ERC2981Component, DefaultConfig}; +pub mod ERC2981Mock { use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::common::erc2981::{ERC2981Component, DefaultConfig}; use starknet::ContractAddress; component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event); diff --git a/packages/test_common/src/mocks/erc721.cairo b/packages/test_common/src/mocks/erc721.cairo new file mode 100644 index 000000000..18106dac7 --- /dev/null +++ b/packages/test_common/src/mocks/erc721.cairo @@ -0,0 +1,254 @@ +const SUCCESS: felt252 = 'SUCCESS'; + +#[starknet::contract] +pub mod DualCaseERC721Mock { + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl}; + use starknet::ContractAddress; + + component!(path: ERC721Component, storage: erc721, event: ERC721Event); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // ERC721 + #[abi(embed_v0)] + impl ERC721Impl = ERC721Component::ERC721Impl; + #[abi(embed_v0)] + impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl; + #[abi(embed_v0)] + impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl; + #[abi(embed_v0)] + impl ERC721MetadataCamelOnly = + ERC721Component::ERC721MetadataCamelOnlyImpl; + impl ERC721InternalImpl = ERC721Component::InternalImpl; + + // SRC5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc721: ERC721Component::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC721Event: ERC721Component::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + base_uri: ByteArray, + recipient: ContractAddress, + token_id: u256 + ) { + self.erc721.initializer(name, symbol, base_uri); + self.erc721.mint(recipient, token_id); + } +} + +#[starknet::contract] +pub mod SnakeERC721Mock { + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl}; + use starknet::ContractAddress; + + component!(path: ERC721Component, storage: erc721, event: ERC721Event); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // ERC721 + #[abi(embed_v0)] + impl ERC721Impl = ERC721Component::ERC721Impl; + #[abi(embed_v0)] + impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl; + impl ERC721InternalImpl = ERC721Component::InternalImpl; + + // SRC5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc721: ERC721Component::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC721Event: ERC721Component::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + base_uri: ByteArray, + recipient: ContractAddress, + token_id: u256 + ) { + self.erc721.initializer(name, symbol, base_uri); + self.erc721.mint(recipient, token_id); + } +} + +#[starknet::contract] +pub mod DualCaseERC721ReceiverMock { + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::erc721::ERC721ReceiverComponent; + use starknet::ContractAddress; + + component!(path: ERC721ReceiverComponent, storage: erc721_receiver, event: ERC721ReceiverEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // ERC721Receiver + impl ERC721ReceiverImpl = ERC721ReceiverComponent::ERC721ReceiverImpl; + impl ERC721ReceiverInternalImpl = ERC721ReceiverComponent::InternalImpl; + + // SRC5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc721_receiver: ERC721ReceiverComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC721ReceiverEvent: ERC721ReceiverComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState) { + self.erc721_receiver.initializer(); + } + + #[abi(per_item)] + #[generate_trait] + impl ExternalImpl of ExternalTrait { + #[external(v0)] + fn on_erc721_received( + self: @ContractState, + operator: ContractAddress, + from: ContractAddress, + token_id: u256, + data: Span + ) -> felt252 { + if *data.at(0) == super::SUCCESS { + self.erc721_receiver.on_erc721_received(operator, from, token_id, data) + } else { + 0 + } + } + + #[external(v0)] + fn onERC721Received( + self: @ContractState, + operator: ContractAddress, + from: ContractAddress, + tokenId: u256, + data: Span + ) -> felt252 { + Self::on_erc721_received(self, operator, from, tokenId, data) + } + } +} + +#[starknet::contract] +pub mod ERC721EnumerableMock { + use openzeppelin_introspection::src5::SRC5Component; + use openzeppelin_token::erc721::ERC721Component; + use openzeppelin_token::erc721::extensions::ERC721EnumerableComponent; + use starknet::ContractAddress; + + component!(path: ERC721Component, storage: erc721, event: ERC721Event); + component!( + path: ERC721EnumerableComponent, storage: erc721_enumerable, event: ERC721EnumerableEvent + ); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // ERC721 + #[abi(embed_v0)] + impl ERC721MixinImpl = ERC721Component::ERC721Impl; + impl ERC721InternalImpl = ERC721Component::InternalImpl; + + // ERC721Enumerable + #[abi(embed_v0)] + impl ERC721EnumerableImpl = + ERC721EnumerableComponent::ERC721EnumerableImpl; + impl ERC721EnumerableInternalImpl = ERC721EnumerableComponent::InternalImpl; + + // SRC5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub erc721: ERC721Component::Storage, + #[substorage(v0)] + pub erc721_enumerable: ERC721EnumerableComponent::Storage, + #[substorage(v0)] + pub src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC721Event: ERC721Component::Event, + #[flat] + ERC721EnumerableEvent: ERC721EnumerableComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait { + fn before_update( + ref self: ERC721Component::ComponentState, + to: ContractAddress, + token_id: u256, + auth: ContractAddress + ) { + let mut contract_state = ERC721Component::HasComponent::get_contract_mut(ref self); + contract_state.erc721_enumerable.before_update(to, token_id); + } + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + base_uri: ByteArray, + recipient: ContractAddress, + token_id: u256 + ) { + self.erc721.initializer(name, symbol, base_uri); + self.erc721_enumerable.initializer(); + self.erc721.mint(recipient, token_id); + } +} diff --git a/packages/governance/src/tests/mocks/non_implementing_mock.cairo b/packages/test_common/src/mocks/non_implementing.cairo similarity index 80% rename from packages/governance/src/tests/mocks/non_implementing_mock.cairo rename to packages/test_common/src/mocks/non_implementing.cairo index 67d632c72..4f54b0fd3 100644 --- a/packages/governance/src/tests/mocks/non_implementing_mock.cairo +++ b/packages/test_common/src/mocks/non_implementing.cairo @@ -1,5 +1,5 @@ #[starknet::contract] -pub(crate) mod NonImplementingMock { +pub mod NonImplementingMock { #[storage] pub struct Storage {} diff --git a/packages/utils/src/tests/mocks/nonces_mocks.cairo b/packages/test_common/src/mocks/nonces.cairo similarity index 85% rename from packages/utils/src/tests/mocks/nonces_mocks.cairo rename to packages/test_common/src/mocks/nonces.cairo index b2acf4cd5..92365d717 100644 --- a/packages/utils/src/tests/mocks/nonces_mocks.cairo +++ b/packages/test_common/src/mocks/nonces.cairo @@ -1,6 +1,6 @@ #[starknet::contract] -pub(crate) mod NoncesMock { - use crate::cryptography::nonces::NoncesComponent; +pub mod NoncesMock { + use openzeppelin_utils::cryptography::nonces::NoncesComponent; component!(path: NoncesComponent, storage: nonces, event: NoncesEvent); diff --git a/packages/security/src/tests/mocks/reentrancy_mocks.cairo b/packages/test_common/src/mocks/security.cairo similarity index 71% rename from packages/security/src/tests/mocks/reentrancy_mocks.cairo rename to packages/test_common/src/mocks/security.cairo index c270d8d69..cac6c3acc 100644 --- a/packages/security/src/tests/mocks/reentrancy_mocks.cairo +++ b/packages/test_common/src/mocks/security.cairo @@ -1,4 +1,51 @@ use starknet::ContractAddress; +#[starknet::contract] +pub mod InitializableMock { + use openzeppelin_security::initializable::InitializableComponent; + + component!(path: InitializableComponent, storage: initializable, event: InitializableEvent); + + #[abi(embed_v0)] + impl InitializableImpl = + InitializableComponent::InitializableImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub initializable: InitializableComponent::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + InitializableEvent: InitializableComponent::Event + } +} + +#[starknet::contract] +pub mod PausableMock { + use openzeppelin_security::pausable::PausableComponent; + + component!(path: PausableComponent, storage: pausable, event: PausableEvent); + + #[abi(embed_v0)] + impl PausableImpl = PausableComponent::PausableImpl; + impl InternalImpl = PausableComponent::InternalImpl; + + #[storage] + pub struct Storage { + #[substorage(v0)] + pub pausable: PausableComponent::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + PausableEvent: PausableComponent::Event + } +} #[starknet::interface] trait IReentrancyGuarded { @@ -6,7 +53,7 @@ trait IReentrancyGuarded { } #[starknet::interface] -pub(crate) trait IReentrancyMock { +pub trait IReentrancyMock { fn count(ref self: TState); fn current_count(self: @TState) -> felt252; fn callback(ref self: TState); @@ -16,8 +63,8 @@ pub(crate) trait IReentrancyMock { } #[starknet::contract] -pub(crate) mod ReentrancyMock { - use crate::reentrancyguard::ReentrancyGuardComponent; +pub mod ReentrancyMock { + use openzeppelin_security::reentrancyguard::ReentrancyGuardComponent; use starknet::ContractAddress; use starknet::get_contract_address; use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; @@ -107,7 +154,7 @@ trait IAttacker { } #[starknet::contract] -pub(crate) mod Attacker { +pub mod Attacker { use starknet::ContractAddress; use starknet::get_caller_address; use super::IReentrancyMockDispatcher; diff --git a/packages/account/src/tests/mocks/simple_mock.cairo b/packages/test_common/src/mocks/simple.cairo similarity index 90% rename from packages/account/src/tests/mocks/simple_mock.cairo rename to packages/test_common/src/mocks/simple.cairo index f16386735..d1eab519a 100644 --- a/packages/account/src/tests/mocks/simple_mock.cairo +++ b/packages/test_common/src/mocks/simple.cairo @@ -1,12 +1,13 @@ #[starknet::interface] -pub(crate) trait ISimpleMock { +pub trait ISimpleMock { fn increase_balance(ref self: TContractState, amount: felt252) -> bool; fn get_balance(self: @TContractState) -> felt252; } #[starknet::contract] -pub(crate) mod SimpleMock { +pub mod SimpleMock { use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; + #[storage] pub struct Storage { pub balance: felt252, diff --git a/packages/presets/src/tests/mocks/src5_mocks.cairo b/packages/test_common/src/mocks/src5.cairo similarity index 94% rename from packages/presets/src/tests/mocks/src5_mocks.cairo rename to packages/test_common/src/mocks/src5.cairo index df481ced5..0d20d0a40 100644 --- a/packages/presets/src/tests/mocks/src5_mocks.cairo +++ b/packages/test_common/src/mocks/src5.cairo @@ -1,5 +1,5 @@ #[starknet::contract] -pub(crate) mod SRC5Mock { +pub mod SRC5Mock { use openzeppelin_introspection::src5::SRC5Component; component!(path: SRC5Component, storage: src5, event: SRC5Event); diff --git a/packages/account/src/tests/mocks/src9_mocks.cairo b/packages/test_common/src/mocks/src9.cairo similarity index 93% rename from packages/account/src/tests/mocks/src9_mocks.cairo rename to packages/test_common/src/mocks/src9.cairo index 0f41818f2..a7a7bcafb 100644 --- a/packages/account/src/tests/mocks/src9_mocks.cairo +++ b/packages/test_common/src/mocks/src9.cairo @@ -1,7 +1,7 @@ #[starknet::contract(account)] -pub(crate) mod SRC9AccountMock { - use crate::AccountComponent; - use crate::extensions::SRC9Component; +pub mod SRC9AccountMock { + use openzeppelin_account::AccountComponent; + use openzeppelin_account::extensions::SRC9Component; use openzeppelin_introspection::src5::SRC5Component; use starknet::storage::StoragePointerWriteAccess; diff --git a/packages/governance/src/tests/mocks/timelock_mocks.cairo b/packages/test_common/src/mocks/timelock.cairo similarity index 92% rename from packages/governance/src/tests/mocks/timelock_mocks.cairo rename to packages/test_common/src/mocks/timelock.cairo index 68359db97..974e7e2b8 100644 --- a/packages/governance/src/tests/mocks/timelock_mocks.cairo +++ b/packages/test_common/src/mocks/timelock.cairo @@ -1,7 +1,7 @@ #[starknet::contract] -pub(crate) mod TimelockControllerMock { - use crate::timelock::TimelockControllerComponent; +pub mod TimelockControllerMock { use openzeppelin_access::accesscontrol::AccessControlComponent; + use openzeppelin_governance::timelock::TimelockControllerComponent; use openzeppelin_introspection::src5::SRC5Component; use starknet::ContractAddress; @@ -49,14 +49,14 @@ pub(crate) mod TimelockControllerMock { } #[starknet::interface] -pub(crate) trait IMockContract { +pub trait IMockContract { fn set_number(ref self: TState, new_number: felt252); fn get_number(self: @TState) -> felt252; fn failing_function(self: @TState); } #[starknet::contract] -pub(crate) mod MockContract { +pub mod MockContract { use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; use super::IMockContract; @@ -82,14 +82,16 @@ pub(crate) mod MockContract { } #[starknet::interface] -pub(crate) trait ITimelockAttacker { +pub trait ITimelockAttacker { fn reenter(ref self: TState); fn reenter_batch(ref self: TState); } #[starknet::contract] -pub(crate) mod TimelockAttackerMock { - use crate::timelock::interface::{ITimelockDispatcher, ITimelockDispatcherTrait}; +pub mod TimelockAttackerMock { + use openzeppelin_governance::timelock::interface::{ + ITimelockDispatcher, ITimelockDispatcherTrait + }; use starknet::account::Call; use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; use super::ITimelockAttacker; diff --git a/packages/upgrades/src/tests/mocks/upgrades_mocks.cairo b/packages/test_common/src/mocks/upgrades.cairo similarity index 88% rename from packages/upgrades/src/tests/mocks/upgrades_mocks.cairo rename to packages/test_common/src/mocks/upgrades.cairo index d46e66681..7cd2e87f8 100644 --- a/packages/upgrades/src/tests/mocks/upgrades_mocks.cairo +++ b/packages/test_common/src/mocks/upgrades.cairo @@ -1,11 +1,7 @@ -// These contracts are mocks used to test the core functionality of the upgrade functions. -// The functions are NOT PROTECTED. -// DO NOT USE IN PRODUCTION. - use starknet::ClassHash; #[starknet::interface] -pub(crate) trait IUpgradesV1 { +pub trait IUpgradesV1 { fn upgrade(ref self: TState, new_class_hash: ClassHash); fn set_value(ref self: TState, val: felt252); fn get_value(self: @TState) -> felt252; @@ -13,8 +9,8 @@ pub(crate) trait IUpgradesV1 { } #[starknet::contract] -pub(crate) mod UpgradesV1 { - use crate::UpgradeableComponent; +pub mod UpgradesV1 { + use openzeppelin_upgrades::UpgradeableComponent; use starknet::ClassHash; use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; @@ -55,7 +51,7 @@ pub(crate) mod UpgradesV1 { } #[starknet::interface] -pub(crate) trait IUpgradesV2 { +pub trait IUpgradesV2 { fn upgrade(ref self: TState, new_class_hash: ClassHash); fn set_value(ref self: TState, val: felt252); fn set_value2(ref self: TState, val: felt252); @@ -64,8 +60,8 @@ pub(crate) trait IUpgradesV2 { } #[starknet::contract] -pub(crate) mod UpgradesV2 { - use crate::UpgradeableComponent; +pub mod UpgradesV2 { + use openzeppelin_upgrades::UpgradeableComponent; use starknet::ClassHash; use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; diff --git a/packages/finance/src/tests/mocks/vesting_mocks.cairo b/packages/test_common/src/mocks/vesting.cairo similarity index 56% rename from packages/finance/src/tests/mocks/vesting_mocks.cairo rename to packages/test_common/src/mocks/vesting.cairo index 0674035d4..ae1489cfb 100644 --- a/packages/finance/src/tests/mocks/vesting_mocks.cairo +++ b/packages/test_common/src/mocks/vesting.cairo @@ -1,7 +1,7 @@ #[starknet::contract] -pub(crate) mod LinearVestingMock { - use crate::vesting::{VestingComponent, LinearVestingSchedule}; +pub mod LinearVestingMock { use openzeppelin_access::ownable::OwnableComponent; + use openzeppelin_finance::vesting::{VestingComponent, LinearVestingSchedule}; use starknet::ContractAddress; component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); @@ -48,10 +48,10 @@ pub(crate) mod LinearVestingMock { } #[starknet::contract] -pub(crate) mod StepsVestingMock { - use crate::vesting::VestingComponent::VestingScheduleTrait; - use crate::vesting::VestingComponent; +pub mod StepsVestingMock { use openzeppelin_access::ownable::OwnableComponent; + use openzeppelin_finance::vesting::VestingComponent::VestingScheduleTrait; + use openzeppelin_finance::vesting::VestingComponent; use starknet::ContractAddress; use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; @@ -125,3 +125,95 @@ pub(crate) mod StepsVestingMock { } } } + +#[starknet::contract] +pub mod ERC20OptionalTransferPanicMock { + use openzeppelin_token::erc20::interface::IERC20; + use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl}; + use starknet::ContractAddress; + use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; + + component!(path: ERC20Component, storage: erc20, event: ERC20Event); + + #[abi(embed_v0)] + impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; + + impl InternalImpl = ERC20Component::InternalImpl; + + #[storage] + struct Storage { + transfer_should_fail: bool, + #[substorage(v0)] + erc20: ERC20Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + ERC20Event: ERC20Component::Event + } + + #[constructor] + fn constructor( + ref self: ContractState, + name: ByteArray, + symbol: ByteArray, + initial_supply: u256, + recipient: ContractAddress + ) { + self.erc20.initializer(name, symbol); + self.erc20.mint(recipient, initial_supply); + } + + #[abi(embed_v0)] + impl ERC20Impl of IERC20 { + fn total_supply(self: @ContractState) -> u256 { + self.erc20.total_supply() + } + + fn balance_of(self: @ContractState, account: ContractAddress) -> u256 { + self.erc20.balance_of(account) + } + + fn allowance( + self: @ContractState, owner: ContractAddress, spender: ContractAddress + ) -> u256 { + self.erc20.allowance(owner, spender) + } + + fn transfer(ref self: ContractState, recipient: ContractAddress, amount: u256) -> bool { + if self.transfer_should_fail.read() { + false + } else { + self.erc20.transfer(recipient, amount) + } + } + + fn transfer_from( + ref self: ContractState, + sender: ContractAddress, + recipient: ContractAddress, + amount: u256 + ) -> bool { + if self.transfer_should_fail.read() { + false + } else { + self.erc20.transfer_from(sender, recipient, amount) + } + } + + fn approve(ref self: ContractState, spender: ContractAddress, amount: u256) -> bool { + self.erc20.approve(spender, amount) + } + } + + #[generate_trait] + #[abi(per_item)] + impl ExternalImpl of ExternalTrait { + #[external(v0)] + fn set_transfer_should_fail(ref self: ContractState, should_fail: bool) { + self.transfer_should_fail.write(should_fail); + } + } +} diff --git a/packages/token/Scarb.toml b/packages/token/Scarb.toml index 158519166..5a97b179c 100644 --- a/packages/token/Scarb.toml +++ b/packages/token/Scarb.toml @@ -41,3 +41,12 @@ openzeppelin_test_common = { path = "../test_common" } allowed-libfuncs-list.name = "experimental" sierra = true casm = false + +[[test]] +build-external-contracts = [ + "openzeppelin_test_common::mocks::account::DualCaseAccountMock", + "openzeppelin_test_common::mocks::erc721::DualCaseERC721ReceiverMock", + "openzeppelin_test_common::mocks::erc1155::DualCaseERC1155ReceiverMock", + "openzeppelin_test_common::mocks::non_implementing::NonImplementingMock", + "openzeppelin_test_common::mocks::src5::SRC5Mock", +] diff --git a/packages/token/src/common/erc2981/erc2981.cairo b/packages/token/src/common/erc2981/erc2981.cairo index 42ef33c36..2355e50b8 100644 --- a/packages/token/src/common/erc2981/erc2981.cairo +++ b/packages/token/src/common/erc2981/erc2981.cairo @@ -247,7 +247,7 @@ pub impl DefaultConfig of ERC2981Component::ImmutableConfig { #[cfg(test)] mod tests { - use crate::tests::mocks::erc2981_mocks::ERC2981Mock; + use openzeppelin_test_common::mocks::erc2981::ERC2981Mock; use starknet::contract_address_const; use super::ERC2981Component::InternalImpl; use super::ERC2981Component; diff --git a/packages/token/src/lib.cairo b/packages/token/src/lib.cairo index e158d0e7d..43b3de05d 100644 --- a/packages/token/src/lib.cairo +++ b/packages/token/src/lib.cairo @@ -3,4 +3,5 @@ pub mod erc1155; pub mod erc20; pub mod erc721; +#[cfg(test)] pub mod tests; diff --git a/packages/token/src/tests.cairo b/packages/token/src/tests.cairo index d37791a03..fdb72f5ef 100644 --- a/packages/token/src/tests.cairo +++ b/packages/token/src/tests.cairo @@ -1,10 +1,4 @@ -#[cfg(test)] pub mod erc1155; -#[cfg(test)] pub mod erc20; -#[cfg(test)] pub mod erc2981; -#[cfg(test)] pub mod erc721; - -pub(crate) mod mocks; diff --git a/packages/token/src/tests/erc1155/test_erc1155.cairo b/packages/token/src/tests/erc1155/test_erc1155.cairo index ffdc620d3..f1bad9234 100644 --- a/packages/token/src/tests/erc1155/test_erc1155.cairo +++ b/packages/token/src/tests/erc1155/test_erc1155.cairo @@ -3,7 +3,6 @@ use crate::erc1155::ERC1155Component::ERC1155CamelImpl; use crate::erc1155::ERC1155Component::{ERC1155Impl, ERC1155MetadataURIImpl, InternalImpl}; use crate::erc1155::ERC1155Component; use crate::erc1155; -use crate::tests::mocks::erc1155_mocks::DualCaseERC1155Mock; use openzeppelin_introspection::src5::SRC5Component::SRC5Impl; use openzeppelin_test_common::erc1155::{ ERC1155SpyHelpers, get_ids_and_values, get_ids_and_split_values @@ -11,6 +10,7 @@ use openzeppelin_test_common::erc1155::{ use openzeppelin_test_common::erc1155::{ setup_account, deploy_another_account_at, setup_src5, setup_receiver }; +use openzeppelin_test_common::mocks::erc1155::DualCaseERC1155Mock; use openzeppelin_testing::constants::{ EMPTY_DATA, ZERO, OWNER, RECIPIENT, OPERATOR, OTHER, TOKEN_ID, TOKEN_ID_2, TOKEN_VALUE, TOKEN_VALUE_2 diff --git a/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo b/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo index e79debe9b..c3154f4ea 100644 --- a/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo +++ b/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo @@ -2,9 +2,9 @@ use crate::erc1155::ERC1155ReceiverComponent::{ ERC1155ReceiverImpl, ERC1155ReceiverCamelImpl, InternalImpl }; use crate::erc1155::interface::IERC1155_RECEIVER_ID; -use crate::tests::mocks::erc1155_receiver_mocks::DualCaseERC1155ReceiverMock; use openzeppelin_introspection::interface::ISRC5_ID; use openzeppelin_introspection::src5::SRC5Component::SRC5Impl; +use openzeppelin_test_common::mocks::erc1155::DualCaseERC1155ReceiverMock; use openzeppelin_testing::constants::{OWNER, OPERATOR, TOKEN_ID, TOKEN_VALUE, EMPTY_DATA}; fn STATE() -> DualCaseERC1155ReceiverMock::ContractState { diff --git a/packages/token/src/tests/erc20/test_erc20.cairo b/packages/token/src/tests/erc20/test_erc20.cairo index f7b6f32ab..1d8c4451a 100644 --- a/packages/token/src/tests/erc20/test_erc20.cairo +++ b/packages/token/src/tests/erc20/test_erc20.cairo @@ -2,8 +2,8 @@ use core::num::traits::Bounded; use crate::erc20::ERC20Component::{ERC20CamelOnlyImpl, ERC20Impl}; use crate::erc20::ERC20Component::{ERC20MetadataImpl, InternalImpl}; use crate::erc20::ERC20Component; -use crate::tests::mocks::erc20_mocks::DualCaseERC20Mock; use openzeppelin_test_common::erc20::ERC20SpyHelpers; +use openzeppelin_test_common::mocks::erc20::DualCaseERC20Mock; use openzeppelin_testing::constants::{ ZERO, OWNER, SPENDER, RECIPIENT, NAME, SYMBOL, DECIMALS, SUPPLY, VALUE }; diff --git a/packages/token/src/tests/erc20/test_erc20_votes.cairo b/packages/token/src/tests/erc20/test_erc20_votes.cairo index dbff4693e..6a2be7240 100644 --- a/packages/token/src/tests/erc20/test_erc20_votes.cairo +++ b/packages/token/src/tests/erc20/test_erc20_votes.cairo @@ -5,8 +5,8 @@ use crate::erc20::extensions::ERC20VotesComponent::{DelegateChanged, DelegateVot use crate::erc20::extensions::ERC20VotesComponent::{ERC20VotesImpl, InternalImpl}; use crate::erc20::extensions::ERC20VotesComponent; use crate::erc20::extensions::erc20_votes::Delegation; -use crate::tests::mocks::erc20_votes_mocks::DualCaseERC20VotesMock::SNIP12MetadataImpl; -use crate::tests::mocks::erc20_votes_mocks::DualCaseERC20VotesMock; +use openzeppelin_test_common::mocks::erc20::DualCaseERC20VotesMock::SNIP12MetadataImpl; +use openzeppelin_test_common::mocks::erc20::DualCaseERC20VotesMock; use openzeppelin_testing as utils; use openzeppelin_testing::constants::{SUPPLY, ZERO, OWNER, RECIPIENT}; use openzeppelin_testing::events::EventSpyExt; diff --git a/packages/token/src/tests/erc2981/test_erc2981.cairo b/packages/token/src/tests/erc2981/test_erc2981.cairo index 3d2dc623f..1b0dbb75c 100644 --- a/packages/token/src/tests/erc2981/test_erc2981.cairo +++ b/packages/token/src/tests/erc2981/test_erc2981.cairo @@ -1,8 +1,8 @@ use crate::common::erc2981::ERC2981Component::{ERC2981Impl, InternalImpl}; use crate::common::erc2981::interface::IERC2981_ID; use crate::common::erc2981::{ERC2981Component, DefaultConfig}; -use crate::tests::mocks::erc2981_mocks::ERC2981Mock; use openzeppelin_introspection::src5::SRC5Component::SRC5Impl; +use openzeppelin_test_common::mocks::erc2981::ERC2981Mock; use openzeppelin_testing::constants::{ZERO, RECIPIENT}; use starknet::{ContractAddress, contract_address_const}; diff --git a/packages/token/src/tests/erc721/test_erc721.cairo b/packages/token/src/tests/erc721/test_erc721.cairo index d28f9d189..03e9826f2 100644 --- a/packages/token/src/tests/erc721/test_erc721.cairo +++ b/packages/token/src/tests/erc721/test_erc721.cairo @@ -3,9 +3,9 @@ use crate::erc721::ERC721Component::{ERC721Impl, ERC721CamelOnlyImpl}; use crate::erc721::ERC721Component::{ERC721MetadataImpl, InternalImpl}; use crate::erc721::ERC721Component; use crate::erc721; -use crate::tests::mocks::erc721_mocks::DualCaseERC721Mock; use openzeppelin_introspection::src5::SRC5Component::SRC5Impl; use openzeppelin_test_common::erc721::ERC721SpyHelpers; +use openzeppelin_test_common::mocks::erc721::DualCaseERC721Mock; use openzeppelin_testing as utils; use openzeppelin_testing::constants::{ DATA, ZERO, OWNER, CALLER, RECIPIENT, SPENDER, OPERATOR, OTHER, NAME, SYMBOL, TOKEN_ID, diff --git a/packages/token/src/tests/erc721/test_erc721_enumerable.cairo b/packages/token/src/tests/erc721/test_erc721_enumerable.cairo index a57589c6b..1c60b5695 100644 --- a/packages/token/src/tests/erc721/test_erc721_enumerable.cairo +++ b/packages/token/src/tests/erc721/test_erc721_enumerable.cairo @@ -4,9 +4,9 @@ use crate::erc721::extensions::erc721_enumerable::ERC721EnumerableComponent::{ }; use crate::erc721::extensions::erc721_enumerable::ERC721EnumerableComponent; use crate::erc721::extensions::erc721_enumerable::interface; -use crate::tests::mocks::erc721_enumerable_mocks::ERC721EnumerableMock; use openzeppelin_introspection::interface::ISRC5_ID; use openzeppelin_introspection::src5::SRC5Component::SRC5Impl; +use openzeppelin_test_common::mocks::erc721::ERC721EnumerableMock; use openzeppelin_testing::constants::{OWNER, RECIPIENT, OTHER, ZERO}; use starknet::ContractAddress; use starknet::storage::StorageMapReadAccess; diff --git a/packages/token/src/tests/erc721/test_erc721_receiver.cairo b/packages/token/src/tests/erc721/test_erc721_receiver.cairo index aa4fe8276..c24285744 100644 --- a/packages/token/src/tests/erc721/test_erc721_receiver.cairo +++ b/packages/token/src/tests/erc721/test_erc721_receiver.cairo @@ -2,9 +2,9 @@ use crate::erc721::ERC721ReceiverComponent::{ ERC721ReceiverImpl, ERC721ReceiverCamelImpl, InternalImpl }; use crate::erc721::interface::IERC721_RECEIVER_ID; -use crate::tests::mocks::erc721_receiver_mocks::DualCaseERC721ReceiverMock; use openzeppelin_introspection::interface::ISRC5_ID; use openzeppelin_introspection::src5::SRC5Component::SRC5Impl; +use openzeppelin_test_common::mocks::erc721::DualCaseERC721ReceiverMock; use openzeppelin_testing::constants::{OWNER, OPERATOR, TOKEN_ID}; fn STATE() -> DualCaseERC721ReceiverMock::ContractState { diff --git a/packages/token/src/tests/mocks.cairo b/packages/token/src/tests/mocks.cairo deleted file mode 100644 index 35ad0586e..000000000 --- a/packages/token/src/tests/mocks.cairo +++ /dev/null @@ -1,10 +0,0 @@ -pub(crate) mod account_mocks; -pub(crate) mod erc1155_mocks; -pub(crate) mod erc1155_receiver_mocks; -pub(crate) mod erc20_mocks; -pub(crate) mod erc20_votes_mocks; -pub(crate) mod erc2981_mocks; -pub(crate) mod erc721_enumerable_mocks; -pub(crate) mod erc721_mocks; -pub(crate) mod erc721_receiver_mocks; -pub(crate) mod src5_mocks; diff --git a/packages/token/src/tests/mocks/account_mocks.cairo b/packages/token/src/tests/mocks/account_mocks.cairo deleted file mode 100644 index e09f53328..000000000 --- a/packages/token/src/tests/mocks/account_mocks.cairo +++ /dev/null @@ -1,45 +0,0 @@ -#[starknet::contract(account)] -pub(crate) mod DualCaseAccountMock { - use openzeppelin_account::AccountComponent; - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: AccountComponent, storage: account, event: AccountEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // Account - #[abi(embed_v0)] - impl SRC6Impl = AccountComponent::SRC6Impl; - #[abi(embed_v0)] - impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl; - #[abi(embed_v0)] - impl DeclarerImpl = AccountComponent::DeclarerImpl; - #[abi(embed_v0)] - impl DeployableImpl = AccountComponent::DeployableImpl; - impl AccountInternalImpl = AccountComponent::InternalImpl; - - // SCR5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub account: AccountComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - AccountEvent: AccountComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState, public_key: felt252) { - self.account.initializer(public_key); - } -} diff --git a/packages/token/src/tests/mocks/erc1155_mocks.cairo b/packages/token/src/tests/mocks/erc1155_mocks.cairo deleted file mode 100644 index a7442f8c0..000000000 --- a/packages/token/src/tests/mocks/erc1155_mocks.cairo +++ /dev/null @@ -1,52 +0,0 @@ -#[starknet::contract] -pub(crate) mod DualCaseERC1155Mock { - use crate::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl}; - use openzeppelin_introspection::src5::SRC5Component; - use starknet::ContractAddress; - - component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // ERC1155 - #[abi(embed_v0)] - impl ERC1155Impl = ERC1155Component::ERC1155Impl; - #[abi(embed_v0)] - impl ERC1155MetadataURIImpl = - ERC1155Component::ERC1155MetadataURIImpl; - #[abi(embed_v0)] - impl ERC721Camel = ERC1155Component::ERC1155CamelImpl; - impl ERC1155InternalImpl = ERC1155Component::InternalImpl; - - // SRC5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc1155: ERC1155Component::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC1155Event: ERC1155Component::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - base_uri: ByteArray, - recipient: ContractAddress, - token_id: u256, - value: u256 - ) { - self.erc1155.initializer(base_uri); - self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span()); - } -} diff --git a/packages/token/src/tests/mocks/erc1155_receiver_mocks.cairo b/packages/token/src/tests/mocks/erc1155_receiver_mocks.cairo deleted file mode 100644 index 06443f5f5..000000000 --- a/packages/token/src/tests/mocks/erc1155_receiver_mocks.cairo +++ /dev/null @@ -1,40 +0,0 @@ -const SUCCESS: felt252 = 'SUCCESS'; - -#[starknet::contract] -pub(crate) mod DualCaseERC1155ReceiverMock { - use crate::erc1155::ERC1155ReceiverComponent; - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: SRC5Component, storage: src5, event: SRC5Event); - component!( - path: ERC1155ReceiverComponent, storage: erc1155_receiver, event: ERC1155ReceiverEvent - ); - - // ERC1155Receiver Mixin - #[abi(embed_v0)] - impl ERC1155ReceiverMixinImpl = - ERC1155ReceiverComponent::ERC1155ReceiverMixinImpl; - impl ERC1155ReceiverInternalImpl = ERC1155ReceiverComponent::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc1155_receiver: ERC1155ReceiverComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC1155ReceiverEvent: ERC1155ReceiverComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.erc1155_receiver.initializer(); - } -} diff --git a/packages/token/src/tests/mocks/erc20_mocks.cairo b/packages/token/src/tests/mocks/erc20_mocks.cairo deleted file mode 100644 index d6b0a799b..000000000 --- a/packages/token/src/tests/mocks/erc20_mocks.cairo +++ /dev/null @@ -1,40 +0,0 @@ -#[starknet::contract] -pub(crate) mod DualCaseERC20Mock { - use crate::erc20::{ERC20Component, ERC20HooksEmptyImpl}; - use starknet::ContractAddress; - - component!(path: ERC20Component, storage: erc20, event: ERC20Event); - - #[abi(embed_v0)] - impl ERC20Impl = ERC20Component::ERC20Impl; - #[abi(embed_v0)] - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; - #[abi(embed_v0)] - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl; - impl InternalImpl = ERC20Component::InternalImpl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc20: ERC20Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC20Event: ERC20Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - name: ByteArray, - symbol: ByteArray, - initial_supply: u256, - recipient: ContractAddress - ) { - self.erc20.initializer(name, symbol); - self.erc20.mint(recipient, initial_supply); - } -} diff --git a/packages/token/src/tests/mocks/erc721_enumerable_mocks.cairo b/packages/token/src/tests/mocks/erc721_enumerable_mocks.cairo deleted file mode 100644 index 096dea067..000000000 --- a/packages/token/src/tests/mocks/erc721_enumerable_mocks.cairo +++ /dev/null @@ -1,75 +0,0 @@ -#[starknet::contract] -pub(crate) mod ERC721EnumerableMock { - use crate::erc721::ERC721Component; - use crate::erc721::extensions::ERC721EnumerableComponent; - use openzeppelin_introspection::src5::SRC5Component; - use starknet::ContractAddress; - - component!(path: ERC721Component, storage: erc721, event: ERC721Event); - component!( - path: ERC721EnumerableComponent, storage: erc721_enumerable, event: ERC721EnumerableEvent - ); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // ERC721 - #[abi(embed_v0)] - impl ERC721MixinImpl = ERC721Component::ERC721Impl; - impl ERC721InternalImpl = ERC721Component::InternalImpl; - - // ERC721Enumerable - #[abi(embed_v0)] - impl ERC721EnumerableImpl = - ERC721EnumerableComponent::ERC721EnumerableImpl; - impl ERC721EnumerableInternalImpl = ERC721EnumerableComponent::InternalImpl; - - // SRC5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc721: ERC721Component::Storage, - #[substorage(v0)] - pub erc721_enumerable: ERC721EnumerableComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC721Event: ERC721Component::Event, - #[flat] - ERC721EnumerableEvent: ERC721EnumerableComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait { - fn before_update( - ref self: ERC721Component::ComponentState, - to: ContractAddress, - token_id: u256, - auth: ContractAddress - ) { - let mut contract_state = ERC721Component::HasComponent::get_contract_mut(ref self); - contract_state.erc721_enumerable.before_update(to, token_id); - } - } - - #[constructor] - fn constructor( - ref self: ContractState, - name: ByteArray, - symbol: ByteArray, - base_uri: ByteArray, - recipient: ContractAddress, - token_id: u256 - ) { - self.erc721.initializer(name, symbol, base_uri); - self.erc721_enumerable.initializer(); - self.erc721.mint(recipient, token_id); - } -} diff --git a/packages/token/src/tests/mocks/erc721_mocks.cairo b/packages/token/src/tests/mocks/erc721_mocks.cairo deleted file mode 100644 index 432c72da9..000000000 --- a/packages/token/src/tests/mocks/erc721_mocks.cairo +++ /dev/null @@ -1,55 +0,0 @@ -#[starknet::contract] -pub(crate) mod DualCaseERC721Mock { - use crate::erc721::{ERC721Component, ERC721HooksEmptyImpl}; - use openzeppelin_introspection::src5::SRC5Component; - use starknet::ContractAddress; - - component!(path: ERC721Component, storage: erc721, event: ERC721Event); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // ERC721 - #[abi(embed_v0)] - impl ERC721Impl = ERC721Component::ERC721Impl; - #[abi(embed_v0)] - impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl; - #[abi(embed_v0)] - impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl; - #[abi(embed_v0)] - impl ERC721MetadataCamelOnly = - ERC721Component::ERC721MetadataCamelOnlyImpl; - impl ERC721InternalImpl = ERC721Component::InternalImpl; - - // SRC5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc721: ERC721Component::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC721Event: ERC721Component::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor( - ref self: ContractState, - name: ByteArray, - symbol: ByteArray, - base_uri: ByteArray, - recipient: ContractAddress, - token_id: u256 - ) { - self.erc721.initializer(name, symbol, base_uri); - self.erc721.mint(recipient, token_id); - } -} diff --git a/packages/token/src/tests/mocks/erc721_receiver_mocks.cairo b/packages/token/src/tests/mocks/erc721_receiver_mocks.cairo deleted file mode 100644 index 6df306fbd..000000000 --- a/packages/token/src/tests/mocks/erc721_receiver_mocks.cairo +++ /dev/null @@ -1,71 +0,0 @@ -const SUCCESS: felt252 = 'SUCCESS'; - -#[starknet::contract] -pub(crate) mod DualCaseERC721ReceiverMock { - use crate::erc721::ERC721ReceiverComponent; - use openzeppelin_introspection::src5::SRC5Component; - use starknet::ContractAddress; - - component!(path: ERC721ReceiverComponent, storage: erc721_receiver, event: ERC721ReceiverEvent); - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - // ERC721Receiver - impl ERC721ReceiverImpl = ERC721ReceiverComponent::ERC721ReceiverImpl; - impl ERC721ReceiverInternalImpl = ERC721ReceiverComponent::InternalImpl; - - // SRC5 - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub erc721_receiver: ERC721ReceiverComponent::Storage, - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - ERC721ReceiverEvent: ERC721ReceiverComponent::Event, - #[flat] - SRC5Event: SRC5Component::Event - } - - #[constructor] - fn constructor(ref self: ContractState) { - self.erc721_receiver.initializer(); - } - - #[abi(per_item)] - #[generate_trait] - impl ExternalImpl of ExternalTrait { - #[external(v0)] - fn on_erc721_received( - self: @ContractState, - operator: ContractAddress, - from: ContractAddress, - token_id: u256, - data: Span - ) -> felt252 { - if *data.at(0) == super::SUCCESS { - self.erc721_receiver.on_erc721_received(operator, from, token_id, data) - } else { - 0 - } - } - - #[external(v0)] - fn onERC721Received( - self: @ContractState, - operator: ContractAddress, - from: ContractAddress, - tokenId: u256, - data: Span - ) -> felt252 { - Self::on_erc721_received(self, operator, from, tokenId, data) - } - } -} diff --git a/packages/token/src/tests/mocks/src5_mocks.cairo b/packages/token/src/tests/mocks/src5_mocks.cairo deleted file mode 100644 index df481ced5..000000000 --- a/packages/token/src/tests/mocks/src5_mocks.cairo +++ /dev/null @@ -1,22 +0,0 @@ -#[starknet::contract] -pub(crate) mod SRC5Mock { - use openzeppelin_introspection::src5::SRC5Component; - - component!(path: SRC5Component, storage: src5, event: SRC5Event); - - #[abi(embed_v0)] - impl SRC5Impl = SRC5Component::SRC5Impl; - - #[storage] - pub struct Storage { - #[substorage(v0)] - pub src5: SRC5Component::Storage - } - - #[event] - #[derive(Drop, starknet::Event)] - enum Event { - #[flat] - SRC5Event: SRC5Component::Event - } -} diff --git a/packages/upgrades/Scarb.toml b/packages/upgrades/Scarb.toml index a059c95c0..9553796d7 100644 --- a/packages/upgrades/Scarb.toml +++ b/packages/upgrades/Scarb.toml @@ -36,3 +36,9 @@ openzeppelin_test_common = { path = "../test_common" } allowed-libfuncs-list.name = "experimental" sierra = true casm = false + +[[test]] +build-external-contracts = [ + "openzeppelin_test_common::mocks::upgrades::UpgradesV1", + "openzeppelin_test_common::mocks::upgrades::UpgradesV2", +] diff --git a/packages/upgrades/src/lib.cairo b/packages/upgrades/src/lib.cairo index 1f6920e8c..bd960aff0 100644 --- a/packages/upgrades/src/lib.cairo +++ b/packages/upgrades/src/lib.cairo @@ -1,5 +1,6 @@ pub mod interface; +#[cfg(test)] pub mod tests; pub mod upgradeable; diff --git a/packages/upgrades/src/tests.cairo b/packages/upgrades/src/tests.cairo index 617be2f0e..fe66e01e3 100644 --- a/packages/upgrades/src/tests.cairo +++ b/packages/upgrades/src/tests.cairo @@ -1,4 +1 @@ -pub(crate) mod mocks; - -#[cfg(test)] mod test_upgradeable; diff --git a/packages/upgrades/src/tests/mocks.cairo b/packages/upgrades/src/tests/mocks.cairo deleted file mode 100644 index a287b9e8f..000000000 --- a/packages/upgrades/src/tests/mocks.cairo +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod upgrades_mocks; diff --git a/packages/upgrades/src/tests/test_upgradeable.cairo b/packages/upgrades/src/tests/test_upgradeable.cairo index 1cb956261..19a87be4f 100644 --- a/packages/upgrades/src/tests/test_upgradeable.cairo +++ b/packages/upgrades/src/tests/test_upgradeable.cairo @@ -1,5 +1,5 @@ -use crate::tests::mocks::upgrades_mocks::{IUpgradesV1Dispatcher, IUpgradesV1DispatcherTrait}; -use crate::tests::mocks::upgrades_mocks::{IUpgradesV2Dispatcher, IUpgradesV2DispatcherTrait}; +use openzeppelin_test_common::mocks::upgrades::{IUpgradesV1Dispatcher, IUpgradesV1DispatcherTrait}; +use openzeppelin_test_common::mocks::upgrades::{IUpgradesV2Dispatcher, IUpgradesV2DispatcherTrait}; use openzeppelin_test_common::upgrades::UpgradeableSpyHelpers; use openzeppelin_testing::constants::{CLASS_HASH_ZERO, FELT_VALUE as VALUE}; use openzeppelin_testing::{declare_class, deploy}; diff --git a/packages/utils/Scarb.toml b/packages/utils/Scarb.toml index ac9b18f1f..0454fc82d 100644 --- a/packages/utils/Scarb.toml +++ b/packages/utils/Scarb.toml @@ -29,6 +29,7 @@ starknet.workspace = true assert_macros.workspace = true snforge_std.workspace = true openzeppelin_testing = { path = "../testing" } +openzeppelin_test_common = { path = "../test_common" } [lib] diff --git a/packages/utils/src/tests.cairo b/packages/utils/src/tests.cairo index 37cf414d3..fedcc380c 100644 --- a/packages/utils/src/tests.cairo +++ b/packages/utils/src/tests.cairo @@ -1,4 +1,2 @@ -pub(crate) mod mocks; - mod test_nonces; mod test_snip12; diff --git a/packages/utils/src/tests/test_nonces.cairo b/packages/utils/src/tests/test_nonces.cairo index 694908aa9..fdc783035 100644 --- a/packages/utils/src/tests/test_nonces.cairo +++ b/packages/utils/src/tests/test_nonces.cairo @@ -2,7 +2,7 @@ use core::num::traits::Zero; use crate::cryptography::interface::INonces; use crate::cryptography::nonces::NoncesComponent::InternalTrait; use crate::cryptography::nonces::NoncesComponent; -use crate::tests::mocks::nonces_mocks::NoncesMock; +use openzeppelin_test_common::mocks::nonces::NoncesMock; use openzeppelin_testing::constants::OWNER; type ComponentState = NoncesComponent::ComponentState;