diff --git a/crates/bindings/src/js_api.rs b/crates/bindings/src/js_api.rs index ea0567097..923208b42 100644 --- a/crates/bindings/src/js_api.rs +++ b/crates/bindings/src/js_api.rs @@ -1,3 +1,4 @@ +use crate::wasm_traits::prelude::*; use crate::IOrderBookV4::{ takeOrders2Call, EvaluableV3 as MainEvaluableV3, OrderV3 as MainOrderV3, Quote as MainQuote, SignedContextV1 as MainSignedContextV1, TakeOrderConfigV3 as MainTakeOrderConfigV3, @@ -12,15 +13,7 @@ use alloy::{ sol_types::SolCall, }; use serde::{Deserialize, Serialize}; -use serde_wasm_bindgen::{from_value, to_value}; use std::str::FromStr; -use tsify::Tsify; -use wasm_bindgen::{ - convert::*, - describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}, - prelude::*, - JsValue, UnwrapThrowExt, -}; // a serializer fn for serializing Vec as Uint8Array for js fn bytes_serilializer(val: &[u8], serializer: S) -> Result { @@ -29,7 +22,6 @@ fn bytes_serilializer(val: &[u8], serializer: S) -> Result #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct EvaluableV3 { pub interpreter: String, pub store: String, @@ -40,7 +32,6 @@ pub struct EvaluableV3 { #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct IO { pub token: String, pub decimals: u8, @@ -49,7 +40,6 @@ pub struct IO { #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct OrderV3 { pub owner: String, pub evaluable: EvaluableV3, @@ -60,7 +50,6 @@ pub struct OrderV3 { #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct SignedContextV1 { pub signer: String, pub context: Vec, @@ -71,7 +60,6 @@ pub struct SignedContextV1 { #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Quote { pub order: OrderV3, #[serde(rename = "inputIOIndex")] @@ -83,7 +71,6 @@ pub struct Quote { #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct TakeOrderConfigV3 { order: OrderV3, #[serde(rename = "inputIOIndex")] @@ -95,7 +82,6 @@ pub struct TakeOrderConfigV3 { #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct TakeOrdersConfigV3 { minimum_input: String, maximum_input: String, @@ -385,65 +371,17 @@ impl From for TakeOrdersConfigV3 { } } -#[macro_export] -macro_rules! impl_wasm_traits { - ($struct_name:ident) => { - impl RefFromWasmAbi for $struct_name { - type Abi = ::Abi; - type Anchor = Box<$struct_name>; - unsafe fn ref_from_abi(js: Self::Abi) -> Self::Anchor { - Box::new($struct_name::from_abi(js)) - } - } - impl LongRefFromWasmAbi for $struct_name { - type Abi = ::Abi; - type Anchor = Box<$struct_name>; - unsafe fn long_ref_from_abi(js: Self::Abi) -> Self::Anchor { - Box::new($struct_name::from_abi(js)) - } - } - impl VectorIntoWasmAbi for $struct_name { - type Abi = as IntoWasmAbi>::Abi; - fn vector_into_abi(vector: Box<[Self]>) -> Self::Abi { - js_value_vector_into_abi(vector) - } - } - impl VectorFromWasmAbi for $struct_name { - type Abi = as IntoWasmAbi>::Abi; - unsafe fn vector_from_abi(js: Self::Abi) -> Box<[Self]> { - js_value_vector_from_abi(js) - } - } - impl WasmDescribeVector for $struct_name { - fn describe_vector() { - inform(VECTOR); - $struct_name::describe(); - } - } - impl From<$struct_name> for JsValue { - fn from(value: $struct_name) -> Self { - let mut err = "".to_string(); - to_value(&value) - .inspect_err(|e| err.push_str(&e.to_string())) - .expect_throw(&err) - } - } - impl TryFromJsValue for $struct_name { - type Error = serde_wasm_bindgen::Error; - fn try_from_js_value(value: JsValue) -> Result { - from_value(value) - } - } - }; -} +mod impls { + use crate::impl_all_wasm_traits; -impl_wasm_traits!(IO); -impl_wasm_traits!(Quote); -impl_wasm_traits!(OrderV3); -impl_wasm_traits!(EvaluableV3); -impl_wasm_traits!(SignedContextV1); -impl_wasm_traits!(TakeOrderConfigV3); -impl_wasm_traits!(TakeOrdersConfigV3); + impl_all_wasm_traits!(super::IO); + impl_all_wasm_traits!(super::Quote); + impl_all_wasm_traits!(super::OrderV3); + impl_all_wasm_traits!(super::EvaluableV3); + impl_all_wasm_traits!(super::SignedContextV1); + impl_all_wasm_traits!(super::TakeOrderConfigV3); + impl_all_wasm_traits!(super::TakeOrdersConfigV3); +} #[cfg(test)] mod tests { diff --git a/crates/bindings/src/lib.rs b/crates/bindings/src/lib.rs index 6ad48cfe5..ff9f08472 100644 --- a/crates/bindings/src/lib.rs +++ b/crates/bindings/src/lib.rs @@ -24,3 +24,6 @@ sol!( #[cfg(target_family = "wasm")] pub mod js_api; + +#[cfg(target_family = "wasm")] +pub mod wasm_traits; diff --git a/crates/bindings/src/wasm_traits.rs b/crates/bindings/src/wasm_traits.rs new file mode 100644 index 000000000..066ec0a00 --- /dev/null +++ b/crates/bindings/src/wasm_traits.rs @@ -0,0 +1,113 @@ +pub mod prelude { + pub use serde_wasm_bindgen::{from_value, to_value}; + pub use tsify::Tsify; + pub use wasm_bindgen::{ + convert::*, + describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}, + prelude::*, + JsValue, UnwrapThrowExt, + }; +} + +#[macro_export] +macro_rules! impl_main_wasm_traits { + ($type_name:path) => { + impl $crate::wasm_traits::prelude::WasmDescribe for $type_name { + #[inline] + fn describe() { + ::JsType::describe() + } + } + impl $crate::wasm_traits::prelude::IntoWasmAbi for $type_name { + type Abi = <::JsType as $crate::wasm_traits::prelude::IntoWasmAbi>::Abi; + + #[inline] + fn into_abi(self) -> Self::Abi { + let mut err = "".to_string(); + let result = $crate::wasm_traits::prelude::Tsify::into_js(&self); + $crate::wasm_traits::prelude::UnwrapThrowExt::expect_throw(result.inspect_err(|e| err.push_str(&e.to_string())), &err).into_abi() + } + } + impl $crate::wasm_traits::prelude::OptionIntoWasmAbi for $type_name { + #[inline] + fn none() -> Self::Abi { + <::JsType as $crate::wasm_traits::prelude::OptionIntoWasmAbi>::none() + } + } + impl $crate::wasm_traits::prelude::FromWasmAbi for $type_name { + type Abi = <::JsType as $crate::wasm_traits::prelude::FromWasmAbi>::Abi; + + #[inline] + unsafe fn from_abi(js: Self::Abi) -> Self { + let mut err = "".to_string(); + let result = ::from_js(::JsType::from_abi(js)); + $crate::wasm_traits::prelude::UnwrapThrowExt::expect_throw(result.inspect_err(|e| err.push_str(&e.to_string())), &err) + } + } + impl $crate::wasm_traits::prelude::OptionFromWasmAbi for $type_name { + #[inline] + fn is_none(js: &Self::Abi) -> bool { + <::JsType as $crate::wasm_traits::prelude::OptionFromWasmAbi>::is_none(js) + } + } + }; +} + +#[macro_export] +macro_rules! impl_complementary_wasm_traits { + ($type_name:path) => { + impl $crate::wasm_traits::prelude::RefFromWasmAbi for $type_name { + type Abi = <$crate::wasm_traits::prelude::JsValue as $crate::wasm_traits::prelude::RefFromWasmAbi>::Abi; + type Anchor = Box<$type_name>; + unsafe fn ref_from_abi(js: Self::Abi) -> Self::Anchor { + Box::new(<$type_name as $crate::wasm_traits::prelude::FromWasmAbi>::from_abi(js)) + } + } + impl $crate::wasm_traits::prelude::LongRefFromWasmAbi for $type_name { + type Abi = <$crate::wasm_traits::prelude::JsValue as $crate::wasm_traits::prelude::RefFromWasmAbi>::Abi; + type Anchor = Box<$type_name>; + unsafe fn long_ref_from_abi(js: Self::Abi) -> Self::Anchor { + Box::new(<$type_name as $crate::wasm_traits::prelude::FromWasmAbi>::from_abi(js)) + } + } + impl $crate::wasm_traits::prelude::VectorIntoWasmAbi for $type_name { + type Abi = as $crate::wasm_traits::prelude::IntoWasmAbi>::Abi; + fn vector_into_abi(vector: Box<[Self]>) -> Self::Abi { + $crate::wasm_traits::prelude::js_value_vector_into_abi(vector) + } + } + impl $crate::wasm_traits::prelude::VectorFromWasmAbi for $type_name { + type Abi = as $crate::wasm_traits::prelude::IntoWasmAbi>::Abi; + unsafe fn vector_from_abi(js: Self::Abi) -> Box<[Self]> { + $crate::wasm_traits::prelude::js_value_vector_from_abi(js) + } + } + impl $crate::wasm_traits::prelude::WasmDescribeVector for $type_name { + fn describe_vector() { + $crate::wasm_traits::prelude::inform($crate::wasm_traits::prelude::VECTOR); + <$type_name as $crate::wasm_traits::prelude::WasmDescribe>::describe(); + } + } + impl From<$type_name> for $crate::wasm_traits::prelude::JsValue { + fn from(value: $type_name) -> Self { + let mut err = "".to_string(); + let result = $crate::wasm_traits::prelude::to_value(&value); + $crate::wasm_traits::prelude::UnwrapThrowExt::expect_throw(result.inspect_err(|e| err.push_str(&e.to_string())), &err) + } + } + impl $crate::wasm_traits::prelude::TryFromJsValue for $type_name { + type Error = serde_wasm_bindgen::Error; + fn try_from_js_value(value: $crate::wasm_traits::prelude::JsValue) -> Result { + $crate::wasm_traits::prelude::from_value(value) + } + } + }; +} + +#[macro_export] +macro_rules! impl_all_wasm_traits { + ($type_name:path) => { + $crate::impl_main_wasm_traits!($type_name); + $crate::impl_complementary_wasm_traits!($type_name); + }; +} diff --git a/crates/common/src/dotrain_order/calldata.rs b/crates/common/src/dotrain_order/calldata.rs index 2d28aaf9b..5751b11b6 100644 --- a/crates/common/src/dotrain_order/calldata.rs +++ b/crates/common/src/dotrain_order/calldata.rs @@ -11,28 +11,8 @@ use alloy::{ use rain_orderbook_app_settings::{deployment::Deployment, orderbook::Orderbook}; use std::{collections::HashMap, str::FromStr, sync::Arc}; -#[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; - #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct ApprovalCalldata { #[cfg_attr(target_family = "wasm", tsify(type = "string"))] token: Address, @@ -40,7 +20,7 @@ pub struct ApprovalCalldata { calldata: Bytes, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(ApprovalCalldata); +impl_all_wasm_traits!(ApprovalCalldata); impl DotrainOrder { fn get_deployment( diff --git a/crates/common/src/dotrain_order/filter.rs b/crates/common/src/dotrain_order/filter.rs index f0f8254b2..e73a39114 100644 --- a/crates/common/src/dotrain_order/filter.rs +++ b/crates/common/src/dotrain_order/filter.rs @@ -2,7 +2,7 @@ use crate::dotrain_order::{DotrainOrder, DotrainOrderError}; pub use rain_metadata::types::authoring::v2::*; use rain_orderbook_app_settings::config_source::ConfigSource; #[cfg(target_family = "wasm")] -use wasm_bindgen::prelude::*; +use rain_orderbook_bindings::wasm_traits::prelude::*; #[cfg_attr(target_family = "wasm", wasm_bindgen)] impl DotrainOrder { diff --git a/crates/common/src/dotrain_order/mod.rs b/crates/common/src/dotrain_order/mod.rs index e1de09409..f4e4c5fc2 100644 --- a/crates/common/src/dotrain_order/mod.rs +++ b/crates/common/src/dotrain_order/mod.rs @@ -14,12 +14,12 @@ use rain_orderbook_app_settings::{ merge::MergeError, Config, ParseConfigSourceError, }; +#[cfg(target_family = "wasm")] +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; use serde::{Deserialize, Serialize}; use std::sync::Arc; use thiserror::Error; use typeshare::typeshare; -#[cfg(target_family = "wasm")] -use wasm_bindgen::prelude::*; pub mod calldata; pub mod filter; diff --git a/crates/common/src/erc20.rs b/crates/common/src/erc20.rs index 9cadcc270..0f87f3821 100644 --- a/crates/common/src/erc20.rs +++ b/crates/common/src/erc20.rs @@ -14,39 +14,21 @@ use alloy_ethers_typecast::{ }; use rain_error_decoding::{AbiDecodeFailedErrors, AbiDecodedErrorType}; use rain_orderbook_bindings::IERC20::{decimalsCall, nameCall, symbolCall}; +#[cfg(target_family = "wasm")] +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; use serde::{Deserialize, Serialize}; use thiserror::Error; use url::Url; -#[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct TokenInfo { pub decimals: u8, pub name: String, pub symbol: String, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(TokenInfo); +impl_all_wasm_traits!(TokenInfo); #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct ERC20 { diff --git a/crates/js_api/src/gui/deposits.rs b/crates/js_api/src/gui/deposits.rs index 9a2ec1ff4..ba07113ca 100644 --- a/crates/js_api/src/gui/deposits.rs +++ b/crates/js_api/src/gui/deposits.rs @@ -1,14 +1,13 @@ use super::*; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct TokenDeposit { pub token: String, pub amount: String, #[tsify(type = "string")] pub address: Address, } -impl_wasm_traits!(TokenDeposit); +impl_all_wasm_traits!(TokenDeposit); #[wasm_bindgen] impl DotrainOrderGui { diff --git a/crates/js_api/src/gui/field_values.rs b/crates/js_api/src/gui/field_values.rs index 0755ef467..2bf91c34f 100644 --- a/crates/js_api/src/gui/field_values.rs +++ b/crates/js_api/src/gui/field_values.rs @@ -1,21 +1,20 @@ use super::*; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)] -#[tsify(into_wasm_abi, from_wasm_abi)] + pub struct FieldValuePair { binding: String, value: PairValue, } -impl_wasm_traits!(FieldValuePair); +impl_all_wasm_traits!(FieldValuePair); #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)] -#[tsify(into_wasm_abi, from_wasm_abi)] #[serde(rename_all = "camelCase")] pub struct PairValue { pub is_preset: bool, pub value: String, } -impl_wasm_traits!(PairValue); +impl_all_wasm_traits!(PairValue); #[wasm_bindgen] impl DotrainOrderGui { diff --git a/crates/js_api/src/gui/mod.rs b/crates/js_api/src/gui/mod.rs index 2e6580a83..e7eaa9d00 100644 --- a/crates/js_api/src/gui/mod.rs +++ b/crates/js_api/src/gui/mod.rs @@ -5,25 +5,15 @@ use flate2::{read::GzDecoder, write::GzEncoder, Compression}; use rain_orderbook_app_settings::gui::{ Gui, GuiDeployment, GuiFieldDefinition, GuiPreset, ParseGuiConfigSourceError, }; -use rain_orderbook_bindings::impl_wasm_traits; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; use rain_orderbook_common::{ dotrain_order::{calldata::DotrainOrderCalldataError, DotrainOrder, DotrainOrderError}, erc20::{TokenInfo, ERC20}, }; use serde::{Deserialize, Serialize}; -use serde_wasm_bindgen::{from_value, to_value}; use std::collections::BTreeMap; use std::io::prelude::*; use thiserror::Error; -use tsify::Tsify; -use wasm_bindgen::{ - convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, - }, - describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}, - prelude::*, -}; mod deposits; mod field_values; diff --git a/crates/js_api/src/gui/order_operations.rs b/crates/js_api/src/gui/order_operations.rs index f63128a65..64f0a43a8 100644 --- a/crates/js_api/src/gui/order_operations.rs +++ b/crates/js_api/src/gui/order_operations.rs @@ -10,14 +10,14 @@ use rain_orderbook_common::{deposit::DepositArgs, transaction::TransactionArgs}; use std::{collections::HashMap, str::FromStr, sync::Arc}; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)] -#[tsify(into_wasm_abi, from_wasm_abi)] + pub struct TokenAllowance { #[tsify(type = "string")] token: Address, #[tsify(type = "string")] allowance: U256, } -impl_wasm_traits!(TokenAllowance); +impl_all_wasm_traits!(TokenAllowance); #[wasm_bindgen] impl DotrainOrderGui { diff --git a/crates/js_api/src/subgraph/order.rs b/crates/js_api/src/subgraph/order.rs index 95d121cb7..ecd50b9ff 100644 --- a/crates/js_api/src/subgraph/order.rs +++ b/crates/js_api/src/subgraph/order.rs @@ -1,12 +1,10 @@ use cynic::Id; +use rain_orderbook_bindings::wasm_traits::prelude::*; use rain_orderbook_subgraph_client::{ types::common::OrdersListFilterArgs, MultiOrderbookSubgraphClient, MultiSubgraphArgs, OrderbookSubgraphClient, OrderbookSubgraphClientError, PaginationArgs, }; use reqwest::Url; -use serde_wasm_bindgen::to_value; -use wasm_bindgen::prelude::*; -use wasm_bindgen::JsValue; /// Fetch all orders from multiple subgraphs /// Returns a list of OrderWithSubgraphName structs diff --git a/crates/js_api/src/subgraph/vault.rs b/crates/js_api/src/subgraph/vault.rs index cbef57261..3a8476ede 100644 --- a/crates/js_api/src/subgraph/vault.rs +++ b/crates/js_api/src/subgraph/vault.rs @@ -1,13 +1,11 @@ use cynic::Id; +use rain_orderbook_bindings::wasm_traits::prelude::*; use rain_orderbook_subgraph_client::types::common::VaultsListFilterArgs; use rain_orderbook_subgraph_client::{ MultiOrderbookSubgraphClient, MultiSubgraphArgs, OrderbookSubgraphClient, OrderbookSubgraphClientError, PaginationArgs, }; use reqwest::Url; -use serde_wasm_bindgen::to_value; -use wasm_bindgen::prelude::*; -use wasm_bindgen::JsValue; /// Fetch all vaults from multiple subgraphs /// Returns a list of VaultWithSubgraphName structs diff --git a/crates/quote/src/js_api/impls.rs b/crates/quote/src/js_api/impls.rs index 516075ac7..de874c0e5 100644 --- a/crates/quote/src/js_api/impls.rs +++ b/crates/quote/src/js_api/impls.rs @@ -6,17 +6,11 @@ use alloy::primitives::{ hex::{encode_prefixed, FromHex}, Address, U256, }; -use rain_orderbook_bindings::impl_wasm_traits; use rain_orderbook_bindings::js_api::Quote; use rain_orderbook_bindings::IOrderBookV4::{ Quote as MainQuote, SignedContextV1 as MainSignedContextV1, }; -use serde_wasm_bindgen::{from_value, to_value}; use std::str::FromStr; -use wasm_bindgen::{ - describe::{inform, WasmDescribeVector, VECTOR}, - JsValue, UnwrapThrowExt, -}; impl From for MainOrderQuoteValue { fn from(value: OrderQuoteValue) -> Self { @@ -161,13 +155,14 @@ impl From for MainBatchOrderQuotesResponse { } } -impl_wasm_traits!(QuoteSpec); -impl_wasm_traits!(QuoteTarget); -impl_wasm_traits!(QuoteResult); -impl_wasm_traits!(BatchQuoteSpec); -impl_wasm_traits!(BatchQuoteTarget); -impl_wasm_traits!(Pair); -impl_wasm_traits!(BatchOrderQuotesResponse); +impl_all_wasm_traits!(Pair); +impl_all_wasm_traits!(QuoteSpec); +impl_all_wasm_traits!(QuoteTarget); +impl_all_wasm_traits!(QuoteResult); +impl_all_wasm_traits!(BatchQuoteSpec); +impl_all_wasm_traits!(OrderQuoteValue); +impl_all_wasm_traits!(BatchQuoteTarget); +impl_all_wasm_traits!(BatchOrderQuotesResponse); #[cfg(test)] mod tests { diff --git a/crates/quote/src/js_api/mod.rs b/crates/quote/src/js_api/mod.rs index 677c4874d..2fccd8c4a 100644 --- a/crates/quote/src/js_api/mod.rs +++ b/crates/quote/src/js_api/mod.rs @@ -7,20 +7,16 @@ use alloy::primitives::{ Address, U256, }; use rain_orderbook_bindings::js_api::{Quote, SignedContextV1}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; use rain_orderbook_subgraph_client::{types::common::Order, utils::make_order_id}; use serde::{Deserialize, Serialize}; -use serde_wasm_bindgen::to_value; use std::str::FromStr; -use tsify::Tsify; -use wasm_bindgen::prelude::*; -use wasm_bindgen::{convert::*, describe::WasmDescribe, JsValue, UnwrapThrowExt}; mod impls; /// Holds quoted order max output and ratio #[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct OrderQuoteValue { pub max_output: String, pub ratio: String, @@ -29,7 +25,6 @@ pub struct OrderQuoteValue { /// A quote target #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct QuoteTarget { pub quote_config: Quote, pub orderbook: String, @@ -38,13 +33,11 @@ pub struct QuoteTarget { /// Batch quote target #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default, Tsify)] #[serde(transparent)] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct BatchQuoteTarget(pub Vec); /// A quote target specifier, where the order details need to be fetched from a /// source (such as subgraph) to build a [QuoteTarget] out of it #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default, Tsify)] -#[tsify(into_wasm_abi, from_wasm_abi)] #[serde(rename_all = "camelCase")] pub struct QuoteSpec { pub order_hash: String, @@ -59,11 +52,9 @@ pub struct QuoteSpec { /// Batch quote spec #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default, Tsify)] #[serde(transparent)] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct BatchQuoteSpec(pub Vec); #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Tsify)] -#[tsify(into_wasm_abi, from_wasm_abi)] #[serde(untagged)] pub enum QuoteResult { Ok(OrderQuoteValue), @@ -180,7 +171,6 @@ pub async fn get_batch_quote_target_from_subgraph( #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Pair { pub pair_name: String, pub input_index: u32, @@ -189,7 +179,6 @@ pub struct Pair { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default, Tsify)] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct BatchOrderQuotesResponse { pub pair: Pair, pub block_number: u64, diff --git a/crates/quote/src/order_quotes.rs b/crates/quote/src/order_quotes.rs index fe2b0c7b7..1b746450b 100644 --- a/crates/quote/src/order_quotes.rs +++ b/crates/quote/src/order_quotes.rs @@ -1,5 +1,3 @@ -use std::str::FromStr; - use crate::{ error::Error, quote::{BatchQuoteTarget, QuoteTarget}, @@ -10,6 +8,7 @@ use alloy_ethers_typecast::transaction::ReadableClient; use rain_orderbook_bindings::IOrderBookV4::{OrderV3, Quote}; use rain_orderbook_subgraph_client::types::common::Order; use serde::{Deserialize, Serialize}; +use std::str::FromStr; use typeshare::typeshare; #[typeshare] diff --git a/crates/settings/src/deployer.rs b/crates/settings/src/deployer.rs index c35670513..6b5536a8d 100644 --- a/crates/settings/src/deployer.rs +++ b/crates/settings/src/deployer.rs @@ -6,28 +6,11 @@ use thiserror::Error; use typeshare::typeshare; #[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct Deployer { #[typeshare(typescript(type = "string"))] #[cfg_attr(target_family = "wasm", tsify(type = "string"))] @@ -46,7 +29,7 @@ impl Deployer { } } #[cfg(target_family = "wasm")] -impl_wasm_traits!(Deployer); +impl_all_wasm_traits!(Deployer); #[derive(Error, Debug, PartialEq)] pub enum ParseDeployerConfigSourceError { diff --git a/crates/settings/src/deployment.rs b/crates/settings/src/deployment.rs index 69b8efe0c..794b79fc9 100644 --- a/crates/settings/src/deployment.rs +++ b/crates/settings/src/deployment.rs @@ -5,29 +5,12 @@ use thiserror::Error; use typeshare::typeshare; #[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; #[typeshare] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "kebab-case")] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct Deployment { #[typeshare(typescript(type = "Scenario"))] pub scenario: Arc, @@ -35,7 +18,7 @@ pub struct Deployment { pub order: Arc, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(Deployment); +impl_all_wasm_traits!(Deployment); #[derive(Error, Debug, PartialEq)] pub enum ParseDeploymentConfigSourceError { diff --git a/crates/settings/src/gui.rs b/crates/settings/src/gui.rs index b2c5ab148..f9eedd3bf 100644 --- a/crates/settings/src/gui.rs +++ b/crates/settings/src/gui.rs @@ -6,36 +6,20 @@ use thiserror::Error; use typeshare::typeshare; #[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; // Config source for Gui - #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "kebab-case")] pub struct GuiPresetSource { #[serde(skip_serializing_if = "Option::is_none")] pub name: Option, pub value: String, } +#[cfg(target_family = "wasm")] +impl_all_wasm_traits!(GuiPresetSource); #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] @@ -169,11 +153,7 @@ pub enum ParseGuiConfigSourceError { #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct GuiPreset { pub id: String, #[typeshare(typescript(type = "string"))] @@ -181,15 +161,11 @@ pub struct GuiPreset { pub value: String, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(GuiPreset); +impl_all_wasm_traits!(GuiPreset); #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct GuiDeposit { #[typeshare(typescript(type = "Token"))] #[cfg_attr(target_family = "wasm", tsify(type = "Erc20"))] @@ -198,14 +174,12 @@ pub struct GuiDeposit { #[cfg_attr(target_family = "wasm", tsify(type = "string[]"))] pub presets: Vec, } +#[cfg(target_family = "wasm")] +impl_all_wasm_traits!(GuiDeposit); #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct GuiDeployment { #[typeshare(typescript(type = "Deployment"))] pub deployment: Arc, @@ -215,14 +189,12 @@ pub struct GuiDeployment { pub deposits: Vec, pub fields: Vec, } +#[cfg(target_family = "wasm")] +impl_all_wasm_traits!(GuiDeployment); #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct GuiFieldDefinition { pub binding: String, pub name: String, @@ -230,20 +202,18 @@ pub struct GuiFieldDefinition { pub presets: Vec, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(GuiFieldDefinition); +impl_all_wasm_traits!(GuiFieldDefinition); #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct Gui { pub name: String, pub description: String, pub deployments: Vec, } +#[cfg(target_family = "wasm")] +impl_all_wasm_traits!(Gui); #[cfg(test)] mod tests { diff --git a/crates/settings/src/network.rs b/crates/settings/src/network.rs index 6984968c7..7fd297220 100644 --- a/crates/settings/src/network.rs +++ b/crates/settings/src/network.rs @@ -6,28 +6,11 @@ use typeshare::typeshare; use url::{ParseError, Url}; #[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "kebab-case")] pub struct Network { pub name: String, @@ -54,7 +37,7 @@ impl Network { } } #[cfg(target_family = "wasm")] -impl_wasm_traits!(Network); +impl_all_wasm_traits!(Network); #[derive(Error, Debug, PartialEq)] pub enum ParseNetworkConfigSourceError { diff --git a/crates/settings/src/order.rs b/crates/settings/src/order.rs index 180676ae3..37de0bb10 100644 --- a/crates/settings/src/order.rs +++ b/crates/settings/src/order.rs @@ -6,28 +6,11 @@ use thiserror::Error; use typeshare::typeshare; #[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; #[typeshare] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "kebab-case")] pub struct OrderIO { #[typeshare(typescript(type = "Token"))] @@ -37,15 +20,11 @@ pub struct OrderIO { pub vault_id: Option, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(OrderIO); +impl_all_wasm_traits!(OrderIO); #[typeshare] #[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "kebab-case")] pub struct Order { #[typeshare(typescript(type = "OrderIO[]"))] @@ -62,7 +41,7 @@ pub struct Order { pub orderbook: Option>, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(Order); +impl_all_wasm_traits!(Order); #[derive(Error, Debug, PartialEq)] pub enum ParseOrderConfigSourceError { diff --git a/crates/settings/src/scenario.rs b/crates/settings/src/scenario.rs index f5e32ae5a..6865ce758 100644 --- a/crates/settings/src/scenario.rs +++ b/crates/settings/src/scenario.rs @@ -6,28 +6,11 @@ use thiserror::Error; use typeshare::typeshare; #[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; #[typeshare] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "kebab-case")] pub struct Scenario { pub name: String, @@ -41,7 +24,7 @@ pub struct Scenario { pub deployer: Arc, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(Scenario); +impl_all_wasm_traits!(Scenario); #[derive(Error, Debug, PartialEq)] pub enum ParseScenarioConfigSourceError { diff --git a/crates/settings/src/token.rs b/crates/settings/src/token.rs index e10a2a885..d59139df5 100644 --- a/crates/settings/src/token.rs +++ b/crates/settings/src/token.rs @@ -6,29 +6,12 @@ use thiserror::Error; use typeshare::typeshare; #[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use tsify::Tsify; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; #[typeshare] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[serde(rename_all = "kebab-case")] -#[cfg_attr( - target_family = "wasm", - derive(Tsify), - tsify(into_wasm_abi, from_wasm_abi) -)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct Token { #[typeshare(typescript(type = "Network"))] pub network: Arc, @@ -40,7 +23,7 @@ pub struct Token { pub symbol: Option, } #[cfg(target_family = "wasm")] -impl_wasm_traits!(Token); +impl_all_wasm_traits!(Token); #[derive(Error, Debug, PartialEq)] pub enum ParseTokenConfigSourceError { diff --git a/crates/subgraph/Cargo.toml b/crates/subgraph/Cargo.toml index d5758b98e..635d08ad9 100644 --- a/crates/subgraph/Cargo.toml +++ b/crates/subgraph/Cargo.toml @@ -18,15 +18,17 @@ serde_json = { workspace = true } alloy = { workspace = true, features = ["rand"] } rain_orderbook_bindings = { workspace = true } chrono = { workspace = true } -url = { workspace = true } +url = { workspace = true, features = ["serde"] } cynic-introspection = "3.7.3" futures = "0.3.17" -tsify = { version = "0.4.5", default-features = false, features = ["js", "wasm-bindgen"] } -wasm-bindgen = { version = "0.2.92" } + +[target.'cfg(target_family = "wasm")'.dependencies] js-sys = { version = "0.3.69" } +wasm-bindgen = { version = "0.2.92" } serde-wasm-bindgen = { version = "0.6.5" } +tsify = { version = "0.4.5", default-features = false, features = ["js", "wasm-bindgen"] } -[dev-dependencies] +[target.'cfg(not(target_family = "wasm"))'.dev-dependencies] insta = { workspace = true } tokio = { workspace = true, features = ["full"] } httpmock = "0.7.0" diff --git a/crates/subgraph/src/multi_orderbook_client.rs b/crates/subgraph/src/multi_orderbook_client.rs index 8eb5bff87..4306f9584 100644 --- a/crates/subgraph/src/multi_orderbook_client.rs +++ b/crates/subgraph/src/multi_orderbook_client.rs @@ -1,38 +1,30 @@ -use futures::future::join_all; -use reqwest::Url; -use serde::{Deserialize, Serialize}; -use tsify::Tsify; - use crate::{ types::common::{ OrderWithSubgraphName, OrdersListFilterArgs, VaultWithSubgraphName, VaultsListFilterArgs, }, OrderbookSubgraphClient, OrderbookSubgraphClientError, PaginationArgs, }; - -#[cfg(target_family = "wasm")] -use rain_orderbook_bindings::impl_wasm_traits; -#[cfg(target_family = "wasm")] -use serde_wasm_bindgen::{from_value, to_value}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::convert::{ - js_value_vector_from_abi, js_value_vector_into_abi, FromWasmAbi, IntoWasmAbi, - LongRefFromWasmAbi, RefFromWasmAbi, TryFromJsValue, VectorFromWasmAbi, VectorIntoWasmAbi, -}; -#[cfg(target_family = "wasm")] -use wasm_bindgen::describe::{inform, WasmDescribe, WasmDescribeVector, VECTOR}; +use futures::future::join_all; +use reqwest::Url; +use serde::{Deserialize, Serialize}; #[cfg(target_family = "wasm")] -use wasm_bindgen::{JsValue, UnwrapThrowExt}; +use tsify::Tsify; -#[derive(Debug, Clone, Serialize, Deserialize, Tsify)] -#[tsify(into_wasm_abi, from_wasm_abi)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] pub struct MultiSubgraphArgs { - #[tsify(type = "string")] + #[cfg_attr(target_family = "wasm", tsify(type = "string"))] url: Url, name: String, } + #[cfg(target_family = "wasm")] -impl_wasm_traits!(MultiSubgraphArgs); +mod wasm_impls { + use super::*; + use rain_orderbook_bindings::impl_all_wasm_traits; + + impl_all_wasm_traits!(MultiSubgraphArgs); +} pub struct MultiOrderbookSubgraphClient { subgraphs: Vec, diff --git a/crates/subgraph/src/pagination.rs b/crates/subgraph/src/pagination.rs index a3ec4518a..7680b28ba 100644 --- a/crates/subgraph/src/pagination.rs +++ b/crates/subgraph/src/pagination.rs @@ -2,18 +2,27 @@ use crate::{cynic_client::CynicClientError, utils::slice_list}; use serde::{Deserialize, Serialize}; use std::num::TryFromIntError; use thiserror::Error; +#[cfg(target_family = "wasm")] use tsify::Tsify; use typeshare::typeshare; -#[derive(Clone, Serialize, Deserialize, Debug, Tsify)] +#[derive(Clone, Serialize, Deserialize, Debug)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] #[serde(rename_all = "camelCase")] pub struct PaginationArgs { pub page: u16, pub page_size: u16, } +#[cfg(target_family = "wasm")] +mod wasm_impls { + use super::*; + use rain_orderbook_bindings::impl_all_wasm_traits; + + impl_all_wasm_traits!(PaginationArgs); +} + #[derive(Clone, Serialize, Deserialize, Debug)] pub struct QueryPaginationVariables { pub skip: Option, diff --git a/crates/subgraph/src/types/common.rs b/crates/subgraph/src/types/common.rs index 0db2de374..cd09b1aa5 100644 --- a/crates/subgraph/src/types/common.rs +++ b/crates/subgraph/src/types/common.rs @@ -1,6 +1,7 @@ use crate::schema; +#[cfg(target_family = "wasm")] +use rain_orderbook_bindings::{impl_all_wasm_traits, wasm_traits::prelude::*}; use serde::{Deserialize, Serialize}; -use tsify::Tsify; use typeshare::typeshare; #[derive(cynic::QueryVariables, Debug, Clone)] @@ -9,10 +10,10 @@ pub struct IdQueryVariables<'a> { pub id: &'a cynic::Id, } -#[derive(Debug, Clone, Serialize, Deserialize, Tsify)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "camelCase")] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct OrdersListFilterArgs { pub owners: Vec, pub active: Option, @@ -65,21 +66,21 @@ pub struct PaginationWithTimestampQueryVariables { pub timestamp_lte: Option, } -#[derive(cynic::QueryFragment, Debug, Serialize, Clone, Tsify)] +#[derive(cynic::QueryFragment, Debug, Serialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Orderbook { pub id: Bytes, } #[typeshare] -#[tsify::declare] +#[cfg_attr(target_family = "wasm", tsify::declare)] pub type RainMetaV1 = Bytes; -#[derive(cynic::QueryFragment, Debug, Serialize, Clone, Tsify)] +#[derive(cynic::QueryFragment, Debug, Serialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Order { pub id: Bytes, pub order_bytes: Bytes, @@ -89,18 +90,18 @@ pub struct Order { pub inputs: Vec, pub orderbook: Orderbook, pub active: bool, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub timestamp_added: BigInt, - #[tsify(type = "string | undefined")] + #[cfg_attr(target_family = "wasm", tsify(type = "string | undefined | null"))] pub meta: Option, pub add_events: Vec, pub trades: Vec, } -#[derive(Debug, Serialize, Deserialize, Clone, Tsify)] +#[derive(Debug, Serialize, Deserialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct OrderWithSubgraphName { pub order: Order, pub subgraph_name: String, @@ -115,21 +116,21 @@ pub struct TradeStructPartialOrder { pub order_hash: Bytes, } -#[derive(cynic::QueryFragment, Debug, Serialize, Clone, Tsify)] +#[derive(cynic::QueryFragment, Debug, Serialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[cynic(graphql_type = "Order")] #[serde(rename_all = "camelCase")] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct OrderAsIO { pub id: Bytes, pub order_hash: Bytes, pub active: bool, } -#[derive(Debug, Clone, Serialize, Deserialize, Tsify)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(rename_all = "camelCase")] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct VaultsListFilterArgs { pub owners: Vec, pub hide_zero_balance: bool, @@ -154,16 +155,16 @@ pub struct VaultsListQueryVariables { pub filters: Option, } -#[derive(cynic::QueryFragment, Debug, Serialize, Clone, Tsify)] +#[derive(cynic::QueryFragment, Debug, Serialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Vault { pub id: Bytes, pub owner: Bytes, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub vault_id: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub balance: BigInt, pub token: Erc20, pub orderbook: Orderbook, @@ -176,22 +177,22 @@ pub struct Vault { pub balance_changes: Vec, } -#[derive(Debug, Serialize, Deserialize, Clone, Tsify)] +#[derive(Debug, Serialize, Deserialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct VaultWithSubgraphName { pub vault: Vault, pub subgraph_name: String, } -#[derive(cynic::QueryFragment, Debug, Clone, Serialize, Tsify)] +#[derive(cynic::QueryFragment, Debug, Clone, Serialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[cynic(graphql_type = "Vault")] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct VaultBalanceChangeVault { pub id: Bytes, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub vault_id: BigInt, pub token: Erc20, } @@ -211,11 +212,11 @@ pub struct VaultBalanceChangeUnwrapped { pub orderbook: Orderbook, } -#[derive(cynic::InlineFragments, Debug, Clone, Serialize, Tsify)] +#[derive(cynic::InlineFragments, Debug, Clone, Serialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[serde(tag = "__typename", content = "data")] #[serde(rename_all = "camelCase")] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub enum VaultBalanceChange { Withdrawal(Withdrawal), TradeVaultBalanceChange(TradeVaultBalanceChange), @@ -225,81 +226,81 @@ pub enum VaultBalanceChange { Unknown, } -#[derive(cynic::QueryFragment, Debug, Clone, Serialize, Tsify)] +#[derive(cynic::QueryFragment, Debug, Clone, Serialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Deposit { pub id: Bytes, pub __typename: String, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub amount: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub new_vault_balance: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub old_vault_balance: BigInt, pub vault: VaultBalanceChangeVault, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub timestamp: BigInt, pub transaction: Transaction, pub orderbook: Orderbook, } -#[derive(cynic::QueryFragment, Debug, Clone, Serialize, Tsify)] +#[derive(cynic::QueryFragment, Debug, Clone, Serialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Withdrawal { pub id: Bytes, pub __typename: String, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub amount: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub new_vault_balance: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub old_vault_balance: BigInt, pub vault: VaultBalanceChangeVault, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub timestamp: BigInt, pub transaction: Transaction, pub orderbook: Orderbook, } -#[derive(cynic::QueryFragment, Debug, Clone, Serialize, Tsify)] +#[derive(cynic::QueryFragment, Debug, Clone, Serialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct TradeVaultBalanceChange { pub id: Bytes, pub __typename: String, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub amount: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub new_vault_balance: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub old_vault_balance: BigInt, pub vault: VaultBalanceChangeVault, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub timestamp: BigInt, pub transaction: Transaction, pub orderbook: Orderbook, } -#[derive(cynic::QueryFragment, Debug, Clone, Serialize, Tsify)] +#[derive(cynic::QueryFragment, Debug, Clone, Serialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct ClearBounty { pub id: Bytes, pub __typename: String, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub amount: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub new_vault_balance: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub old_vault_balance: BigInt, pub vault: VaultBalanceChangeVault, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub timestamp: BigInt, pub transaction: Transaction, pub orderbook: Orderbook, @@ -326,56 +327,55 @@ pub struct Trade { pub orderbook: Orderbook, } -#[derive(cynic::QueryFragment, Debug, Clone, Serialize, Tsify)] +#[derive(cynic::QueryFragment, Debug, Clone, Serialize)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[cynic(graphql_type = "Trade")] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct OrderStructPartialTrade { pub id: Bytes, } -#[derive(cynic::QueryFragment, Debug, Serialize, Clone, PartialEq, Tsify)] +#[derive(cynic::QueryFragment, Debug, Serialize, Clone, PartialEq)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[cynic(graphql_type = "ERC20")] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Erc20 { pub id: Bytes, pub address: Bytes, pub name: Option, pub symbol: Option, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub decimals: Option, } -#[derive(cynic::QueryFragment, Debug, Serialize, Clone, Tsify)] +#[derive(cynic::QueryFragment, Debug, Serialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] #[serde(rename_all = "camelCase")] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Transaction { pub id: Bytes, pub from: Bytes, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub block_number: BigInt, - #[tsify(type = "SgBigInt")] + #[cfg_attr(target_family = "wasm", tsify(type = "SgBigInt"))] pub timestamp: BigInt, } -#[derive(cynic::QueryFragment, Debug, Serialize, Clone, Tsify)] +#[derive(cynic::QueryFragment, Debug, Serialize, Clone)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct AddOrder { pub transaction: Transaction, } -#[derive(cynic::Scalar, Debug, Clone, PartialEq, Tsify)] +#[derive(cynic::Scalar, Debug, Clone, PartialEq)] +#[cfg_attr(target_family = "wasm", derive(Tsify), serde(rename = "SgBigInt"))] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] -#[serde(rename = "SgBigInt")] pub struct BigInt(pub String); -#[derive(cynic::Scalar, Debug, Clone, PartialEq, Tsify)] +#[derive(cynic::Scalar, Debug, Clone, PartialEq)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] #[typeshare] -#[tsify(into_wasm_abi, from_wasm_abi)] pub struct Bytes(pub String); #[derive(cynic::Enum, Clone, Copy, Debug)] @@ -562,3 +562,26 @@ pub enum VaultOrderBy { #[cynic(rename = "balanceChanges")] BalanceChanges, } + +#[cfg(target_family = "wasm")] +mod impls { + use super::*; + + impl_all_wasm_traits!(Order); + impl_all_wasm_traits!(Vault); + impl_all_wasm_traits!(AddOrder); + impl_all_wasm_traits!(OrderAsIO); + impl_all_wasm_traits!(VaultBalanceChangeVault); + impl_all_wasm_traits!(VaultBalanceChange); + impl_all_wasm_traits!(Withdrawal); + impl_all_wasm_traits!(TradeVaultBalanceChange); + impl_all_wasm_traits!(Deposit); + impl_all_wasm_traits!(ClearBounty); + impl_all_wasm_traits!(OrderStructPartialTrade); + impl_all_wasm_traits!(Erc20); + impl_all_wasm_traits!(Transaction); + impl_all_wasm_traits!(BigInt); + impl_all_wasm_traits!(Bytes); + impl_all_wasm_traits!(OrdersListFilterArgs); + impl_all_wasm_traits!(VaultsListFilterArgs); +} diff --git a/crates/subgraph/src/types/impls.rs b/crates/subgraph/src/types/impls.rs deleted file mode 100644 index d801d4619..000000000 --- a/crates/subgraph/src/types/impls.rs +++ /dev/null @@ -1,31 +0,0 @@ -#[cfg(target_family = "wasm")] -mod js_api { - use super::super::common::{ - AddOrder, BigInt, Bytes, ClearBounty, Deposit, Erc20, Order, OrderAsIO, - OrderStructPartialTrade, TradeVaultBalanceChange, Transaction, Vault, VaultBalanceChange, - VaultBalanceChangeVault, Withdrawal, - }; - use rain_orderbook_bindings::impl_wasm_traits; - use serde_wasm_bindgen::{from_value, to_value}; - use wasm_bindgen::{convert::*, describe::WasmDescribe}; - use wasm_bindgen::{ - describe::{inform, WasmDescribeVector, VECTOR}, - JsValue, UnwrapThrowExt, - }; - - impl_wasm_traits!(Order); - impl_wasm_traits!(Vault); - impl_wasm_traits!(AddOrder); - impl_wasm_traits!(OrderAsIO); - impl_wasm_traits!(VaultBalanceChangeVault); - impl_wasm_traits!(VaultBalanceChange); - impl_wasm_traits!(Withdrawal); - impl_wasm_traits!(TradeVaultBalanceChange); - impl_wasm_traits!(Deposit); - impl_wasm_traits!(ClearBounty); - impl_wasm_traits!(OrderStructPartialTrade); - impl_wasm_traits!(Erc20); - impl_wasm_traits!(Transaction); - impl_wasm_traits!(BigInt); - impl_wasm_traits!(Bytes); -} diff --git a/crates/subgraph/src/types/mod.rs b/crates/subgraph/src/types/mod.rs index b653da9b9..88b092954 100644 --- a/crates/subgraph/src/types/mod.rs +++ b/crates/subgraph/src/types/mod.rs @@ -1,5 +1,4 @@ pub mod common; -mod impls; pub mod order; pub mod order_detail_traits; pub mod order_trade; diff --git a/tauri-app/src-tauri/src/commands/order.rs b/tauri-app/src-tauri/src/commands/order.rs index f3d916139..679a735a3 100644 --- a/tauri-app/src-tauri/src/commands/order.rs +++ b/tauri-app/src-tauri/src/commands/order.rs @@ -7,8 +7,6 @@ use rain_orderbook_common::{ remove_order::RemoveOrderArgs, subgraph::SubgraphArgs, transaction::TransactionArgs, types::FlattenError, types::OrderDetailExtended, types::OrderFlattened, }; -use rain_orderbook_subgraph_client::{types::common::*, PaginationArgs}; -use rain_orderbook_subgraph_client::{MultiOrderbookSubgraphClient, MultiSubgraphArgs}; use std::fs; use std::path::PathBuf; use tauri::AppHandle;