Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate Starknet Account tests #1050

Merged
merged 16 commits into from
Jul 26, 2024
4 changes: 2 additions & 2 deletions src/tests.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// #[cfg(test)]
// mod access;
// #[cfg(test)]
// mod account;
#[cfg(test)]
mod account;
// #[cfg(test)]
// mod cryptography;
// #[cfg(test)]
Expand Down
5 changes: 2 additions & 3 deletions src/tests/account/ethereum.cairo
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// mod test_dual_eth_account;
// mod test_eth_account;
pub(crate) mod common;

mod test_dual_eth_account;
mod test_eth_account;
62 changes: 32 additions & 30 deletions src/tests/account/ethereum/common.cairo
immrsd marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@ use openzeppelin::account::interface::EthPublicKey;
use openzeppelin::account::utils::signature::EthSignature;
use openzeppelin::tests::mocks::erc20_mocks::DualCaseERC20Mock;
use openzeppelin::tests::utils::constants::{NAME, SYMBOL};
use openzeppelin::tests::utils::events::EventSpyExt;
use openzeppelin::tests::utils;
use openzeppelin::token::erc20::interface::{IERC20DispatcherTrait, IERC20Dispatcher};
use openzeppelin::utils::serde::SerializedAppend;
use snforge_std::EventSpy;
use snforge_std::cheatcodes::events::EventSpyAssertionsTrait;
use starknet::ContractAddress;
use starknet::SyscallResultTrait;
use starknet::secp256_trait::Secp256Trait;
Expand All @@ -18,7 +21,7 @@ use starknet::secp256k1::Secp256k1Point;
pub(crate) struct SignedTransactionData {
pub(crate) private_key: u256,
pub(crate) public_key: EthPublicKey,
pub(crate) transaction_hash: felt252,
pub(crate) tx_hash: felt252,
pub(crate) signature: EthSignature
}

