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 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(),
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
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
644
645
646
647
648
649
650
651
);
});
}
#[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);
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
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),
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
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
);
});
}
#[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);
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
});
}
#[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);
});
}
#[test]
fn currency_adapter_transferring_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::Reserved),
0
);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 69);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&ALICE), 41);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&ALICE), 2);
});
}
#[test]
fn currency_adapter_transferring_reserved_balance_to_nonexistent_should_fail() {
ExtBuilder::default().build().execute_with(|| {
let _ = TreasuryCurrencyAdapter::deposit_creating(&TREASURY_ACCOUNT, 111);
assert_ok!(TreasuryCurrencyAdapter::reserve(&TREASURY_ACCOUNT, 111));
assert_ok!(TreasuryCurrencyAdapter::repatriate_reserved(
&TREASURY_ACCOUNT,
&ALICE,
42,
Status::Free
));
});
}
#[test]
fn currency_adapter_transferring_incomplete_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, 41));
assert_ok!(
TreasuryCurrencyAdapter::repatriate_reserved(&TREASURY_ACCOUNT, &ALICE, 69, Status::Free),
28
);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&TREASURY_ACCOUNT), 0);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT), 69);
assert_eq!(TreasuryCurrencyAdapter::reserved_balance(&ALICE), 0);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&ALICE), 43);
});
}
#[test]
fn currency_adapter_transferring_too_high_value_should_not_panic() {
ExtBuilder::default().build().execute_with(|| {
TreasuryCurrencyAdapter::make_free_balance_be(&TREASURY_ACCOUNT, u64::max_value());
TreasuryCurrencyAdapter::make_free_balance_be(&ALICE, 2);
assert_noop!(
TreasuryCurrencyAdapter::transfer(
&TREASURY_ACCOUNT,
&ALICE,
u64::max_value(),
ExistenceRequirement::AllowDeath
),
);
assert_eq!(
TreasuryCurrencyAdapter::free_balance(&TREASURY_ACCOUNT),
u64::max_value()
);
assert_eq!(TreasuryCurrencyAdapter::free_balance(&ALICE), 2);
#[test]
fn exceeding_max_locks_should_fail() {
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_ok!(Tokens::set_lock(ID_2, DOT, &ALICE, 10));
assert_eq!(Tokens::locks(ALICE, DOT).len(), 2);
assert_noop!(
Tokens::set_lock(ID_3, DOT, &ALICE, 10),
Error::<Runtime>::MaxLocksExceeded
);
assert_eq!(Tokens::locks(ALICE, DOT).len(), 2);
});
}