diff --git a/artifacts/frontier_metadata_small.scale b/artifacts/frontier_metadata_small.scale new file mode 100644 index 0000000000..67cf986a81 Binary files /dev/null and b/artifacts/frontier_metadata_small.scale differ diff --git a/signer/src/eth.rs b/signer/src/eth.rs index 49fdbd02d7..63d23bf384 100644 --- a/signer/src/eth.rs +++ b/signer/src/eth.rs @@ -298,7 +298,7 @@ mod test { use proptest::prelude::*; use secp256k1::Secp256k1; - use subxt_core::{config::*, tx::Signer as SignerT, utils::H256}; + use subxt_core::{config::*, tx::signer::Signer as SignerT, utils::H256}; use super::*; diff --git a/subxt/Cargo.toml b/subxt/Cargo.toml index a8fd772ff3..698e85a450 100644 --- a/subxt/Cargo.toml +++ b/subxt/Cargo.toml @@ -119,7 +119,7 @@ sp-core = { workspace = true } sp-keyring = { workspace = true } sp-runtime = { workspace = true } assert_matches = { workspace = true } -subxt-signer = { path = "../signer" } +subxt-signer = { path = "../signer", features = ["unstable-eth"] } # Tracing subscriber is useful for light-client examples to ensure that # the `bootNodes` and chain spec are configured correctly. If all is fine, then # the light-client wlll emit INFO logs with @@ -146,4 +146,4 @@ features = ["default", "substrate-compat", "unstable-light-client"] rustdoc-args = ["--cfg", "docsrs"] [package.metadata.playground] -features = ["default", "substrate-compat", "unstable-light-client"] \ No newline at end of file +features = ["default", "substrate-compat", "unstable-light-client"] diff --git a/subxt/examples/tx_basic_frontier.rs b/subxt/examples/tx_basic_frontier.rs new file mode 100644 index 0000000000..adeba406d0 --- /dev/null +++ b/subxt/examples/tx_basic_frontier.rs @@ -0,0 +1,64 @@ +//! Example to use subxt to talk to substrate-based nodes with ethereum accounts +//! which is not the default for subxt which is why we need to provide a custom config. +//! +//! This example requires to run a local frontier/moonbeam node to work. + +#![allow(missing_docs)] + +use subxt::OnlineClient; +use subxt_signer::eth::{dev, AccountId20, Signature}; + +#[subxt::subxt(runtime_metadata_path = "../artifacts/frontier_metadata_small.scale")] +mod eth_runtime {} + +enum EthRuntimeConfig {} + +impl subxt::Config for EthRuntimeConfig { + type Hash = subxt::utils::H256; + type AccountId = AccountId20; + type Address = AccountId20; + type Signature = Signature; + type Hasher = subxt::config::substrate::BlakeTwo256; + type Header = + subxt::config::substrate::SubstrateHeader; + type ExtrinsicParams = subxt::config::SubstrateExtrinsicParams; + type AssetId = u32; +} + +// This helper makes it easy to use our `AccountId20`'s with generated +// code that expects a generated `eth_runtime::runtime_types::fp_account:AccountId20` type. +impl From for eth_runtime::runtime_types::fp_account::AccountId20 { + fn from(a: AccountId20) -> Self { + eth_runtime::runtime_types::fp_account::AccountId20(a.0) + } +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + let api = OnlineClient::::from_insecure_url("ws://127.0.0.1:9944").await?; + + let alith = dev::alith(); + let baltathar = dev::baltathar(); + let dest = baltathar.account_id(); + + println!("baltathar pub: {}", hex::encode(baltathar.public_key().0)); + println!("baltathar addr: {}", hex::encode(dest)); + + let balance_transfer_tx = eth_runtime::tx() + .balances() + .transfer_allow_death(dest.into(), 10_001); + + let events = api + .tx() + .sign_and_submit_then_watch_default(&balance_transfer_tx, &alith) + .await? + .wait_for_finalized_success() + .await?; + + let transfer_event = events.find_first::()?; + if let Some(event) = transfer_event { + println!("Balance transfer success: {event:?}"); + } + + Ok(()) +}