Skip to content

Commit

Permalink
test: integration tests for dynamic supply
Browse files Browse the repository at this point in the history
  • Loading branch information
Farhad-Shabani committed Mar 3, 2025
1 parent 46c4c61 commit 5f6da96
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -735,7 +735,7 @@ pub mod TokenTransferComponent {

token.transfer_from(account, get_contract_address(), amount);

token.burn(get_contract_address(), amount);
token.burn(amount);
}

fn refund_execute(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ pub impl ERC20ContractImpl of ERC20ContractTrait {
call_contract_syscall(*self.address, selector!("mint"), calldata.span()).unwrap_syscall();
}

fn burn(self: @ERC20Contract, account: ContractAddress, amount: u256) {
fn burn(self: @ERC20Contract, amount: u256) {
let mut calldata = array![];
amount.serialize(ref calldata);
call_contract_syscall(*self.address, selector!("burn"), calldata.span()).unwrap_syscall();
Expand Down
1 change: 1 addition & 0 deletions cairo-contracts/packages/contracts/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ mod tests {
pub(crate) mod channel;
pub(crate) mod client;
pub(crate) mod connection;
pub(crate) mod erc20;
pub(crate) mod transfer;
}
73 changes: 73 additions & 0 deletions cairo-contracts/packages/contracts/src/tests/erc20.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
use snforge_std::{EventSpy, spy_events, start_cheat_caller_address};
use starknet_ibc_apps::transfer::{ERC20Contract, ERC20ContractTrait};
use starknet_ibc_testkit::dummies::{AMOUNT, OWNER, SN_USER, ZERO};
use starknet_ibc_testkit::event_spy::{ERC20EventSpyExt, ERC20EventSpyExtImpl};
use starknet_ibc_testkit::handles::ERC20Handle;
use starknet_ibc_testkit::setup::SetupImpl;

fn setup() -> (ERC20Contract, EventSpy) {
let setup = SetupImpl::default();
let erc20 = SetupImpl::deploy_erc20(@setup, OWNER());
let spy = spy_events();
(erc20, spy)
}

#[test]
fn test_deploy_erc20_ok() {
setup();
}

#[test]
fn test_erc20_mint_ok() {
let (mut erc20, mut spy) = setup();
start_cheat_caller_address(erc20.address, OWNER());
erc20.mint(SN_USER(), AMOUNT);
spy.assert_transfer_event(erc20.address, ZERO(), SN_USER(), AMOUNT);
erc20.assert_balance(OWNER(), 0);
erc20.assert_balance(SN_USER(), AMOUNT);
erc20.assert_total_supply(AMOUNT);
}

#[test]
fn test_erc20_burn_ok() {
let (mut erc20, mut spy) = setup();
start_cheat_caller_address(erc20.address, OWNER());
erc20.mint(SN_USER(), AMOUNT);
erc20.approve(SN_USER(), OWNER(), AMOUNT);
erc20.transfer_from(SN_USER(), OWNER(), AMOUNT);
spy.assert_transfer_event(erc20.address, SN_USER(), OWNER(), AMOUNT);
erc20.burn(AMOUNT);
spy.assert_transfer_event(erc20.address, OWNER(), ZERO(), AMOUNT);
erc20.assert_balance(OWNER(), 0);
erc20.assert_balance(SN_USER(), 0);
erc20.assert_total_supply(0);
}

#[test]
#[should_panic(expected: 'Caller is not the owner')]
fn test_erc20_unauthorized_mint() {
let (mut erc20, _) = setup();
erc20.mint(SN_USER(), AMOUNT);
}

#[test]
#[should_panic(expected: 'Caller is not the owner')]
fn test_erc20_unauthorized_burn() {
let (mut erc20, _) = setup();
start_cheat_caller_address(erc20.address, OWNER());
erc20.mint(SN_USER(), AMOUNT);
erc20.approve(SN_USER(), OWNER(), AMOUNT);
erc20.transfer_from(SN_USER(), OWNER(), AMOUNT);
start_cheat_caller_address(erc20.address, SN_USER());
erc20.burn(AMOUNT);
}

#[test]
#[should_panic(expected: 'ERC20: insufficient allowance')]
fn test_erc20_transfer_without_user_approval() {
let (mut erc20, _) = setup();
start_cheat_caller_address(erc20.address, OWNER());
erc20.mint(SN_USER(), AMOUNT);
erc20.transfer_from(SN_USER(), OWNER(), AMOUNT);
}

4 changes: 4 additions & 0 deletions cairo-contracts/packages/testkit/src/dummies/transfer.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ pub fn CLASS_HASH() -> ClassHash {
class_hash_const::<'ERC20Mintable'>()
}

pub fn ZERO() -> ContractAddress {
contract_address_const::<0>()
}

pub fn ERC20() -> ERC20Contract {
contract_address_const::<0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7>()
.into()
Expand Down
2 changes: 1 addition & 1 deletion cairo-contracts/packages/testkit/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ pub mod dummies {
pub use transfer::{
AMOUNT, CLASS_HASH, COSMOS, CS_USER, DECIMALS_18, DECIMAL_ZERO, EMPTY_MEMO, ERC20,
HOSTED_DENOM, NAME, NATIVE_DENOM, OWNER, PACKET_COMMITMENT_ON_SN, PACKET_DATA_FROM_SN, SALT,
SN_USER, STARKNET, SUPPLY, SYMBOL,
SN_USER, STARKNET, SUPPLY, SYMBOL, ZERO,
};
}
pub mod event_spy {
Expand Down

0 comments on commit 5f6da96

Please sign in to comment.