mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-04-22 21:47:56 +00:00
413bcea9da
## TypeScript Fixes - Remove unused imports (useTranslation, TrendingUp, CheckCircle2) - Replace 'any' types with proper type annotations - Add PresaleData interface for type safety - Fix error handling with proper Error type casting ## React Hooks Fixes - Move loadPresaleData function before useEffect - Add eslint-disable comments for exhaustive-deps warnings - Prevent function definition hoisting issues ## Code Quality - Remove duplicate loadPresaleData function in PresaleDetail - Proper error message handling with type assertions - Clean imports and unused variables All 11 ESLint errors resolved, 0 warnings remaining. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
354 lines
9.9 KiB
Rust
354 lines
9.9 KiB
Rust
use crate::{mock::*, Error, Event};
|
|
use frame_support::{assert_noop, assert_ok, traits::fungibles::Inspect};
|
|
use sp_runtime::traits::Zero;
|
|
|
|
#[test]
|
|
fn start_presale_works() {
|
|
new_test_ext().execute_with(|| {
|
|
// Start presale as root
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// Check presale is active
|
|
assert!(Presale::presale_active());
|
|
|
|
// Check start block is set
|
|
assert!(Presale::presale_start_block().is_some());
|
|
|
|
// Check event
|
|
System::assert_last_event(
|
|
Event::PresaleStarted {
|
|
end_block: 101, // Current block 1 + Duration 100
|
|
}
|
|
.into(),
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn start_presale_already_started_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// Try to start again
|
|
assert_noop!(
|
|
Presale::start_presale(RuntimeOrigin::root()),
|
|
Error::<Test>::AlreadyStarted
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn start_presale_non_root_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
assert_noop!(
|
|
Presale::start_presale(RuntimeOrigin::signed(1)),
|
|
sp_runtime::DispatchError::BadOrigin
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn contribute_works() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
|
|
// Mint wUSDT to Alice
|
|
mint_assets(2, 1, 1000_000_000); // 1000 wUSDT (6 decimals)
|
|
|
|
// Start presale
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// Alice contributes 100 wUSDT
|
|
let contribution = 100_000_000; // 100 wUSDT
|
|
assert_ok!(Presale::contribute(RuntimeOrigin::signed(1), contribution));
|
|
|
|
// Check contribution tracked
|
|
assert_eq!(Presale::contributions(1), contribution);
|
|
|
|
// Check total raised
|
|
assert_eq!(Presale::total_raised(), contribution);
|
|
|
|
// Check contributors list
|
|
let contributors = Presale::contributors();
|
|
assert_eq!(contributors.len(), 1);
|
|
assert_eq!(contributors[0], 1);
|
|
|
|
// Check wUSDT transferred to treasury
|
|
let treasury = treasury_account();
|
|
let balance = Assets::balance(2, treasury);
|
|
assert_eq!(balance, contribution);
|
|
|
|
// Check event
|
|
System::assert_last_event(
|
|
Event::Contributed {
|
|
who: 1,
|
|
amount: contribution,
|
|
}
|
|
.into(),
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn contribute_multiple_times_works() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
mint_assets(2, 1, 1000_000_000);
|
|
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// First contribution
|
|
assert_ok!(Presale::contribute(RuntimeOrigin::signed(1), 50_000_000));
|
|
assert_eq!(Presale::contributions(1), 50_000_000);
|
|
|
|
// Second contribution
|
|
assert_ok!(Presale::contribute(RuntimeOrigin::signed(1), 30_000_000));
|
|
assert_eq!(Presale::contributions(1), 80_000_000);
|
|
|
|
// Contributors list should still have only 1 entry
|
|
assert_eq!(Presale::contributors().len(), 1);
|
|
|
|
// Total raised should be sum
|
|
assert_eq!(Presale::total_raised(), 80_000_000);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn contribute_multiple_users_works() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
mint_assets(2, 1, 1000_000_000); // Alice
|
|
mint_assets(2, 2, 1000_000_000); // Bob
|
|
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// Alice contributes
|
|
assert_ok!(Presale::contribute(RuntimeOrigin::signed(1), 100_000_000));
|
|
|
|
// Bob contributes
|
|
assert_ok!(Presale::contribute(RuntimeOrigin::signed(2), 200_000_000));
|
|
|
|
// Check individual contributions
|
|
assert_eq!(Presale::contributions(1), 100_000_000);
|
|
assert_eq!(Presale::contributions(2), 200_000_000);
|
|
|
|
// Check total raised
|
|
assert_eq!(Presale::total_raised(), 300_000_000);
|
|
|
|
// Check contributors list
|
|
assert_eq!(Presale::contributors().len(), 2);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn contribute_presale_not_active_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
mint_assets(2, 1, 1000_000_000);
|
|
|
|
// Try to contribute without starting presale
|
|
assert_noop!(
|
|
Presale::contribute(RuntimeOrigin::signed(1), 100_000_000),
|
|
Error::<Test>::PresaleNotActive
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn contribute_zero_amount_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
assert_noop!(
|
|
Presale::contribute(RuntimeOrigin::signed(1), 0),
|
|
Error::<Test>::ZeroContribution
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn contribute_after_presale_ended_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
mint_assets(2, 1, 1000_000_000);
|
|
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// Move past presale end (block 1 + 100 = 101)
|
|
System::set_block_number(102);
|
|
|
|
assert_noop!(
|
|
Presale::contribute(RuntimeOrigin::signed(1), 100_000_000),
|
|
Error::<Test>::PresaleEnded
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn contribute_while_paused_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
mint_assets(2, 1, 1000_000_000);
|
|
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
assert_ok!(Presale::emergency_pause(RuntimeOrigin::root()));
|
|
|
|
assert_noop!(
|
|
Presale::contribute(RuntimeOrigin::signed(1), 100_000_000),
|
|
Error::<Test>::PresalePaused
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn finalize_presale_works() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
|
|
// Setup: Mint wUSDT to users and PEZ to treasury
|
|
mint_assets(2, 1, 1000_000_000); // Alice: 1000 wUSDT
|
|
mint_assets(2, 2, 1000_000_000); // Bob: 1000 wUSDT
|
|
|
|
let treasury = treasury_account();
|
|
mint_assets(1, treasury, 100_000_000_000_000_000_000); // Treasury: 100,000 PEZ
|
|
|
|
// Start presale
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// Alice contributes 100 wUSDT
|
|
assert_ok!(Presale::contribute(RuntimeOrigin::signed(1), 100_000_000));
|
|
|
|
// Bob contributes 200 wUSDT
|
|
assert_ok!(Presale::contribute(RuntimeOrigin::signed(2), 200_000_000));
|
|
|
|
// Move to end of presale
|
|
System::set_block_number(101);
|
|
|
|
// Finalize presale
|
|
assert_ok!(Presale::finalize_presale(RuntimeOrigin::root()));
|
|
|
|
// Check presale is no longer active
|
|
assert!(!Presale::presale_active());
|
|
|
|
// Check Alice received correct PEZ amount
|
|
// 100 wUSDT = 10,000 PEZ
|
|
// 10,000 * 1_000_000_000_000 = 10_000_000_000_000_000
|
|
let alice_pez = Assets::balance(1, 1);
|
|
assert_eq!(alice_pez, 10_000_000_000_000_000);
|
|
|
|
// Check Bob received correct PEZ amount
|
|
// 200 wUSDT = 20,000 PEZ
|
|
let bob_pez = Assets::balance(1, 2);
|
|
assert_eq!(bob_pez, 20_000_000_000_000_000);
|
|
|
|
// Check finalize event
|
|
System::assert_last_event(
|
|
Event::PresaleFinalized {
|
|
total_raised: 300_000_000,
|
|
}
|
|
.into(),
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn finalize_presale_before_end_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
create_assets();
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// Try to finalize immediately
|
|
assert_noop!(
|
|
Presale::finalize_presale(RuntimeOrigin::root()),
|
|
Error::<Test>::PresaleNotEnded
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn finalize_presale_not_started_fails() {
|
|
new_test_ext().execute_with(|| {
|
|
assert_noop!(
|
|
Presale::finalize_presale(RuntimeOrigin::root()),
|
|
Error::<Test>::PresaleNotActive
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn emergency_pause_works() {
|
|
new_test_ext().execute_with(|| {
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
assert_ok!(Presale::emergency_pause(RuntimeOrigin::root()));
|
|
|
|
assert!(Presale::paused());
|
|
|
|
System::assert_last_event(Event::EmergencyPaused.into());
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn emergency_unpause_works() {
|
|
new_test_ext().execute_with(|| {
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
assert_ok!(Presale::emergency_pause(RuntimeOrigin::root()));
|
|
assert_ok!(Presale::emergency_unpause(RuntimeOrigin::root()));
|
|
|
|
assert!(!Presale::paused());
|
|
|
|
System::assert_last_event(Event::EmergencyUnpaused.into());
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn calculate_pez_correct() {
|
|
new_test_ext().execute_with(|| {
|
|
// Test calculation: 100 wUSDT = 10,000 PEZ
|
|
// wUSDT amount: 100_000_000 (6 decimals)
|
|
// Expected PEZ: 10_000_000_000_000_000 (12 decimals)
|
|
|
|
let wusdt_amount = 100_000_000;
|
|
let expected_pez = 10_000_000_000_000_000;
|
|
|
|
let result = Presale::calculate_pez(wusdt_amount);
|
|
assert_ok!(&result);
|
|
assert_eq!(result.unwrap(), expected_pez);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn get_time_remaining_works() {
|
|
new_test_ext().execute_with(|| {
|
|
// Before presale
|
|
assert_eq!(Presale::get_time_remaining(), 0);
|
|
|
|
// Start presale at block 1
|
|
assert_ok!(Presale::start_presale(RuntimeOrigin::root()));
|
|
|
|
// At block 1, should have 100 blocks remaining
|
|
assert_eq!(Presale::get_time_remaining(), 100);
|
|
|
|
// Move to block 50
|
|
System::set_block_number(50);
|
|
assert_eq!(Presale::get_time_remaining(), 51);
|
|
|
|
// Move past end
|
|
System::set_block_number(102);
|
|
assert_eq!(Presale::get_time_remaining(), 0);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn treasury_account_derivation_works() {
|
|
new_test_ext().execute_with(|| {
|
|
let treasury = treasury_account();
|
|
|
|
// Treasury account should be deterministic from PalletId
|
|
use sp_runtime::traits::AccountIdConversion;
|
|
let expected = PresalePalletId::get().into_account_truncating();
|
|
|
|
assert_eq!(treasury, expected);
|
|
});
|
|
}
|