-
Notifications
You must be signed in to change notification settings - Fork 258
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add reworked event types * first pass implementing event subscriptions * make clear that some methods are private * comment tidy * use Events in transaction stuff * align transaction and event APIs * remove __private_ prefixes; they are ugly * fix examples and remove old events and subscription code * better comments on hidden event functions * re-add find_first_event; it's used a bunch in tests and examples * cargo check --all-targets now passes * Fix up existing event tests * cargo fmt * change todo to note * clippy and doc niggles * revert to find_first_event * Add specific subscription related tests * cargo fmt * Update tests and add/fix examples * cargo fmt * add a little to subscribe_all_events example * cargo fmt * move an example comment * easy access to root mod for more clarity * add a couple of tests to ensure that events properly decoded until naff bytes * Simplify EventSubscription Stream impl a little * Address some PR feedback
- Loading branch information
Showing
27 changed files
with
11,598 additions
and
5,287 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
// Copyright 2019-2022 Parity Technologies (UK) Ltd. | ||
// This file is part of subxt. | ||
// | ||
// subxt is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// subxt is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with subxt. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
//! To run this example, a local polkadot node should be running. Example verified against polkadot 0.9.13-82616422d0-aarch64-macos. | ||
//! | ||
//! E.g. | ||
//! ```bash | ||
//! curl "https://github.com/paritytech/polkadot/releases/download/v0.9.13/polkadot" --output /usr/local/bin/polkadot --location | ||
//! polkadot --dev --tmp | ||
//! ``` | ||
use futures::StreamExt; | ||
use sp_keyring::AccountKeyring; | ||
use std::time::Duration; | ||
use subxt::{ | ||
ClientBuilder, | ||
DefaultConfig, | ||
DefaultExtra, | ||
PairSigner, | ||
}; | ||
|
||
#[subxt::subxt(runtime_metadata_path = "examples/polkadot_metadata.scale")] | ||
pub mod polkadot {} | ||
|
||
/// Subscribe to all events, and then manually look through them and | ||
/// pluck out the events that we care about. | ||
#[async_std::main] | ||
async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||
env_logger::init(); | ||
|
||
let api = ClientBuilder::new() | ||
.build() | ||
.await? | ||
.to_runtime_api::<polkadot::RuntimeApi<DefaultConfig, DefaultExtra<DefaultConfig>>>(); | ||
|
||
// Subscribe to any events that occur: | ||
let mut event_sub = api.events().subscribe().await?; | ||
|
||
// While this subscription is active, balance transfers are made somewhere: | ||
async_std::task::spawn(async { | ||
let signer = PairSigner::new(AccountKeyring::Alice.pair()); | ||
let api = ClientBuilder::new() | ||
.build() | ||
.await | ||
.unwrap() | ||
.to_runtime_api::<polkadot::RuntimeApi<DefaultConfig, DefaultExtra<DefaultConfig>>>(); | ||
|
||
let mut transfer_amount = 1_000_000_000; | ||
|
||
// Make small balance transfers from Alice to Bob in a loop: | ||
loop { | ||
api.tx() | ||
.balances() | ||
.transfer(AccountKeyring::Bob.to_account_id().into(), transfer_amount) | ||
.sign_and_submit(&signer) | ||
.await | ||
.unwrap(); | ||
|
||
async_std::task::sleep(Duration::from_secs(10)).await; | ||
transfer_amount += 100_000_000; | ||
} | ||
}); | ||
|
||
// Our subscription will see the events emitted as a result of this: | ||
while let Some(events) = event_sub.next().await { | ||
let events = events?; | ||
let block_hash = events.block_hash(); | ||
|
||
// We can iterate, statically decoding all events if we want: | ||
println!("All events in block {block_hash:?}:"); | ||
println!(" Static event details:"); | ||
for event in events.iter() { | ||
let event = event?; | ||
println!(" {event:?}"); | ||
} | ||
|
||
// Or we can dynamically decode events: | ||
println!(" Dynamic event details: {block_hash:?}:"); | ||
for event in events.iter_raw() { | ||
let event = event?; | ||
let is_balance_transfer = event | ||
.as_event::<polkadot::balances::events::Transfer>()? | ||
.is_some(); | ||
let pallet = event.pallet; | ||
let variant = event.variant; | ||
println!( | ||
" {pallet}::{variant} (is balance transfer? {is_balance_transfer})" | ||
); | ||
} | ||
|
||
// Or we can dynamically find the first transfer event, ignoring any others: | ||
let transfer_event = | ||
events.find_first_event::<polkadot::balances::events::Transfer>()?; | ||
|
||
if let Some(ev) = transfer_event { | ||
println!(" - Balance transfer success: value: {:?}", ev.amount); | ||
} else { | ||
println!(" - No balance transfer event found in this block"); | ||
} | ||
} | ||
|
||
Ok(()) | ||
} |
Oops, something went wrong.