From 60b91b1a776ae5d78da278d3c1a775be3fb2b14a Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 20 Jul 2021 15:31:09 +0200 Subject: [PATCH 1/2] Add events on BankMsg::Send and test --- Cargo.lock | 1 + packages/multi-test/Cargo.toml | 1 + packages/multi-test/src/app.rs | 38 ++++++++++++++++++++++----------- packages/multi-test/src/bank.rs | 17 ++++++++++++--- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 271eb6f1a..a3cb110ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,6 +213,7 @@ dependencies = [ "cosmwasm-storage", "cw-storage-plus", "cw0", + "itertools", "prost", "schemars", "serde", diff --git a/packages/multi-test/Cargo.toml b/packages/multi-test/Cargo.toml index 952be7515..5c7882647 100644 --- a/packages/multi-test/Cargo.toml +++ b/packages/multi-test/Cargo.toml @@ -20,6 +20,7 @@ cw0 = { path = "../../packages/cw0", version = "0.7.0" } cw-storage-plus = { path = "../../packages/storage-plus", version = "0.7.0" , features = ["iterator"]} cosmwasm-std = { version = "0.15.0", features = ["staking"] } cosmwasm-storage = { version = "0.15.0", features = ["iterator"] } +itertools = "0.10.1" schemars = "0.8.1" serde = { version = "1.0.103", default-features = false, features = ["derive"] } prost = "0.8.0" diff --git a/packages/multi-test/src/app.rs b/packages/multi-test/src/app.rs index 760e5c6c5..27dd4d2f5 100644 --- a/packages/multi-test/src/app.rs +++ b/packages/multi-test/src/app.rs @@ -269,7 +269,7 @@ where mod test { use cosmwasm_std::testing::MockStorage; use cosmwasm_std::{ - attr, coin, coins, AllBalanceResponse, BankMsg, BankQuery, Reply, SubMsg, WasmMsg, + attr, coin, coins, AllBalanceResponse, BankMsg, BankQuery, Event, Reply, SubMsg, WasmMsg, }; use crate::test_helpers::{ @@ -390,9 +390,14 @@ mod test { let res = app .execute_contract(random.clone(), contract_addr.clone(), &EmptyMsg {}, &[]) .unwrap(); - assert_eq!(1, res.events.len()); + assert_eq!(2, res.events.len()); let custom_attrs = res.custom_attrs(0); assert_eq!(&[attr("action", "payout")], &custom_attrs); + let expected_transfer = Event::new("transfer") + .attr("recipient", "random") + .attr("sender", &contract_addr) + .attr("amount", "5eth"); + assert_eq!(&expected_transfer, &res.events[1]); // random got cash let funds = get_balance(&app, &random); @@ -450,7 +455,7 @@ mod test { .unwrap(); // ensure the attributes were relayed from the sub-message - assert_eq!(2, res.events.len(), "{:?}", res.events); + assert_eq!(3, res.events.len(), "{:?}", res.events); // first event was the call to reflect let first = &res.events[0]; assert_eq!(first.ty.as_str(), "wasm"); @@ -468,7 +473,9 @@ mod test { &second.attributes[0] ); assert_eq!(&attr("action", "payout"), &second.attributes[1]); - // FIXME? reply didn't add any more events itself... + // third event is the transfer from bank + let third = &res.events[2]; + assert_eq!(third.ty.as_str(), "transfer"); // ensure transfer was executed with reflect as sender let funds = get_balance(&app, &reflect_addr); @@ -520,10 +527,14 @@ mod test { .execute_contract(random.clone(), reflect_addr.clone(), &msgs, &[]) .unwrap(); // only one wasm event with no custom attributes - assert_eq!(1, res.events.len()); + assert_eq!(2, res.events.len()); assert_eq!(1, res.events[0].attributes.len()); assert_eq!("wasm", res.events[0].ty.as_str()); assert_eq!("contract_address", res.events[0].attributes[0].key.as_str()); + // second event is the transfer from bank + let transfer = &res.events[1]; + assert_eq!(transfer.ty.as_str(), "transfer"); + // ensure random got paid let funds = get_balance(&app, &random); assert_eq!(funds, coins(7, "eth")); @@ -641,16 +652,19 @@ mod test { .execute_contract(random.clone(), reflect_addr.clone(), &msgs, &[]) .unwrap(); // we should get 2 events, the wasm one and the custom event - assert_eq!(2, res.events.len(), "{:?}", res.events); + assert_eq!(3, res.events.len(), "{:?}", res.events); // the first one is just the standard wasm message with custom_address (no more attrs) let attrs = res.custom_attrs(0); assert_eq!(0, attrs.len()); - // the second one is a custom event - let second = &res.events[1]; - assert_eq!("wasm-custom", second.ty.as_str()); - assert_eq!(2, second.attributes.len()); - assert_eq!(&attr("from", "reply"), &second.attributes[0]); - assert_eq!(&attr("to", "test"), &second.attributes[1]); + // second event is the transfer from bank + let transfer = &res.events[1]; + assert_eq!(transfer.ty.as_str(), "transfer"); + // the third one is a custom event (from reply) + let custom = &res.events[2]; + assert_eq!("wasm-custom", custom.ty.as_str()); + assert_eq!(2, custom.attributes.len()); + assert_eq!(&attr("from", "reply"), &custom.attributes[0]); + assert_eq!(&attr("to", "test"), &custom.attributes[1]); // ensure success was written let res: Reply = app.wrap().query_wasm_smart(&reflect_addr, &query).unwrap(); diff --git a/packages/multi-test/src/bank.rs b/packages/multi-test/src/bank.rs index fbfe2fbd5..3cb2be896 100644 --- a/packages/multi-test/src/bank.rs +++ b/packages/multi-test/src/bank.rs @@ -1,12 +1,13 @@ use cosmwasm_std::{ coin, to_binary, Addr, AllBalanceResponse, BalanceResponse, BankMsg, BankQuery, Binary, Coin, - Storage, + Event, Storage, }; use crate::executor::AppResponse; use cosmwasm_storage::{prefixed, prefixed_read}; use cw0::NativeBalance; use cw_storage_plus::Map; +use itertools::Itertools; const BALANCES: Map<&Addr, NativeBalance> = Map::new("balances"); @@ -96,6 +97,13 @@ impl BankKeeper { } } +fn coins_to_string(coins: &[Coin]) -> String { + coins + .iter() + .map(|c| format!("{}{}", c.amount, c.denom)) + .join(",") +} + impl Bank for BankKeeper { fn execute( &self, @@ -106,14 +114,17 @@ impl Bank for BankKeeper { let mut bank_storage = prefixed(storage, NAMESPACE_BANK); match msg { BankMsg::Send { to_address, amount } => { + let events = vec![Event::new("transfer") + .attr("recipient", &to_address) + .attr("sender", &sender) + .attr("amount", coins_to_string(&amount))]; self.send( &mut bank_storage, sender, Addr::unchecked(to_address), amount, )?; - // TODO: add some proper events here - Ok(AppResponse::default()) + Ok(AppResponse { events, data: None }) } BankMsg::Burn { amount } => { self.burn(&mut bank_storage, sender, amount)?; From 15685ab98ad7a6785357ea4341dcb2a3b7999e44 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 20 Jul 2021 15:35:04 +0200 Subject: [PATCH 2/2] Add comment on BankMsg::Burn --- packages/multi-test/src/bank.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/multi-test/src/bank.rs b/packages/multi-test/src/bank.rs index 3cb2be896..be08e4391 100644 --- a/packages/multi-test/src/bank.rs +++ b/packages/multi-test/src/bank.rs @@ -114,6 +114,7 @@ impl Bank for BankKeeper { let mut bank_storage = prefixed(storage, NAMESPACE_BANK); match msg { BankMsg::Send { to_address, amount } => { + // see https://github.com/cosmos/cosmos-sdk/blob/v0.42.7/x/bank/keeper/send.go#L142-L147 let events = vec![Event::new("transfer") .attr("recipient", &to_address) .attr("sender", &sender) @@ -127,8 +128,8 @@ impl Bank for BankKeeper { Ok(AppResponse { events, data: None }) } BankMsg::Burn { amount } => { + // burn doesn't seem to emit any events self.burn(&mut bank_storage, sender, amount)?; - // TODO: add some proper events here Ok(AppResponse::default()) } m => Err(format!("Unsupported bank message: {:?}", m)),