Newer
Older
//! Unit tests for the tokens module.
#![cfg(test)]
use super::*;
use frame_support::{assert_noop, assert_ok};
#[test]
fn minimum_balance_work() {
ExtBuilder::default().build().execute_with(|| {
assert_eq!(Tokens::minimum_balance(BTC), 1);
assert_eq!(Tokens::minimum_balance(DOT), 2);
assert_eq!(Tokens::minimum_balance(ETH), 0);
});
}
#[test]
fn remove_dust_work() {
ExtBuilder::default().build().execute_with(|| {
System::set_block_number(1);
assert_ok!(Tokens::deposit(DOT, &ALICE, 100));
assert_eq!(Tokens::total_issuance(DOT), 100);
assert_eq!(Accounts::<Runtime>::contains_key(ALICE, DOT), true);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Accounts::<Runtime>::contains_key(DustAccount::get(), DOT), false);
assert_eq!(Tokens::free_balance(DOT, &DustAccount::get()), 0);
assert_eq!(System::providers(&DustAccount::get()), 0);
// total is gte ED, will not handle dust
assert_ok!(Tokens::withdraw(DOT, &ALICE, 98));
assert_eq!(Tokens::total_issuance(DOT), 2);
assert_eq!(Accounts::<Runtime>::contains_key(ALICE, DOT), true);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 2);
assert_eq!(Accounts::<Runtime>::contains_key(DustAccount::get(), DOT), false);
assert_eq!(Tokens::free_balance(DOT, &DustAccount::get()), 0);
assert_eq!(System::providers(&DustAccount::get()), 0);
// ensure dust account balance gte ED
assert_ok!(Tokens::deposit(DOT, &DustAccount::get(), Tokens::minimum_balance(DOT)));
assert_ok!(Tokens::withdraw(DOT, &ALICE, 1));
// total is lte ED, will handle dust
assert_eq!(Accounts::<Runtime>::contains_key(ALICE, DOT), false);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 0);
// will not handle dust for module account
assert_eq!(Accounts::<Runtime>::contains_key(DustAccount::get(), DOT), true);
assert_eq!(Tokens::free_balance(DOT, &DustAccount::get()), 3);
assert_eq!(System::providers(&DustAccount::get()), 1);
System::assert_last_event(Event::Tokens(crate::Event::DustLost(DOT, ALICE, 1)));
});
}
#[test]
fn set_free_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
Tokens::set_free_balance(DOT, &ALICE, 100);
System::assert_last_event(Event::Tokens(crate::Event::Endowed(DOT, ALICE, 100)));
#[test]
fn set_lock_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::set_lock(ID_1, DOT, &ALICE, 10));
assert_eq!(Tokens::accounts(&ALICE, DOT).frozen, 10);
assert_eq!(Tokens::accounts(&ALICE, DOT).frozen(), 10);
assert_eq!(Tokens::locks(ALICE, DOT).len(), 1);
assert_ok!(Tokens::set_lock(ID_1, DOT, &ALICE, 50));
assert_eq!(Tokens::accounts(&ALICE, DOT).frozen, 50);
assert_eq!(Tokens::locks(ALICE, DOT).len(), 1);
assert_ok!(Tokens::set_lock(ID_2, DOT, &ALICE, 60));
assert_eq!(Tokens::accounts(&ALICE, DOT).frozen, 60);
assert_eq!(Tokens::locks(ALICE, DOT).len(), 2);
});
}
#[test]
fn extend_lock_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::set_lock(ID_1, DOT, &ALICE, 10));
assert_eq!(Tokens::locks(ALICE, DOT).len(), 1);
assert_eq!(Tokens::accounts(&ALICE, DOT).frozen, 10);
assert_ok!(Tokens::extend_lock(ID_1, DOT, &ALICE, 20));
assert_eq!(Tokens::locks(ALICE, DOT).len(), 1);
assert_eq!(Tokens::accounts(&ALICE, DOT).frozen, 20);
assert_ok!(Tokens::extend_lock(ID_2, DOT, &ALICE, 10));
assert_ok!(Tokens::extend_lock(ID_1, DOT, &ALICE, 20));
});
}
#[test]
fn remove_lock_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::set_lock(ID_1, DOT, &ALICE, 10));
assert_ok!(Tokens::set_lock(ID_2, DOT, &ALICE, 20));
assert_ok!(Tokens::remove_lock(ID_2, DOT, &ALICE));
});
}
#[test]
fn frozen_can_limit_liquidity() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::set_lock(ID_1, DOT, &ALICE, 90));
<Tokens as MultiCurrency<_>>::transfer(DOT, &ALICE, &BOB, 11),
Error::<Runtime>::LiquidityRestrictions,
);
assert_ok!(Tokens::set_lock(ID_1, DOT, &ALICE, 10));
assert_ok!(<Tokens as MultiCurrency<_>>::transfer(DOT, &ALICE, &BOB, 11));
});
}
#[test]
fn can_reserve_is_correct() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(Tokens::can_reserve(DOT, &ALICE, 0), true);
assert_eq!(Tokens::can_reserve(DOT, &ALICE, 101), false);
assert_eq!(Tokens::can_reserve(DOT, &ALICE, 100), true);
});
}
#[test]
fn reserve_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_noop!(Tokens::reserve(DOT, &ALICE, 101), Error::<Runtime>::BalanceTooLow);
assert_ok!(Tokens::reserve(DOT, &ALICE, 0));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::total_balance(DOT, &ALICE), 100);
assert_ok!(Tokens::reserve(DOT, &ALICE, 50));
System::assert_last_event(Event::Tokens(crate::Event::Reserved(DOT, ALICE, 50)));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::total_balance(DOT, &ALICE), 100);
});
}
#[test]
fn unreserve_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::unreserve(DOT, &ALICE, 0), 0);
assert_eq!(Tokens::unreserve(DOT, &ALICE, 50), 50);
System::assert_last_event(Event::Tokens(crate::Event::Unreserved(DOT, ALICE, 0)));
System::assert_last_event(Event::Tokens(crate::Event::Reserved(DOT, ALICE, 30)));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 70);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 30);
assert_eq!(Tokens::unreserve(DOT, &ALICE, 15), 0);
System::assert_last_event(Event::Tokens(crate::Event::Unreserved(DOT, ALICE, 15)));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 85);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 15);
assert_eq!(Tokens::unreserve(DOT, &ALICE, 30), 15);
System::assert_last_event(Event::Tokens(crate::Event::Unreserved(DOT, ALICE, 15)));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 0);
});
}
#[test]
fn slash_reserved_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::reserve(DOT, &ALICE, 50));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::total_issuance(DOT), 200);
assert_eq!(Tokens::slash_reserved(DOT, &ALICE, 0), 0);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::total_issuance(DOT), 200);
assert_eq!(Tokens::slash_reserved(DOT, &ALICE, 100), 50);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::total_issuance(DOT), 150);
});
}
#[test]
fn repatriate_reserved_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 0);
Tokens::repatriate_reserved(DOT, &ALICE, &ALICE, 0, BalanceStatus::Free),
Tokens::repatriate_reserved(DOT, &ALICE, &ALICE, 50, BalanceStatus::Free),
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::free_balance(DOT, &BOB), 100);
assert_eq!(Tokens::reserved_balance(DOT, &BOB), 0);
assert_ok!(Tokens::reserve(DOT, &BOB, 50));
assert_eq!(Tokens::free_balance(DOT, &BOB), 50);
assert_eq!(Tokens::reserved_balance(DOT, &BOB), 50);
Tokens::repatriate_reserved(DOT, &BOB, &BOB, 60, BalanceStatus::Reserved),
assert_eq!(Tokens::free_balance(DOT, &BOB), 50);
assert_eq!(Tokens::reserved_balance(DOT, &BOB), 50);
Tokens::repatriate_reserved(DOT, &BOB, &ALICE, 30, BalanceStatus::Reserved),
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 30);
assert_eq!(Tokens::free_balance(DOT, &BOB), 50);
assert_eq!(Tokens::reserved_balance(DOT, &BOB), 20);
Tokens::repatriate_reserved(DOT, &BOB, &ALICE, 30, BalanceStatus::Free),
assert_eq!(Tokens::free_balance(DOT, &ALICE), 120);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 30);
assert_eq!(Tokens::free_balance(DOT, &BOB), 50);
assert_eq!(Tokens::reserved_balance(DOT, &BOB), 0);
});
}
#[test]
fn slash_draw_reserved_correct() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::reserve(DOT, &ALICE, 50));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::total_issuance(DOT), 200);
assert_eq!(Tokens::slash(DOT, &ALICE, 80), 0);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 20);
assert_eq!(Tokens::total_issuance(DOT), 120);
assert_eq!(Tokens::slash(DOT, &ALICE, 50), 30);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::reserved_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::total_issuance(DOT), 100);
#[test]
fn genesis_issuance_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::free_balance(DOT, &BOB), 100);
assert_eq!(Tokens::total_issuance(DOT), 200);
});
}
#[test]
fn transfer_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::transfer(Some(ALICE).into(), BOB, DOT, 50));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::free_balance(DOT, &BOB), 150);
assert_eq!(Tokens::total_issuance(DOT), 200);
System::assert_last_event(Event::Tokens(crate::Event::Transfer(DOT, ALICE, BOB, 50)));
assert_noop!(
Tokens::transfer(Some(ALICE).into(), CHARLIE, DOT, 1),
Error::<Runtime>::ExistentialDeposit,
);
assert_ok!(Tokens::transfer(Some(ALICE).into(), CHARLIE, DOT, 2));
#[test]
fn transfer_all_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::transfer_all(Some(ALICE).into(), BOB, DOT));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::free_balance(DOT, &BOB), 200);
System::assert_last_event(Event::Tokens(crate::Event::Transfer(DOT, ALICE, BOB, 100)));
#[test]
fn transfer_failed_when_allow_death_but_cannot_dec_provider() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(System::can_dec_provider(&ALICE), true);
assert_ok!(System::inc_consumers(&ALICE));
assert_eq!(System::can_dec_provider(&ALICE), false);
assert_noop!(
Tokens::transfer(Some(ALICE).into(), BOB, DOT, 100),
Error::<Runtime>::KeepAlive
);
assert_ok!(Tokens::deposit(BTC, &ALICE, 100));
assert_eq!(System::can_dec_provider(&ALICE), true);
assert_ok!(Tokens::transfer(Some(ALICE).into(), BOB, DOT, 100));
});
}
#[test]
fn deposit_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::deposit(DOT, &ALICE, 100));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 200);
assert_eq!(Tokens::total_issuance(DOT), 300);
);
});
}
#[test]
fn withdraw_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::withdraw(DOT, &ALICE, 50));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::total_issuance(DOT), 150);
assert_noop!(Tokens::withdraw(DOT, &ALICE, 60), Error::<Runtime>::BalanceTooLow);
#[test]
fn slash_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
// slashed_amount < amount
assert_eq!(Tokens::slash(DOT, &ALICE, 50), 0);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 50);
assert_eq!(Tokens::total_issuance(DOT), 150);
assert_eq!(Tokens::slash(DOT, &ALICE, 51), 1);
assert_eq!(Tokens::free_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::total_issuance(DOT), 100);
#[test]
fn update_balance_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_ok!(Tokens::update_balance(DOT, &ALICE, 50));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 150);
assert_eq!(Tokens::total_issuance(DOT), 250);
assert_ok!(Tokens::update_balance(DOT, &BOB, -50));
assert_eq!(Tokens::free_balance(DOT, &BOB), 50);
assert_eq!(Tokens::total_issuance(DOT), 200);
assert_noop!(Tokens::update_balance(DOT, &BOB, -60), Error::<Runtime>::BalanceTooLow);
#[test]
fn ensure_can_withdraw_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_noop!(
assert_ok!(Tokens::ensure_can_withdraw(DOT, &ALICE, 1));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
});
}
#[test]
fn no_op_if_amount_is_zero() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(Tokens::ensure_can_withdraw(DOT, &ALICE, 0));
assert_ok!(Tokens::transfer(Some(ALICE).into(), BOB, DOT, 0));
assert_ok!(Tokens::transfer(Some(ALICE).into(), ALICE, DOT, 0));
assert_ok!(Tokens::deposit(DOT, &ALICE, 0));
assert_ok!(Tokens::withdraw(DOT, &ALICE, 0));
assert_eq!(Tokens::slash(DOT, &ALICE, 0), 0);
assert_eq!(Tokens::slash(DOT, &ALICE, 1), 1);
assert_ok!(Tokens::update_balance(DOT, &ALICE, 0));
fn transfer_all_trait_should_work() {
.balances(vec![(ALICE, DOT, 100), (ALICE, BTC, 200)])
assert_eq!(Tokens::free_balance(DOT, &ALICE), 100);
assert_eq!(Tokens::free_balance(BTC, &ALICE), 200);
assert_eq!(Tokens::free_balance(DOT, &BOB), 0);
assert_ok!(<Tokens as TransferAll<AccountId>>::transfer_all(&ALICE, &BOB));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 0);
assert_eq!(Tokens::free_balance(BTC, &ALICE), 0);
assert_eq!(Tokens::free_balance(DOT, &BOB), 100);
assert_eq!(Tokens::free_balance(BTC, &BOB), 200);
assert_ok!(Tokens::reserve(DOT, &BOB, 1));
assert_ok!(<Tokens as TransferAll<AccountId>>::transfer_all(&BOB, &ALICE));
assert_eq!(Tokens::free_balance(DOT, &ALICE), 99);
assert_eq!(Tokens::free_balance(BTC, &ALICE), 200);
assert_eq!(Tokens::free_balance(DOT, &BOB), 0);
assert_eq!(Tokens::free_balance(BTC, &BOB), 0);
#[test]
fn currency_adapter_ensure_currency_adapter_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
assert_eq!(Tokens::total_issuance(DOT), 102);
assert_eq!(Tokens::total_balance(DOT, &Treasury::account_id()), 2);
assert_eq!(Tokens::total_balance(DOT, &TREASURY_ACCOUNT), 100);
assert_eq!(Tokens::reserved_balance(DOT, &TREASURY_ACCOUNT), 0);
assert_eq!(Tokens::free_balance(DOT, &TREASURY_ACCOUNT), 100);
<Runtime as pallet_elections_phragmen::Config>::Currency::total_balance(&TREASURY_ACCOUNT),
<Runtime as pallet_elections_phragmen::Config>::Currency::can_slash(&TREASURY_ACCOUNT, 10),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
<Runtime as pallet_elections_phragmen::Config>::Currency::minimum_balance(),
<Runtime as pallet_elections_phragmen::Config>::Currency::can_reserve(&TREASURY_ACCOUNT, 5),
let imbalance = <Runtime as pallet_elections_phragmen::Config>::Currency::burn(10);
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
let imbalance = <Runtime as pallet_elections_phragmen::Config>::Currency::issue(20);
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
<Runtime as pallet_elections_phragmen::Config>::Currency::free_balance(&TREASURY_ACCOUNT),
<Runtime as pallet_elections_phragmen::Config>::Currency::ensure_can_withdraw(
assert_ok!(<Runtime as pallet_elections_phragmen::Config>::Currency::transfer(
&TREASURY_ACCOUNT,
&ALICE,
11,
ExistenceRequirement::KeepAlive
));
assert_eq!(
<Runtime as pallet_elections_phragmen::Config>::Currency::free_balance(&TREASURY_ACCOUNT),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
);
let imbalance = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 11);
assert_eq!(
<Runtime as pallet_elections_phragmen::Config>::Currency::free_balance(&TREASURY_ACCOUNT),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
<Runtime as pallet_elections_phragmen::Config>::Currency::free_balance(&TREASURY_ACCOUNT),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
let imbalance = <Runtime as pallet_elections_phragmen::Config>::Currency::withdraw(
ExistenceRequirement::KeepAlive,
);
assert_eq!(
<Runtime as pallet_elections_phragmen::Config>::Currency::free_balance(&TREASURY_ACCOUNT),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
<Runtime as pallet_elections_phragmen::Config>::Currency::free_balance(&TREASURY_ACCOUNT),
<Runtime as pallet_elections_phragmen::Config>::Currency::total_issuance(),
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
#[test]
fn currency_adapter_withdraw_failed_when_allow_death_but_cannot_dec_provider() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(System::can_dec_provider(&ALICE), true);
assert_ok!(System::inc_consumers(&ALICE));
assert_eq!(System::can_dec_provider(&ALICE), false);
assert!(TreasuryCurrencyAdapter::withdraw(
&ALICE,
100,
WithdrawReasons::TRANSFER,
ExistenceRequirement::AllowDeath
)
.is_err());
assert_ok!(Tokens::deposit(BTC, &ALICE, 100));
assert_eq!(System::can_dec_provider(&ALICE), true);
assert!(TreasuryCurrencyAdapter::withdraw(
&ALICE,
100,
WithdrawReasons::TRANSFER,
ExistenceRequirement::AllowDeath
)
.is_ok());
});
}
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
#[test]
fn currency_adapter_burn_must_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
let init_total_issuance = TreasuryCurrencyAdapter::total_issuance();
let imbalance = TreasuryCurrencyAdapter::burn(10);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), init_total_issuance - 10);
drop(imbalance);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), init_total_issuance);
});
}
#[test]
fn currency_adapter_reserving_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 111);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 111);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 111);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 0);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 69));
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 111);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 42);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 69);
});
}
#[test]
fn currency_adapter_balance_transfer_when_reserved_should_not_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 111);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 69));
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 69, ExistenceRequirement::AllowDeath),
Error::<Runtime>::BalanceTooLow,
);
});
}
#[test]
fn currency_adapter_deducting_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 111);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 69));
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 42);
});
}
#[test]
fn currency_adapter_refunding_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 42);
Tokens::set_reserved_balance(DOT, &TREASURY_ACCOUNT, 69);
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
TreasuryCurrencyAdapter::unreserve(&TREASURY_ACCOUNT, 69);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 111);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 0);
});
}
#[test]
fn currency_adapter_slashing_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 111);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 69));
assert!(TreasuryCurrencyAdapter::slash(&TREASURY_ACCOUNT, 69).1.is_zero());
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 42);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 42);
});
}
#[test]
fn currency_adapter_slashing_incomplete_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 42);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 21));
assert_eq!(TreasuryCurrencyAdapter::slash(&TREASURY_ACCOUNT, 69).1, 27);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 0);
});
}
#[test]
fn currency_adapter_basic_locking_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 100);
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, 91, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 10, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
});
}
#[test]
fn currency_adapter_partial_locking_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, 5, WithdrawReasons::all());
assert_ok!(TreasuryCurrencyAdapter::transfer(
&TREASURY_ACCOUNT,
&ALICE,
ExistenceRequirement::AllowDeath
));
});
}
#[test]
fn currency_adapter_lock_removal_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, u64::max_value(), WithdrawReasons::all());
TreasuryCurrencyAdapter::remove_lock(ID_1, &TREASURY_ACCOUNT);
assert_ok!(TreasuryCurrencyAdapter::transfer(
&TREASURY_ACCOUNT,
&ALICE,
ExistenceRequirement::AllowDeath
));
});
}
#[test]
fn currency_adapter_lock_replacement_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, u64::max_value(), WithdrawReasons::all());
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, 5, WithdrawReasons::all());
assert_ok!(TreasuryCurrencyAdapter::transfer(
&TREASURY_ACCOUNT,
&ALICE,
ExistenceRequirement::AllowDeath
));
});
}
#[test]
fn currency_adapter_double_locking_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, 5, WithdrawReasons::empty());
TreasuryCurrencyAdapter::set_lock(ID_2, &TREASURY_ACCOUNT, 5, WithdrawReasons::all());
assert_ok!(TreasuryCurrencyAdapter::transfer(
&TREASURY_ACCOUNT,
&ALICE,
ExistenceRequirement::AllowDeath
));
});
}
#[test]
fn currency_adapter_combination_locking_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
// withdrawReasons not work
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, u64::max_value(), WithdrawReasons::empty());
TreasuryCurrencyAdapter::set_lock(ID_2, &TREASURY_ACCOUNT, 0, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 2, ExistenceRequirement::AllowDeath),
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
Error::<Runtime>::LiquidityRestrictions
);
});
}
#[test]
fn currency_adapter_lock_value_extension_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, 100, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 6, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
TreasuryCurrencyAdapter::extend_lock(ID_1, &TREASURY_ACCOUNT, 2, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 6, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
TreasuryCurrencyAdapter::extend_lock(ID_1, &TREASURY_ACCOUNT, 8, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 3, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
});
}
#[test]
fn currency_adapter_lock_block_number_extension_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, 200, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 6, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
TreasuryCurrencyAdapter::extend_lock(ID_1, &TREASURY_ACCOUNT, 90, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 6, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
System::set_block_number(2);
TreasuryCurrencyAdapter::extend_lock(ID_1, &TREASURY_ACCOUNT, 90, WithdrawReasons::all());
assert_noop!(
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 3, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
});
}
#[test]
fn currency_adapter_lock_reasons_extension_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
TreasuryCurrencyAdapter::set_lock(ID_1, &TREASURY_ACCOUNT, 90, WithdrawReasons::TRANSFER);
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 11, ExistenceRequirement::AllowDeath),
TreasuryCurrencyAdapter::extend_lock(ID_1, &TREASURY_ACCOUNT, 90, WithdrawReasons::empty());
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 11, ExistenceRequirement::AllowDeath),
TreasuryCurrencyAdapter::extend_lock(ID_1, &TREASURY_ACCOUNT, 90, WithdrawReasons::RESERVE);
TreasuryCurrencyAdapter::transfer(&TREASURY_ACCOUNT, &ALICE, 11, ExistenceRequirement::AllowDeath),
Error::<Runtime>::LiquidityRestrictions
);
});
}
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
#[test]
fn currency_adapter_deposit_creating_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 200);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 0);
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 1);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 200);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 0);
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 2);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 202);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 2);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 202);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&ALICE), 100);
let _ = TreasuryCurrencyAdapter::deposit_creating(&ALICE, 1);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 203);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&ALICE), 101);
});
}
#[test]
fn currency_adapter_deposit_into_existing_should_work() {
ExtBuilder::default()
.one_hundred_for_alice_n_bob()
.build()
.execute_with(|| {
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 0);
assert_noop!(
TreasuryCurrencyAdapter::deposit_into_existing(&TREASURY_ACCOUNT, 10).map(drop),
Error::<Runtime>::DeadAccount,
);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 200);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&ALICE), 100);
assert_ok!(TreasuryCurrencyAdapter::deposit_into_existing(&ALICE, 10).map(drop));
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 210);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&ALICE), 110);
});
}
#[test]
fn currency_adapter_reward_should_work() {
ExtBuilder::default()
.one_hundred_for_treasury_account()
.build()
.execute_with(|| {
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 102);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 100);
assert_eq!(TreasuryCurrencyAdapter::total_balance(&Treasury::account_id()), 2);
assert_ok!(TreasuryCurrencyAdapter::deposit_into_existing(&TREASURY_ACCOUNT, 10).map(drop));
assert_eq!(TreasuryCurrencyAdapter::total_balance(&TREASURY_ACCOUNT), 110);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 112);
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
});
}
#[test]
fn currency_adapter_slashing_reserved_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 111);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 111));
assert_eq!(TreasuryCurrencyAdapter::slash_reserved(&TREASURY_ACCOUNT, 42).1, 0);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 69);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 69);
});
}
#[test]
fn currency_adapter_slashing_incomplete_reserved_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 111);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 42));
assert_eq!(TreasuryCurrencyAdapter::slash_reserved(&TREASURY_ACCOUNT, 69).1, 27);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 69);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::total_issuance(), 69);
});
}
#[test]
fn currency_adapter_repatriating_reserved_balance_should_work() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 110);
let _ = TreasuryCurrencyAdapter::deposit_creating(&ALICE, 2);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 110));
assert_ok!(
TreasuryCurrencyAdapter::repatriate_reserved(&TREASURY_ACCOUNT, &ALICE, 41, Status::Free),
0
);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 69);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&ALICE), 0);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&ALICE), 43);