From d7dd72d78dbe62758154cc8dda44f4c4cc624506 Mon Sep 17 00:00:00 2001 From: GTC6244 <95836911+GTC6244@users.noreply.github.com> Date: Sun, 5 Jan 2025 22:23:16 -0500 Subject: [PATCH 1/4] Update to leptos 0.7 --- Cargo.toml | 5 +++-- src/leptos.rs | 38 ++++++++++++++++++++------------------ src/lib.rs | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 38c301d..3df132a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,8 @@ 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 } +leptos = { version = "0.7", features = ["csr"] } log = "0.4.20" qrcode-generator = "4.1.9" rand = "0.8" @@ -48,7 +49,7 @@ yew = { version = "0.21", features = ["csr"], optional = true } yew-hooks = { version = "0.3", optional = true } [features] -leptos = ["dep:leptos"] +# leptos = ["dep:leptos"] yew = ["dep:yew", "dep:yew-hooks"] [dev-dependencies] diff --git a/src/leptos.rs b/src/leptos.rs index 16905a8..bafe6f8 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::prelude::*; +use leptos::task::spawn_local; use log::{debug, error}; use serde::Serialize; use url::Url; @@ -33,12 +35,12 @@ 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) @@ -89,15 +91,13 @@ impl EthereumContext { #[derive(Clone, Debug)] pub(crate) struct EthereumInnerContext { - ethers: ReadSignal, - set_ethers: WriteSignal, - state: ReadSignal, - set_state: WriteSignal, + ethers: RwSignal, + state: RwSignal, } impl EthereumInnerContext { pub(crate) fn new() -> Self { - let (state, set_state) = create_signal(EthereumState { + let state = RwSignal::new(EthereumState { connected: false, accounts: None, chain_id: None, @@ -130,23 +130,23 @@ impl EthereumInnerContext { ) .build(); - let (ethers, set_ethers) = create_signal(ethereum); - Self { ethers, set_ethers, state, set_state } + let ethers = RwSignal::new(ethereum); + Self { ethers, 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; + let (_, set_state) = self.state.split(); + let (r,w) = self.ethers.split(); + let mut eth = r.get(); 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()); + w.set(eth.clone()); run(eth, set_state).await; } }); @@ -157,11 +157,13 @@ impl EthereumInnerContext { pub fn disconnect(&self) { if self.is_connected() { - let mut eth = self.ethers.get(); - let set_eth = self.set_ethers; + let eth = self.ethers.clone(); + spawn_local(async move { + let (r, w) = eth.split(); + let mut eth = r.get(); let _ = eth.disconnect().await; - set_eth.set(eth); + w.set(eth); }); } } diff --git a/src/lib.rs b/src/lib.rs index 688025b..60e0d54 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ pub mod explorer; mod eip1193; mod event; -#[cfg(feature = "leptos")] +// #[cfg(feature = "leptos")] pub mod leptos; mod walletconnect; From b5ba47bdfda6b79b06d9d43738c888e443fee035 Mon Sep 17 00:00:00 2001 From: GTC6244 <95836911+GTC6244@users.noreply.github.com> Date: Tue, 7 Jan 2025 10:12:51 -0500 Subject: [PATCH 2/4] Clean up, re-do to minimize code changes on signals. --- Cargo.toml | 5 ++- src/leptos.rs | 99 +++++++++++++++++++++++++-------------------------- src/lib.rs | 6 ++-- src/yew.rs | 12 +++---- 4 files changed, 56 insertions(+), 66 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3df132a..0aca31d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,8 +29,7 @@ gloo-storage = "0.3.0" gloo-utils = "0.2" hex = "0.4.3" js-sys = "0.3.64" -# leptos = { version = "0.7", features = ["csr"], optional = true } -leptos = { version = "0.7", features = ["csr"] } +leptos = { version = "0.7", features = ["csr"], optional = true } log = "0.4.20" qrcode-generator = "4.1.9" rand = "0.8" @@ -49,7 +48,7 @@ yew = { version = "0.21", features = ["csr"], optional = true } yew-hooks = { version = "0.3", optional = true } [features] -# leptos = ["dep:leptos"] +leptos = ["dep:leptos"] yew = ["dep:yew", "dep:yew-hooks"] [dev-dependencies] diff --git a/src/leptos.rs b/src/leptos.rs index bafe6f8..ecb0e02 100644 --- a/src/leptos.rs +++ b/src/leptos.rs @@ -5,7 +5,7 @@ use ethers::{ providers::Provider, types::{Address, Signature}, }; - +use leptos::children::Children; use leptos::prelude::*; use leptos::task::spawn_local; use log::{debug, error}; @@ -45,6 +45,7 @@ impl EthereumContext { /// 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); } @@ -91,18 +92,21 @@ impl EthereumContext { #[derive(Clone, Debug)] pub(crate) struct EthereumInnerContext { - ethers: RwSignal, - state: RwSignal, + ethers: ReadSignal, + set_ethers: WriteSignal, + state: ReadSignal, + set_state: WriteSignal, } impl EthereumInnerContext { pub(crate) fn new() -> Self { - let state = RwSignal::new(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,33 +124,25 @@ 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 = RwSignal::new(ethereum); - Self { ethers, state } + 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 (_, set_state) = self.state.split(); - let (r,w) = self.ethers.split(); - let mut eth = r.get(); + 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"); - w.set(eth.clone()); + set_eth.set(eth.clone()); run(eth, set_state).await; } }); @@ -157,13 +153,11 @@ impl EthereumInnerContext { pub fn disconnect(&self) { if self.is_connected() { - let eth = self.ethers.clone(); - + let mut eth = self.ethers.get(); + let set_eth = self.set_ethers; spawn_local(async move { - let (r, w) = eth.split(); - let mut eth = r.get(); let _ = eth.disconnect().await; - w.set(eth); + set_eth.set(eth); }); } } @@ -210,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()); - } - Event::Connected => { - state.connected = true; - state.pairing_url = None; - set_state.set(state.clone()); - } - Event::Disconnected => { - state.connected = false; - 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::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 60e0d54..1b3f4c7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ pub mod explorer; mod eip1193; mod event; -// #[cfg(feature = "leptos")] +#[cfg(feature = "leptos")] pub mod leptos; mod walletconnect; @@ -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/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() }); From 62cba45fa5f0f0795dba7e1fcc24bd9ed7e9facc Mon Sep 17 00:00:00 2001 From: GTC6244 <95836911+GTC6244@users.noreply.github.com> Date: Sat, 22 Mar 2025 20:56:25 -0400 Subject: [PATCH 3/4] remove unused dependencies --- Cargo.toml | 20 ++++++++++---------- examples/yew-app/Cargo.toml | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0aca31d..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.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" From 08e249e130488957bee50ffd4019f8b974b0529e Mon Sep 17 00:00:00 2001 From: GTC6244 <95836911+GTC6244@users.noreply.github.com> Date: Tue, 23 Sep 2025 09:01:37 -0400 Subject: [PATCH 4/4] Update FromHexError to use the ethers exportt --- src/eip1193/error.rs | 3 +-- src/walletconnect/error.rs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) 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/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::*;