diff --git a/Cargo.toml b/Cargo.toml index 38c301d..95b0981 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,26 +16,26 @@ default-target = "wasm32-unknown-unknown" [dependencies] async-trait = "0.1" -chrono = { version = "0.4", features = ["serde"] } -console_error_panic_hook = "0.1.7" -console_log = "1.0.0" -data-encoding = "2.4" -derive_more = "0.99" +# chrono = { version = "0.4", features = ["serde"] } +# console_error_panic_hook = "0.1.7" +# console_log = "1.0.0" +# data-encoding = "2.4" +# derive_more = "0.99" ethers = "2.0" futures = "0.3.28" -getrandom = { version = "0.2", features = ["js"] } -gloo = { version = "0.11.0", features = ["futures"] } +# getrandom = { version = "0.2", features = ["js"] } +# gloo = { version = "0.11.0", features = ["futures"] } gloo-storage = "0.3.0" gloo-utils = "0.2" hex = "0.4.3" js-sys = "0.3.64" -leptos = { version = "0.6", features = ["csr"], optional = true } +leptos = { version = "0.7", features = ["csr"], optional = true } log = "0.4.20" -qrcode-generator = "4.1.9" -rand = "0.8" +# qrcode-generator = "4.1.9" +# rand = "0.8" reqwest = { version = "0.11", features = ["json"] } serde = { version = "1.0", features = ["derive", "rc"] } -serde-wasm-bindgen = "0.6" +# serde-wasm-bindgen = "0.6" serde_json = "1.0" thiserror = "1.0" tokio = { version = "1.35", default-features = false, features = ["sync", "macros"] } diff --git a/examples/yew-app/Cargo.toml b/examples/yew-app/Cargo.toml index 975d746..158bd10 100644 --- a/examples/yew-app/Cargo.toml +++ b/examples/yew-app/Cargo.toml @@ -9,12 +9,12 @@ edition = "2021" ethers = "2.0" ethers-web = { path = "../../", features = ["yew"] } yew = { version = "0.21", features = ["csr"] } -yew-hooks = "0.3" +# yew-hooks = "0.3" qrcode-generator = "4.1" log = "0.4" console_log = "1.0.0" console_error_panic_hook = "0.1.7" serde = { version = "1.0", features = ["derive", "rc"] } -serde-wasm-bindgen = "0.6" +# serde-wasm-bindgen = "0.6" serde_json = "1.0" data-encoding = "2.5.0" diff --git a/src/eip1193/error.rs b/src/eip1193/error.rs index cd420bc..e7e28c0 100644 --- a/src/eip1193/error.rs +++ b/src/eip1193/error.rs @@ -1,9 +1,8 @@ use ethers::{ prelude::{JsonRpcError, ProviderError, RpcError, SignatureError}, - utils::ConversionError, + utils::{ConversionError, hex::FromHexError}, }; use gloo_utils::format::JsValueSerdeExt; -use hex::FromHexError; use thiserror::Error; use wasm_bindgen::JsValue; diff --git a/src/leptos.rs b/src/leptos.rs index 16905a8..ecb0e02 100644 --- a/src/leptos.rs +++ b/src/leptos.rs @@ -1,11 +1,13 @@ -use std::rc::Rc; +use std::sync::Arc; use crate::{Ethereum as Ethers, EthereumBuilder, EthereumError, Event, WalletType}; use ethers::{ providers::Provider, types::{Address, Signature}, }; -use leptos::*; +use leptos::children::Children; +use leptos::prelude::*; +use leptos::task::spawn_local; use log::{debug, error}; use serde::Serialize; use url::Url; @@ -33,16 +35,17 @@ pub fn Ethereum(children: Children) -> impl IntoView { /// Ethereum context for your website #[derive(Clone, Debug)] pub struct EthereumContext { - pub(crate) inner: Rc, + pub(crate) inner: Arc, } impl EthereumContext { pub(crate) fn new() -> Self { - Self { inner: Rc::new(EthereumInnerContext::new()) } + Self { inner: Arc::new(EthereumInnerContext::new()) } } /// Connect to the wallet (defined by type) pub fn connect(&self, wallet_type: WalletType) { + log::info!("Connect | wallet_type: {:?}", wallet_type); self.inner.connect(wallet_type); } @@ -97,12 +100,13 @@ pub(crate) struct EthereumInnerContext { impl EthereumInnerContext { pub(crate) fn new() -> Self { - let (state, set_state) = create_signal(EthereumState { + let (state, set_state) = RwSignal::new(EthereumState { connected: false, accounts: None, chain_id: None, pairing_url: None, - }); + }) + .split(); let mut builder = EthereumBuilder::new(); @@ -120,32 +124,24 @@ impl EthereumInnerContext { }; let ethereum = builder - .url( - Url::parse(app_url).expect( - &format!( - "Correct app url in variable APP_URL is not provided. '{:?}'", - std::option_env!("APP_URL") - ), - ), - ) + .url(Url::parse(app_url).expect(&format!( + "Correct app url in variable APP_URL is not provided. '{:?}'", + std::option_env!("APP_URL") + ))) .build(); - let (ethers, set_ethers) = create_signal(ethereum); + let (ethers, set_ethers) = RwSignal::new(ethereum).split(); Self { ethers, set_ethers, state, set_state } } pub fn connect(&self, wallet_type: WalletType) { - debug!("Here"); self.disconnect(); let mut eth = self.ethers.get(); let set_eth = self.set_ethers; let set_state = self.set_state; if eth.is_available(wallet_type) { - debug!("There"); spawn_local(async move { - debug!("Everywhere"); if eth.connect(wallet_type).await.is_ok() { - debug!("Got it"); set_eth.set(eth.clone()); run(eth, set_state).await; } @@ -208,30 +204,33 @@ async fn run(eth: Ethers, set_state: WriteSignal) { while keep_looping { match eth.next().await { - Ok(Some(event)) => match event { - Event::ConnectionWaiting(url) => { - state.pairing_url = Some(url); - set_state.set(state.clone()); + Ok(Some(event)) => { + log::info!("Event: {:?}", event); + match event { + Event::ConnectionWaiting(url) => { + state.pairing_url = Some(url); + set_state.set(state.clone()); + } + Event::Connected => { + state.connected = true; + state.pairing_url = None; + set_state.set(state.clone()); + } + Event::Disconnected => { + state.connected = false; + set_state.set(state.clone()); + } + Event::Broken => {} + Event::ChainIdChanged(chain_id) => { + state.chain_id = chain_id; + set_state.set(state.clone()); + } + Event::AccountsChanged(accounts) => { + state.accounts = accounts; + set_state.set(state.clone()); + } } - Event::Connected => { - state.connected = true; - state.pairing_url = None; - set_state.set(state.clone()); - } - Event::Disconnected => { - state.connected = false; - set_state.set(state.clone()); - } - Event::Broken => {} - Event::ChainIdChanged(chain_id) => { - state.chain_id = chain_id; - set_state.set(state.clone()); - } - Event::AccountsChanged(accounts) => { - state.accounts = accounts; - set_state.set(state.clone()); - } - }, + } Ok(None) => {} Err(err) => { keep_looping = false; diff --git a/src/lib.rs b/src/lib.rs index 688025b..1b3f4c7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,7 +24,7 @@ use ethers::{ use gloo_storage::{LocalStorage, Storage}; use gloo_utils::format::JsValueSerdeExt; use hex::FromHexError; -use log::{debug, error}; +use log::error; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{ fmt::{Debug, Formatter, Result as FmtResult}, @@ -529,7 +529,6 @@ impl Ethereum { _ => Ok(self.receiver.lock().await.recv().await), }; - debug!("NEW EVENT {:?}", event); if let Ok(Some(e)) = &event { if e == &Event::Connected { if let WebProvider::WalletConnect(provider) = &self.wallet { @@ -544,7 +543,6 @@ impl Ethereum { _ = LocalStorage::set(STATUS_KEY, self.collect_state()); } } - event } diff --git a/src/walletconnect/error.rs b/src/walletconnect/error.rs index fc20d7c..fbb7d6f 100644 --- a/src/walletconnect/error.rs +++ b/src/walletconnect/error.rs @@ -1,8 +1,7 @@ use ethers::{ providers::{HttpClientError, JsonRpcError, ProviderError, RpcError}, - types::SignatureError, + types::SignatureError, utils::hex::FromHexError, }; -use hex::FromHexError; use log::error; use thiserror::Error; use walletconnect_client::prelude::*; diff --git a/src/yew.rs b/src/yew.rs index f6c41f3..42b5d75 100644 --- a/src/yew.rs +++ b/src/yew.rs @@ -145,14 +145,10 @@ pub fn use_ethereum() -> UseEthereum { let ethereum = use_state(move || { builder - .url( - Url::parse(app_url).expect( - &format!( - "Correct app url in variable APP_URL is not provided. '{:?}'", - std::option_env!("APP_URL") - ), - ), - ) + .url(Url::parse(app_url).expect(&format!( + "Correct app url in variable APP_URL is not provided. '{:?}'", + std::option_env!("APP_URL") + ))) .build() });