Transaction - 4

The SDK offer much more than just a couple of helper functions for transaction submission. To get a better understanding on what can be done, check all the other examples, especially the following ones:

  • Data Submission - This one is a must
  • Block
  • Transactions
  • Events

Not everything is shown in our examples. Open the SDK and take a look what interfaces are available.

Events and Block

Here is just a sneak peak on the events and block api that we offer.

	use avail_rust::avail::data_availability::events::ApplicationKeyCreated;
	let Some(event) = tx_details.find_first_event::<ApplicationKeyCreated>() else {
		return Err("Failed to find event".into());
	};
	println!("App id: {}", event.id.0);
	let block = Block::new(&sdk.online_client, tx_details.block_hash).await?;
	let tx_count = block.transactions.iter().count();
	println!("Transaction count in a block: {}", tx_count);

Transaction with custom payload

Transaction interface can be created using custom payload.

	// ! Check Transaction 1(basics_1) or Transaction 2(basics_2) example for custom payload. !
	let data = String::from("Data").into_bytes();
	let data = BoundedVec(data);
	let payload = avail_rust::avail::tx()
		.data_availability()
		.submit_data(data);
	let tx = Transaction::new(sdk.online_client.clone(), sdk.rpc_client.clone(), payload);
	let tx_details = tx.execute_and_watch_inclusion(&account, None).await?;
	// Checking if the transaction was successful
	match tx_details.is_successful(&sdk.online_client) {
		Some(x) => x?,
		None => panic!("Failed to decode events."),
	};

Source Code

use avail_rust::prelude::*;

#[tokio::main]
async fn main() -> Result<(), ClientError> {
	// RPC Connection
	let sdk = SDK::new(SDK::local_endpoint()).await?;

	// Accounts
	let account = SDK::alice()?;

	// ANCHOR: success
	let key = String::from("My Data").into_bytes();
	let tx = sdk.tx.data_availability.create_application_key(key);
	let tx_details = tx.execute_and_watch_inclusion(&account, None).await?;
	// Checking if the transaction was successful
	match tx_details.is_successful(&sdk.online_client) {
		Some(x) => x?,
		None => panic!("Failed to decode events."),
	};
	// ANCHOR_END: success

	// Finding ApplicationKeyCreated event
	// ANCHOR: event
	use avail_rust::avail::data_availability::events::ApplicationKeyCreated;
	let Some(event) = tx_details.find_first_event::<ApplicationKeyCreated>() else {
		return Err("Failed to find event".into());
	};
	println!("App id: {}", event.id.0);
	// ANCHOR_END: event

	// Fetching block
	// ANCHOR: block
	let block = Block::new(&sdk.online_client, tx_details.block_hash).await?;
	let tx_count = block.transactions.iter().count();
	println!("Transaction count in a block: {}", tx_count);
	// ANCHOR_END: block

	// Using custom payload with Transaction object
	// ANCHOR: custompayload
	// ! Check Transaction 1(basics_1) or Transaction 2(basics_2) example for custom payload. !
	let data = String::from("Data").into_bytes();
	let data = BoundedVec(data);
	let payload = avail_rust::avail::tx()
		.data_availability()
		.submit_data(data);
	let tx = Transaction::new(sdk.online_client.clone(), sdk.rpc_client.clone(), payload);
	let tx_details = tx.execute_and_watch_inclusion(&account, None).await?;
	// Checking if the transaction was successful
	match tx_details.is_successful(&sdk.online_client) {
		Some(x) => x?,
		None => panic!("Failed to decode events."),
	};
	// ANCHOR_END: custompayload

	Ok(())
}