Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add the wallet_switchEthereumChain method to the eip1193 transport #657

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/transports/eip_1193.rs
Expand Up @@ -41,7 +41,7 @@
let subscriptions: Subscriptions = Subscriptions::default();
let subscriptions_for_closure = subscriptions.clone();
let msg_handler = Closure::wrap(Box::new(move |evt_js: JsValue| {
let evt = evt_js.into_serde::<MessageEvent>().expect("Couldn't parse event data");

Check warning on line 44 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead

Check warning on line 44 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
log::trace!("Message from provider: {:?}", evt);
match evt.event_type.as_str() {
"eth_subscription" => {
Expand Down Expand Up @@ -71,7 +71,7 @@
pub fn connect_stream(&self) -> impl Stream<Item = Option<String>> {
self.handle_ad_hoc_event("connect", |evt_js| {
let evt = evt_js
.into_serde::<ConnectEvent>()

Check warning on line 74 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead

Check warning on line 74 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
.expect("couldn't parse connect event");
evt.chain_id
})
Expand All @@ -81,7 +81,7 @@
/// above.
pub fn disconnect_stream(&self) -> impl Stream<Item = jsonrpc_core::Error> {
self.handle_ad_hoc_event("disconnect", |evt_js| {
evt_js.into_serde().expect("deserializing disconnect error failed")

Check warning on line 84 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead

Check warning on line 84 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
})
}

Expand Down Expand Up @@ -132,6 +132,29 @@
.into_deserializer();
O::deserialize(deserializer).expect(&format!("couldn't deserialize {}", name))
}

/// EIP-3326: Switch a wallet to another chain
pub async fn switch_chain(&self, chain_id: &str) -> Result<serde_json::value::Value, error::Error> {
let js_params = JsValue::from_serde(&vec![&ChainId {

Check warning on line 138 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated associated function `wasm_bindgen::JsValue::from_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead

Check warning on line 138 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated associated function `wasm_bindgen::JsValue::from_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
chain_id: chain_id.to_string(),
}])
Comment on lines +138 to +140
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might be easier to use json! macro for such a simple parameter.

.expect("couldn't send method params via JSON");

self.provider_and_listeners
.borrow()
.provider
.request_wrapped(RequestArguments {
method: String::from("wallet_switchEthereumChain"),
params: js_sys::Array::from(&js_params),
})
.await
}
}

#[derive(serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ChainId {

Check warning on line 156 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

missing documentation for a struct
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please move the struct declaration into the function, since I don't think it's required anywhere outside it (or just use json! internally)

pub chain_id: String,

Check warning on line 157 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

missing documentation for a struct field
}

/// Event data sent from the JavaScript side to our callback.
Expand Down Expand Up @@ -179,7 +202,7 @@
..
}) => {
let js_params =
js_sys::Array::from(&JsValue::from_serde(&params).expect("couldn't send method params via JSON"));

Check warning on line 205 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated associated function `wasm_bindgen::JsValue::from_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead

Check warning on line 205 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated associated function `wasm_bindgen::JsValue::from_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
let copy = self.provider_and_listeners.borrow().provider.clone();
Box::pin(async move {
copy.request_wrapped(RequestArguments {
Expand Down Expand Up @@ -263,8 +286,8 @@
}

let parsed_value = resp
.map(|res| res.into_serde())

Check warning on line 289 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead

Check warning on line 289 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
.map_err(|err| err.into_serde::<RPCErrorExtra>());

Check warning on line 290 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead

Check warning on line 290 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated method `wasm_bindgen::JsValue::into_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
match parsed_value {
Ok(Ok(res)) => Ok(res),
Err(Ok(err)) => Err(Error::Rpc(err.into())),
Expand Down Expand Up @@ -340,14 +363,14 @@

fn json_to_js(json: &str) -> JsValue {
let json_value = serde_json::from_str::<serde_json::Value>(json).unwrap();
let js_value = JsValue::from_serde(&json_value).unwrap();

Check warning on line 366 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated associated function `wasm_bindgen::JsValue::from_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
js_value
}

#[wasm_bindgen_test]
fn parses_valid_response_correctly() {
let value = serde_json::from_str::<serde_json::Value>(r#"[1, false, null, "string"]"#).unwrap();
let response = Ok(JsValue::from_serde(&value).unwrap());

Check warning on line 373 in src/transports/eip_1193.rs

View workflow job for this annotation

GitHub Actions / Check WASM

use of deprecated associated function `wasm_bindgen::JsValue::from_serde`: causes dependency cycles, use `serde-wasm-bindgen` or `gloo_utils::format::JsValueSerdeExt` instead
let expected_result = Ok(value);
assert_eq!(Provider::parse_response(response), expected_result);

Expand Down