Contracts: Add transfer event (#801)

This commit is contained in:
Sergey Pepyakin
2018-09-25 20:49:18 +01:00
committed by Gav Wood
parent a613c62dc1
commit 98e0a3a55a
7 changed files with 142 additions and 31 deletions
+73 -3
View File
@@ -21,16 +21,26 @@ use runtime_primitives::traits::{BlakeTwo256};
use runtime_primitives::BuildStorage;
use runtime_support::StorageMap;
use substrate_primitives::{Blake2Hasher};
use system::{Phase, EventRecord};
use wabt;
use {
runtime_io, balances, system, CodeOf, ContractAddressFor,
GenesisConfig, Module, StorageOf, Trait,
GenesisConfig, Module, StorageOf, Trait, RawEvent,
};
impl_outer_origin! {
pub enum Origin for Test {}
}
mod contract {
pub use super::super::*;
}
impl_outer_event! {
pub enum MetaEvent for Test {
balances<T>, contract<T>,
}
}
#[derive(Clone, Eq, PartialEq)]
pub struct Test;
impl system::Trait for Test {
@@ -42,7 +52,7 @@ impl system::Trait for Test {
type Digest = Digest;
type AccountId = u64;
type Header = Header;
type Event = ();
type Event = MetaEvent;
type Log = DigestItem;
}
impl balances::Trait for Test {
@@ -50,15 +60,17 @@ impl balances::Trait for Test {
type AccountIndex = u64;
type OnFreeBalanceZero = Contract;
type EnsureAccountLiquid = ();
type Event = ();
type Event = MetaEvent;
}
impl Trait for Test {
type Gas = u64;
type DetermineContractAddress = DummyContractAddressFor;
type Event = MetaEvent;
}
type Balances = balances::Module<Test>;
type Contract = Module<Test>;
type System = system::Module<Test>;
pub struct DummyContractAddressFor;
impl ContractAddressFor<u64> for DummyContractAddressFor {
@@ -205,6 +217,27 @@ fn contract_transfer() {
Balances::free_balance(&CONTRACT_SHOULD_TRANSFER_TO),
CONTRACT_SHOULD_TRANSFER_VALUE,
);
assert_eq!(System::events(), vec![
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::balances(
balances::RawEvent::NewAccount(
CONTRACT_SHOULD_TRANSFER_TO,
0,
balances::NewAccountOutcome::NoHint
)
),
},
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::contract(RawEvent::Transfer(0, 1, 3)),
},
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::contract(RawEvent::Transfer(1, CONTRACT_SHOULD_TRANSFER_TO, 6)),
},
]);
});
}
@@ -316,6 +349,13 @@ fn contract_transfer_oog() {
assert_eq!(Balances::free_balance(&1), 14);
// But `ext_call` should not.
assert_eq!(Balances::free_balance(&CONTRACT_SHOULD_TRANSFER_TO), 0);
assert_eq!(System::events(), vec![
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::contract(RawEvent::Transfer(0, 1, 3)),
},
]);
});
}
@@ -464,6 +504,27 @@ fn contract_create() {
assert_eq!(Balances::free_balance(&1), 8);
assert_eq!(Balances::free_balance(&derived_address), 3);
assert_eq!(System::events(), vec![
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::balances(
balances::RawEvent::NewAccount(
derived_address,
0,
balances::NewAccountOutcome::NoHint
)
),
},
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::contract(RawEvent::Transfer(0, 1, 11)),
},
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::contract(RawEvent::Transfer(1, 2, 3)),
},
]);
// Initiate transfer to the newly created contract.
assert_ok!(Contract::call(Origin::signed(0), derived_address, 22, 100_000, Vec::new()));
@@ -516,6 +577,13 @@ fn top_level_create() {
assert_eq!(Balances::free_balance(&derived_address), 30 + 11);
assert_eq!(<CodeOf<Test>>::get(&derived_address), code_transfer);
assert_eq!(System::events(), vec![
EventRecord {
phase: Phase::ApplyExtrinsic(0),
event: MetaEvent::contract(RawEvent::Transfer(0, derived_address, 11)),
},
]);
});
}
@@ -643,6 +711,8 @@ fn top_level_call_refunds_even_if_fails() {
);
assert_eq!(Balances::free_balance(&0), 100_000_000 - (4 * 3) - (4 * 135));
assert_eq!(System::events(), vec![]);
});
}