Example: How to connect to parachain (#1043)

* parachain rpc lists

* guide almost done

* add the 3rd config

* subscribe to block with configs

* delete table file

* spaces instead of tabs

* remove original ajuna example

* zombienet setup

* nft minting example

* include port, use different names

* link the example from the book

* format book

* add config creation to book, simplify example structure

* fix the nft creation script

* fix doc ref

* fixing links to foreign crates

* fix table formatting

* include nits

* move more docs to book, and simplify parachain-example

* another pass over docs and link to exampels from guide

* nit: adjust comment to numbers

* teeny README fix for parachain-example

* fix command in readme

* add CI for examples and fix parachain-example bug I left in

* add target arch

* cargo fmt

* make CI not fail

* remove index from docs

---------

Co-authored-by: James Wilson <james@jsdw.me>
This commit is contained in:
Tadeo Hepperle
2023-07-21 13:55:48 +02:00
committed by GitHub
parent fd8f60c8a9
commit 8b23b2b83c
19 changed files with 6123 additions and 77 deletions
+90
View File
@@ -0,0 +1,90 @@
use subxt::{
Config, PolkadotConfig, SubstrateConfig,
utils::{AccountId32, MultiAddress},
OnlineClient,
};
use subxt_signer::sr25519::dev::{self};
#[subxt::subxt(runtime_metadata_path = "statemint_metadata.scale")]
pub mod statemint {}
/// Custom config that works with Statemint:
pub enum StatemintConfig {}
impl Config for StatemintConfig {
type Hash = <PolkadotConfig as Config>::Hash;
type AccountId = <PolkadotConfig as Config>::AccountId;
type Address = <PolkadotConfig as Config>::Address;
type Signature = <PolkadotConfig as Config>::Signature;
type Hasher = <PolkadotConfig as Config>::Hasher;
type Header = <PolkadotConfig as Config>::Header;
type ExtrinsicParams = <SubstrateConfig as Config>::ExtrinsicParams;
}
#[tokio::main]
pub async fn main() {
if let Err(err) = run().await {
eprintln!("{err}");
}
}
async fn run() -> Result<(), Box<dyn std::error::Error>> {
// (the port 42069 is specified in the asset-hub-zombienet.toml)
let api = OnlineClient::<StatemintConfig>::from_url("ws://127.0.0.1:42069").await?;
println!("Connection with parachain established.");
let alice: MultiAddress<AccountId32, ()> = dev::alice().public_key().into();
let alice_pair_signer = dev::alice();
const COLLECTION_ID: u32 = 12;
const NTF_ID: u32 = 234;
// create a collection with id `12`
let collection_creation_tx = statemint::tx()
.uniques()
.create(COLLECTION_ID, alice.clone());
let _collection_creation_events = api
.tx()
.sign_and_submit_then_watch_default(&collection_creation_tx, &alice_pair_signer)
.await
.map(|e| {
println!("Collection creation submitted, waiting for transaction to be finalized...");
e
})?
.wait_for_finalized_success()
.await?;
println!("Collection created.");
// create an nft in that collection with id `234`
let nft_creation_tx = statemint::tx()
.uniques()
.mint(COLLECTION_ID, NTF_ID, alice.clone());
let _nft_creation_events = api
.tx()
.sign_and_submit_then_watch_default(&nft_creation_tx, &alice_pair_signer)
.await
.map(|e| {
println!("NFT creation submitted, waiting for transaction to be finalized...");
e
})?
.wait_for_finalized_success()
.await?;
println!("NFT created.");
// check in storage, that alice is the official owner of the NFT:
let nft_owner_storage_query = statemint::storage().uniques().asset(COLLECTION_ID, NTF_ID);
let nft_storage_details = api
.storage()
.at_latest()
.await?
.fetch(&nft_owner_storage_query)
.await?
.ok_or("The NFT should have an owner (alice)")?;
// make sure that alice is the owner of the NFT:
assert_eq!(nft_storage_details.owner, dev::alice().public_key().into());
println!("Storage Item Details: {:?}", nft_storage_details);
Ok(())
}