Expand All @@ -27,7 +30,7 @@ pub(crate) fn SIGNED_TX_DATA() -> SignedTransactionData {
SignedTransactionData {
private_key: 0x45397ee6ca34cb49060f1c303c6cb7ee2d6123e617601ef3e31ccf7bf5bef1f9,
public_key: NEW_ETH_PUBKEY(),
transaction_hash: 0x008f882c63d0396d216d57529fe29ad5e70b6cd51b47bd2458b0a4ccb2ba0957,
tx_hash: 0x008f882c63d0396d216d57529fe29ad5e70b6cd51b47bd2458b0a4ccb2ba0957,
signature: EthSignature {
r: 0x82bb3efc0554ec181405468f273b0dbf935cca47182b22da78967d0770f7dcc3,
s: 0x6719fef30c11c74add873e4da0e1234deb69eae6a6bd4daa44b816dc199f3e86,
Expand All @@ -54,7 +57,7 @@ pub(crate) fn deploy_erc20(recipient: ContractAddress, initial_supply: u256) ->
calldata.append_serde(initial_supply);
calldata.append_serde(recipient);

let address = utils::deploy(DualCaseERC20Mock::TEST_CLASS_HASH, calldata);
let address = utils::declare_and_deploy("DualCaseERC20Mock", calldata);
IERC20Dispatcher { contract_address: address }
}

Expand All @@ -70,35 +73,34 @@ pub(crate) fn get_points() -> (Secp256k1Point, Secp256k1Point) {
(point_1, point_2)
}

pub(crate) fn assert_event_owner_added(contract: ContractAddress, public_key: EthPublicKey) {
let event = utils::pop_log::<EthAccountComponent::Event>(contract).unwrap();
let new_owner_guid = get_guid_from_public_key(public_key);
let expected = EthAccountComponent::Event::OwnerAdded(OwnerAdded { new_owner_guid });
assert!(event == expected);

// Check indexed keys
let mut indexed_keys = array![];
indexed_keys.append_serde(selector!("OwnerAdded"));
indexed_keys.append_serde(new_owner_guid);
utils::assert_indexed_keys(event, indexed_keys.span());
}

pub(crate) fn assert_only_event_owner_added(contract: ContractAddress, public_key: EthPublicKey) {
assert_event_owner_added(contract, public_key);
utils::assert_no_events_left(contract);
}
#[generate_trait]
pub(crate) impl AccountSpyHelpersImpl of AccountSpyHelpers {
fn assert_event_owner_added(
ref self: EventSpy, contract: ContractAddress, public_key: EthPublicKey
) {
let new_owner_guid = get_guid_from_public_key(public_key);
let expected = EthAccountComponent::Event::OwnerAdded(OwnerAdded { new_owner_guid });
self.assert_emitted_single(contract, expected);
// TODO: Add check for indexed keys
immrsd marked this conversation as resolved.
Show resolved Hide resolved
}

pub(crate) fn assert_event_owner_removed(contract: ContractAddress, public_key: EthPublicKey) {
let event = utils::pop_log::<EthAccountComponent::Event>(contract).unwrap();
let removed_owner_guid = get_guid_from_public_key(public_key);
let expected = EthAccountComponent::Event::OwnerRemoved(OwnerRemoved { removed_owner_guid });
assert!(event == expected);
fn assert_only_event_owner_added(
ref self: EventSpy, contract: ContractAddress, public_key: EthPublicKey
) {
self.assert_event_owner_added(contract, public_key);
self.assert_no_events_left_from(contract);
}

// Check indexed keys
let mut indexed_keys = array![];
indexed_keys.append_serde(selector!("OwnerRemoved"));
indexed_keys.append_serde(removed_owner_guid);
utils::assert_indexed_keys(event, indexed_keys.span());
fn assert_event_owner_removed(
ref self: EventSpy, contract: ContractAddress, public_key: EthPublicKey
) {
let removed_owner_guid = get_guid_from_public_key(public_key);
let expected = EthAccountComponent::Event::OwnerRemoved(
OwnerRemoved { removed_owner_guid }
);
self.assert_emitted_single(contract, expected);
// TODO: Add check for indexed keys
}
}

fn get_guid_from_public_key(public_key: EthPublicKey) -> felt252 {
Expand Down
80 changes: 45 additions & 35 deletions src/tests/account/starknet/common.cairo
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
use core::hash::{HashStateTrait, HashStateExTrait};
use core::poseidon::PoseidonTrait;
use openzeppelin::account::AccountComponent::{OwnerAdded, OwnerRemoved};
use openzeppelin::account::AccountComponent;
use openzeppelin::tests::mocks::erc20_mocks::DualCaseERC20Mock;
use openzeppelin::tests::utils::constants::{NAME, SYMBOL, NEW_PUBKEY};
use openzeppelin::tests::utils::constants::{NAME, SYMBOL};
use openzeppelin::tests::utils::events::EventSpyExt;
use openzeppelin::tests::utils::signing::stark::StarkKeyPair;
use openzeppelin::tests::utils;
use openzeppelin::token::erc20::interface::{IERC20DispatcherTrait, IERC20Dispatcher};
use openzeppelin::utils::serde::SerializedAppend;
use snforge_std::EventSpy;
use snforge_std::signature::stark_curve::{StarkCurveSignerImpl, StarkCurveKeyPairImpl};
use starknet::ContractAddress;

#[derive(Drop)]
pub(crate) struct SignedTransactionData {
pub(crate) private_key: felt252,
pub(crate) public_key: felt252,
pub(crate) transaction_hash: felt252,
pub(crate) tx_hash: felt252,
pub(crate) r: felt252,
pub(crate) s: felt252
pub(crate) s: felt252,
immrsd marked this conversation as resolved.
Show resolved Hide resolved
}

pub(crate) fn SIGNED_TX_DATA() -> SignedTransactionData {
pub(crate) fn SIGNED_TX_DATA(key_pair: StarkKeyPair) -> SignedTransactionData {
let tx_hash = 'TRANSACTION_HASH';
let (r, s) = key_pair.sign(tx_hash).unwrap();
SignedTransactionData {
private_key: 1234,
public_key: NEW_PUBKEY,
transaction_hash: 0x601d3d2e265c10ff645e1554c435e72ce6721f0ba5fc96f0c650bfc6231191a,
r: 0x6bc22689efcaeacb9459577138aff9f0af5b77ee7894cdc8efabaf760f6cf6e,
s: 0x295989881583b9325436851934334faa9d639a2094cd1e2f8691c8a71cd4cdf
private_key: key_pair.secret_key, public_key: key_pair.public_key, tx_hash, r, s
immrsd marked this conversation as resolved.
Show resolved Hide resolved
}
}

Expand All @@ -34,36 +37,43 @@ pub(crate) fn deploy_erc20(recipient: ContractAddress, initial_supply: u256) ->
calldata.append_serde(initial_supply);
calldata.append_serde(recipient);

let address = utils::deploy(DualCaseERC20Mock::TEST_CLASS_HASH, calldata);
let address = utils::declare_and_deploy("DualCaseERC20Mock", calldata);
IERC20Dispatcher { contract_address: address }
}


pub(crate) fn assert_event_owner_removed(contract: ContractAddress, removed_owner_guid: felt252) {
let event = utils::pop_log::<AccountComponent::Event>(contract).unwrap();
let expected = AccountComponent::Event::OwnerRemoved(OwnerRemoved { removed_owner_guid });
assert!(event == expected);

// Check indexed keys
let mut indexed_keys = array![];
indexed_keys.append_serde(selector!("OwnerRemoved"));
indexed_keys.append_serde(removed_owner_guid);
utils::assert_indexed_keys(event, indexed_keys.span());
pub(crate) fn get_accept_ownership_signature(
account_address: ContractAddress, current_public_key: felt252, new_key_pair: StarkKeyPair
) -> Span<felt252> {
let msg_hash = PoseidonTrait::new()
.update_with('StarkNet Message')
.update_with('accept_ownership')
.update_with(account_address)
.update_with(current_public_key)
.finalize();
let (sig_r, sig_s) = new_key_pair.sign(msg_hash).unwrap();
array![sig_r, sig_s].span()
}

pub(crate) fn assert_event_owner_added(contract: ContractAddress, new_owner_guid: felt252) {
let event = utils::pop_log::<AccountComponent::Event>(contract).unwrap();
let expected = AccountComponent::Event::OwnerAdded(OwnerAdded { new_owner_guid });
assert!(event == expected);
#[generate_trait]
pub(crate) impl AccountSpyHelpersImpl of AccountSpyHelpers {
fn assert_event_owner_removed(
ref self: EventSpy, contract: ContractAddress, removed_owner_guid: felt252
) {
let expected = AccountComponent::Event::OwnerRemoved(OwnerRemoved { removed_owner_guid });
self.assert_emitted_single(contract, expected);
}

// Check indexed keys
let mut indexed_keys = array![];
indexed_keys.append_serde(selector!("OwnerAdded"));
indexed_keys.append_serde(new_owner_guid);
utils::assert_indexed_keys(event, indexed_keys.span());
}
fn assert_event_owner_added(
ref self: EventSpy, contract: ContractAddress, new_owner_guid: felt252
) {
let expected = AccountComponent::Event::OwnerAdded(OwnerAdded { new_owner_guid });
self.assert_emitted_single(contract, expected);
}

pub(crate) fn assert_only_event_owner_added(contract: ContractAddress, new_owner_guid: felt252) {
assert_event_owner_added(contract, new_owner_guid);
utils::assert_no_events_left(contract);
fn assert_only_event_owner_added(
ref self: EventSpy, contract: ContractAddress, new_owner_guid: felt252
) {
self.assert_event_owner_added(contract, new_owner_guid);
self.assert_no_events_left_from(contract);
}
}
Loading
Loading