diff --git a/.github/workflows/tauri-release.yml b/.github/workflows/tauri-release.yml index 1259c16b5..a84fcc80c 100644 --- a/.github/workflows/tauri-release.yml +++ b/.github/workflows/tauri-release.yml @@ -66,6 +66,8 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@v2 - run: ./prep-all.sh + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - run: nix develop .#tauri-shell -c ob-tauri-unit-test diff --git a/.github/workflows/tauri.yaml b/.github/workflows/tauri.yaml index 0a1540a00..724b339c6 100644 --- a/.github/workflows/tauri.yaml +++ b/.github/workflows/tauri.yaml @@ -58,6 +58,8 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@v2 - run: ./prep-all.sh + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - run: nix develop .#tauri-shell -c ob-tauri-unit-test diff --git a/.github/workflows/test-ui-components.yaml b/.github/workflows/test-ui-components.yaml index a47f0fb6c..ed78f1f04 100644 --- a/.github/workflows/test-ui-components.yaml +++ b/.github/workflows/test-ui-components.yaml @@ -20,6 +20,8 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@main - run: ./prep-all.sh + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - run: nix develop -c npm run svelte-lint-format-check working-directory: packages/ui-components diff --git a/.github/workflows/test-webapp.yaml b/.github/workflows/test-webapp.yaml index 2da6e78a2..013e8f5f3 100644 --- a/.github/workflows/test-webapp.yaml +++ b/.github/workflows/test-webapp.yaml @@ -20,8 +20,15 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@main - run: ./prep-all.sh + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - run: nix develop -c npm run svelte-lint-format-check working-directory: packages/webapp + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} + - run: nix develop -c npm run test working-directory: packages/webapp + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} diff --git a/.github/workflows/vercel-preview.yaml b/.github/workflows/vercel-preview.yaml index 458fa344d..4e9f198be 100644 --- a/.github/workflows/vercel-preview.yaml +++ b/.github/workflows/vercel-preview.yaml @@ -21,9 +21,13 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@main - run: ./prep-all.sh + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - run: nix develop .#webapp-shell -c npm run build working-directory: packages/webapp + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - name: Install Vercel CLI run: npm install --global vercel@canary diff --git a/.github/workflows/vercel-prod.yaml b/.github/workflows/vercel-prod.yaml index 203f7841b..f8cf878ab 100644 --- a/.github/workflows/vercel-prod.yaml +++ b/.github/workflows/vercel-prod.yaml @@ -21,9 +21,13 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@main - run: ./prep-all.sh + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - run: nix develop .#webapp-shell -c npm run build working-directory: packages/webapp + env: + PUBLIC_WALLETCONNECT_PROJECT_ID: ${{ secrets.WALLETCONNECT_PROJECT_ID }} - name: Install Vercel CLI run: npm install --global vercel@canary diff --git a/crates/js_api/src/gui/mod.rs b/crates/js_api/src/gui/mod.rs index bf0a62fbe..c2aff5f81 100644 --- a/crates/js_api/src/gui/mod.rs +++ b/crates/js_api/src/gui/mod.rs @@ -4,7 +4,10 @@ use base64::{engine::general_purpose::URL_SAFE, Engine}; use flate2::{read::GzDecoder, write::GzEncoder, Compression}; use rain_orderbook_app_settings::{ deployment::Deployment, - gui::{Gui, GuiDeployment, GuiFieldDefinition, GuiPreset, ParseGuiConfigSourceError}, + gui::{ + Gui, GuiDeployment, GuiFieldDefinition, GuiPreset, NameAndDescription, + ParseGuiConfigSourceError, + }, network::Network, order::Order, yaml::YamlError, @@ -39,11 +42,8 @@ pub struct TokenInfo { impl_all_wasm_traits!(TokenInfo); #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)] -pub struct GuiDetails { - name: String, - description: String, -} -impl_all_wasm_traits!(GuiDetails); +pub struct DeploymentDetails(BTreeMap); +impl_all_wasm_traits!(DeploymentDetails); #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] #[wasm_bindgen] @@ -87,7 +87,7 @@ impl DotrainOrderGui { let gui = self .dotrain_order .dotrain_yaml() - .get_gui()? + .get_gui(Some(self.selected_deployment.clone()))? .ok_or(GuiError::GuiConfigNotFound)?; Ok(gui) } @@ -146,11 +146,19 @@ impl DotrainOrderGui { Ok(token_info) } - #[wasm_bindgen(js_name = "getGuiDetails")] - pub fn get_gui_details(&self) -> Result { - let (name, description) = - Gui::parse_gui_details(self.dotrain_order.dotrain_yaml().documents.clone())?; - Ok(GuiDetails { name, description }) + #[wasm_bindgen(js_name = "getStrategyDetails")] + pub async fn get_strategy_details(dotrain: String) -> Result { + let dotrain_order = DotrainOrder::new(dotrain, None).await?; + let details = Gui::parse_strategy_details(dotrain_order.dotrain_yaml().documents.clone())?; + Ok(details) + } + + #[wasm_bindgen(js_name = "getDeploymentDetails")] + pub async fn get_deployment_details(dotrain: String) -> Result { + let dotrain_order = DotrainOrder::new(dotrain, None).await?; + let deployment_details = + Gui::parse_deployment_details(dotrain_order.dotrain_yaml().documents.clone())?; + Ok(DeploymentDetails(deployment_details.into_iter().collect())) } } diff --git a/crates/settings/src/deployment.rs b/crates/settings/src/deployment.rs index f7ad9a202..f2140abff 100644 --- a/crates/settings/src/deployment.rs +++ b/crates/settings/src/deployment.rs @@ -8,7 +8,8 @@ use strict_yaml_rust::StrictYaml; use thiserror::Error; use typeshare::typeshare; use yaml::{ - context::Context, default_document, require_hash, require_string, YamlError, YamlParsableHash, + context::{Context, GuiContextTrait}, + default_document, require_hash, require_string, YamlError, YamlParsableHash, }; #[cfg(target_family = "wasm")] @@ -59,8 +60,6 @@ impl YamlParsableHash for Deployment { ) -> Result, YamlError> { let mut deployments = HashMap::new(); - let orders = Order::parse_all_from_yaml(documents.clone(), context)?; - for document in &documents { let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; @@ -68,6 +67,16 @@ impl YamlParsableHash for Deployment { for (key_yaml, deployment_yaml) in deployments_hash { let deployment_key = key_yaml.as_str().unwrap_or_default().to_string(); + if let Some(context) = context { + if let Some(current_deployment) = context.get_current_deployment() { + if current_deployment != &deployment_key { + continue; + } + } + } + + let mut context = Context::from_context(context); + let order_key = require_string( deployment_yaml, Some("order"), @@ -75,12 +84,10 @@ impl YamlParsableHash for Deployment { "order string missing in deployment: {deployment_key}" )), )?; - let order = orders - .get(&order_key) - .ok_or_else(|| YamlError::KeyNotFound(order_key.clone()))? - .clone(); + context.add_current_order(order_key.clone()); - let mut context = Context::new(); + let order = + Order::parse_from_yaml(documents.clone(), &order_key, Some(&context))?; context.add_order(Arc::new(order.clone())); let scenario = Scenario::parse_from_yaml( diff --git a/crates/settings/src/gui.rs b/crates/settings/src/gui.rs index e89cfee36..6b31af3ec 100644 --- a/crates/settings/src/gui.rs +++ b/crates/settings/src/gui.rs @@ -1,7 +1,8 @@ use crate::{ yaml::{ - context::Context, default_document, get_hash_value, optional_hash, optional_string, - optional_vec, require_string, require_vec, YamlError, YamlParsableHash, YamlParseableValue, + context::{Context, GuiContextTrait}, + default_document, get_hash_value, optional_hash, optional_string, optional_vec, + require_string, require_vec, YamlError, YamlParsableHash, YamlParseableValue, }, Deployment, Token, TokenRef, }; @@ -248,6 +249,15 @@ pub struct Gui { #[cfg(target_family = "wasm")] impl_all_wasm_traits!(Gui); +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +#[cfg_attr(target_family = "wasm", derive(Tsify))] +pub struct NameAndDescription { + pub name: String, + pub description: String, +} +#[cfg(target_family = "wasm")] +impl_all_wasm_traits!(NameAndDescription); + impl Gui { pub fn parse_deployment_keys( documents: Vec>>, @@ -309,9 +319,9 @@ impl Gui { Ok(None) } - pub fn parse_gui_details( + pub fn parse_strategy_details( documents: Vec>>, - ) -> Result<(String, String), YamlError> { + ) -> Result { for document in documents { let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; @@ -332,12 +342,59 @@ impl Gui { Some("description field must be a string in gui".to_string()), )?; - return Ok((name, description)); + return Ok(NameAndDescription { name, description }); } } Err(YamlError::ParseError("gui details not found".to_string())) } + pub fn parse_deployment_details( + documents: Vec>>, + ) -> Result, YamlError> { + let mut deployment_details = HashMap::new(); + + for document in documents { + let document_read = document.read().map_err(|_| YamlError::ReadLockError)?; + + if let Some(gui) = optional_hash(&document_read, "gui") { + let deployments = gui + .get(&StrictYaml::String("deployments".to_string())) + .ok_or(YamlError::ParseError( + "deployments field missing in gui".to_string(), + ))? + .as_hash() + .ok_or(YamlError::ParseError( + "deployments field must be a map in gui".to_string(), + ))?; + + for (key_yaml, deployment_yaml) in deployments { + let deployment_key = key_yaml.as_str().unwrap_or_default().to_string(); + + let name = require_string( + deployment_yaml, + Some("name"), + Some(format!( + "name string missing in gui deployment: {deployment_key}" + )), + )?; + + let description = require_string( + deployment_yaml, + Some("description"), + Some(format!( + "description string missing in gui deployment: {deployment_key}" + )), + )?; + + deployment_details + .insert(deployment_key, NameAndDescription { name, description }); + } + } + } + + Ok(deployment_details) + } + pub fn parse_field_presets( documents: Vec>>, deployment_key: &str, @@ -421,7 +478,7 @@ impl YamlParseableValue for Gui { fn parse_from_yaml_optional( documents: Vec>>, - _: Option<&Context>, + context: Option<&Context>, ) -> Result, YamlError> { let mut gui_res: Option = None; let mut gui_deployments_res: HashMap = HashMap::new(); @@ -469,7 +526,15 @@ impl YamlParseableValue for Gui { for (deployment_name, deployment_yaml) in deployments { let deployment_name = deployment_name.as_str().unwrap_or_default().to_string(); - let mut context = Context::new(); + if let Some(context) = context { + if let Some(current_deployment) = context.get_current_deployment() { + if current_deployment != &deployment_name { + continue; + } + } + } + + let mut context = Context::from_context(context); let select_tokens = match optional_vec(deployment_yaml, "select-tokens") { Some(tokens) => Some( diff --git a/crates/settings/src/order.rs b/crates/settings/src/order.rs index a513ab961..05fffc709 100644 --- a/crates/settings/src/order.rs +++ b/crates/settings/src/order.rs @@ -10,7 +10,7 @@ use strict_yaml_rust::StrictYaml; use thiserror::Error; use typeshare::typeshare; use yaml::{ - context::{Context, SelectTokensContext}, + context::{Context, GuiContextTrait, SelectTokensContext}, default_document, optional_string, require_hash, require_string, require_vec, YamlError, YamlParsableHash, }; @@ -367,6 +367,14 @@ impl YamlParsableHash for Order { for (key_yaml, order_yaml) in orders_hash { let order_key = key_yaml.as_str().unwrap_or_default().to_string(); + if let Some(context) = context { + if let Some(current_order) = context.get_current_order() { + if current_order != &order_key { + continue; + } + } + } + let mut network: Option> = None; let deployer = match optional_string(order_yaml, "deployer") { diff --git a/crates/settings/src/yaml/context.rs b/crates/settings/src/yaml/context.rs index bc2cd88eb..2eb528a13 100644 --- a/crates/settings/src/yaml/context.rs +++ b/crates/settings/src/yaml/context.rs @@ -2,10 +2,17 @@ use crate::{Order, OrderIO, Token}; use std::sync::Arc; use thiserror::Error; +#[derive(Debug, Clone, Default)] +pub struct GuiContext { + pub current_deployment: Option, + pub current_order: Option, +} + #[derive(Debug, Clone, Default)] pub struct Context { pub order: Option>, pub select_tokens: Option>, + pub gui_context: Option, } #[derive(Error, Debug, PartialEq)] @@ -101,14 +108,45 @@ impl OrderContext for Context { } } +pub trait GuiContextTrait { + fn get_current_deployment(&self) -> Option<&String>; + + fn get_current_order(&self) -> Option<&String>; +} + +impl GuiContextTrait for Context { + fn get_current_deployment(&self) -> Option<&String> { + self.gui_context + .as_ref() + .and_then(|gui_context| gui_context.current_deployment.as_ref()) + } + + fn get_current_order(&self) -> Option<&String> { + self.gui_context + .as_ref() + .and_then(|gui_context| gui_context.current_order.as_ref()) + } +} + impl Context { pub fn new() -> Self { Self { order: None, select_tokens: None, + gui_context: None, } } + pub fn from_context(context: Option<&Context>) -> Self { + let mut new_context = Self::new(); + if let Some(context) = context { + new_context.order.clone_from(&context.order); + new_context.select_tokens.clone_from(&context.select_tokens); + new_context.gui_context.clone_from(&context.gui_context); + } + new_context + } + pub fn add_order(&mut self, order: Arc) -> &mut Self { self.order = Some(order); self @@ -119,6 +157,22 @@ impl Context { self } + pub fn add_current_deployment(&mut self, deployment: String) -> &mut Self { + self.gui_context = Some(GuiContext { + current_deployment: Some(deployment), + current_order: None, + }); + self + } + + pub fn add_current_order(&mut self, order: String) -> &mut Self { + self.gui_context = Some(GuiContext { + current_deployment: None, + current_order: Some(order), + }); + self + } + fn resolve_path(&self, path: &str) -> Result { let parts: Vec<&str> = path.split('.').collect(); diff --git a/crates/settings/src/yaml/dotrain.rs b/crates/settings/src/yaml/dotrain.rs index 9b69700e9..8927211e0 100644 --- a/crates/settings/src/yaml/dotrain.rs +++ b/crates/settings/src/yaml/dotrain.rs @@ -75,8 +75,12 @@ impl DotrainYaml { Deployment::parse_from_yaml(self.documents.clone(), key, None) } - pub fn get_gui(&self) -> Result, YamlError> { - Gui::parse_from_yaml_optional(self.documents.clone(), None) + pub fn get_gui(&self, current_deployment: Option) -> Result, YamlError> { + let mut context = Context::new(); + if let Some(deployment) = current_deployment { + context.add_current_deployment(deployment); + } + Gui::parse_from_yaml_optional(self.documents.clone(), Some(&context)) } } @@ -359,7 +363,7 @@ mod tests { "order1" ); - let gui = dotrain_yaml.get_gui().unwrap().unwrap(); + let gui = dotrain_yaml.get_gui(None).unwrap().unwrap(); assert_eq!(gui.name, "Test gui"); assert_eq!(gui.description, "Test description"); assert_eq!(gui.deployments.len(), 1); @@ -385,9 +389,20 @@ mod tests { assert_eq!(select_tokens.len(), 1); assert_eq!(select_tokens[0], "token2"); - let (name, description) = Gui::parse_gui_details(dotrain_yaml.documents.clone()).unwrap(); - assert_eq!(name, "Test gui"); - assert_eq!(description, "Test description"); + let details = Gui::parse_strategy_details(dotrain_yaml.documents.clone()).unwrap(); + assert_eq!(details.name, "Test gui"); + assert_eq!(details.description, "Test description"); + + let deployment_details = + Gui::parse_deployment_details(dotrain_yaml.documents.clone()).unwrap(); + assert_eq!( + deployment_details.get("deployment1").unwrap().name, + "Test deployment" + ); + assert_eq!( + deployment_details.get("deployment1").unwrap().description, + "Test description" + ); let deployment_keys = Gui::parse_deployment_keys(dotrain_yaml.documents.clone()).unwrap(); assert_eq!(deployment_keys.len(), 1); @@ -593,7 +608,7 @@ mod tests { fn test_handlebars() { let dotrain_yaml = DotrainYaml::new(vec![HANDLEBARS_YAML.to_string()], false).unwrap(); - let gui = dotrain_yaml.get_gui().unwrap().unwrap(); + let gui = dotrain_yaml.get_gui(None).unwrap().unwrap(); let deployment = gui.deployments.get("deployment1").unwrap(); assert_eq!( @@ -684,7 +699,7 @@ orders: ); let dotrain_yaml = DotrainYaml::new(vec![missing_input_token_yaml], false).unwrap(); - let error = dotrain_yaml.get_gui().unwrap_err(); + let error = dotrain_yaml.get_gui(None).unwrap_err(); assert_eq!( error, YamlError::ParseError( @@ -694,7 +709,7 @@ orders: ); let dotrain_yaml = DotrainYaml::new(vec![missing_output_token_yaml], false).unwrap(); - let error = dotrain_yaml.get_gui().unwrap_err(); + let error = dotrain_yaml.get_gui(None).unwrap_err(); assert_eq!( error, YamlError::ParseError( diff --git a/package-lock.json b/package-lock.json index da5609d1d..58ffb73bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,15 @@ "dependencies": { "@rainlanguage/orderbook": "*", "@rainlanguage/ui-components": "*", + "@reown/appkit": "^1.6.4", + "@reown/appkit-adapter-wagmi": "^1.6.4", "@sveltejs/kit": "^2.0.0", "@sveltejs/package": "^2.0.0", + "@wagmi/core": "^2.16.3", "flowbite": "^2.2.1", "flowbite-svelte": "^0.44.21", - "flowbite-svelte-icons": "^0.4.5" + "flowbite-svelte-icons": "^0.4.5", + "wagmi": "^2.14.7" }, "devDependencies": { "@square/svelte-store": "^1.0.18", @@ -57,7 +61,7 @@ "ts-node": "^10.9.1", "typescript": "^5.0.0", "typescript-eslint": "^8.0.0", - "viem": "^2.21.44", + "viem": "^2.22.8", "vite": "^5.0.11", "vitest": "^2.0.5" }, @@ -75,8 +79,7 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", - "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", - "license": "MIT" + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -335,7 +338,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -517,24 +519,24 @@ } }, "node_modules/@coinbase/wallet-sdk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.0.0.tgz", - "integrity": "sha512-7q8k39a2Iuz30dAEeh86AaSAbLgVPW3gfLa1UYh2IqP7gS+X9witoMEMM8o016K6vxP5N++PrM+Lgu/O1KByBA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.2.4.tgz", + "integrity": "sha512-wJ9QOXOhRdGermKAoJSr4JgGqZm/Um0m+ecywzEC9qSOu3TXuVcG3k0XXTXW11UBgjdoPRuf5kAwRX3T9BynFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "buffer": "^6.0.3", + "@noble/hashes": "^1.4.0", "clsx": "^1.2.1", "eventemitter3": "^5.0.1", - "keccak": "^3.0.3", - "preact": "^10.16.0", - "sha.js": "^2.4.11" + "preact": "^10.24.2" } }, "node_modules/@coinbase/wallet-sdk/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -560,6 +562,20 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@ecies/ciphers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.2.tgz", + "integrity": "sha512-ylfGR7PyTd+Rm2PqQowG08BCKA22QuX8NzrL+LxAAvazN10DMwdJ2fWwAzRj05FI/M8vNFGm3cv9Wq/GFWCBLg==", + "license": "MIT", + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -1016,6 +1032,57 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@ethereumjs/common": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", + "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", + "license": "MIT", + "dependencies": { + "@ethereumjs/util": "^8.1.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", + "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/common": "^3.2.0", + "@ethereumjs/rlp": "^4.0.1", + "@ethereumjs/util": "^8.1.0", + "ethereum-cryptography": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -2158,6 +2225,383 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@metamask/eth-json-rpc-provider": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", + "integrity": "sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==", + "dependencies": { + "@metamask/json-rpc-engine": "^7.0.0", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/json-rpc-engine": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz", + "integrity": "sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==", + "license": "ISC", + "dependencies": { + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/json-rpc-engine/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", + "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.1.2", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "semver": "^7.3.8", + "superstruct": "^1.0.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@metamask/eth-json-rpc-provider/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@metamask/json-rpc-engine": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz", + "integrity": "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==", + "license": "ISC", + "dependencies": { + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/json-rpc-middleware-stream": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-7.0.2.tgz", + "integrity": "sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==", + "license": "ISC", + "dependencies": { + "@metamask/json-rpc-engine": "^8.0.2", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0", + "readable-stream": "^3.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/json-rpc-middleware-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/object-multiplex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.1.0.tgz", + "integrity": "sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==", + "license": "ISC", + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.2" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@metamask/object-multiplex/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/onboarding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@metamask/onboarding/-/onboarding-1.0.1.tgz", + "integrity": "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==", + "license": "MIT", + "dependencies": { + "bowser": "^2.9.0" + } + }, + "node_modules/@metamask/providers": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@metamask/providers/-/providers-16.1.0.tgz", + "integrity": "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==", + "license": "MIT", + "dependencies": { + "@metamask/json-rpc-engine": "^8.0.1", + "@metamask/json-rpc-middleware-stream": "^7.0.1", + "@metamask/object-multiplex": "^2.0.0", + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.1.1", + "@metamask/utils": "^8.3.0", + "detect-browser": "^5.2.0", + "extension-port-stream": "^3.0.0", + "fast-deep-equal": "^3.1.3", + "is-stream": "^2.0.0", + "readable-stream": "^3.6.2", + "webextension-polyfill": "^0.10.0" + }, + "engines": { + "node": "^18.18 || >=20" + } + }, + "node_modules/@metamask/providers/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@metamask/providers/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/rpc-errors": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", + "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", + "license": "MIT", + "dependencies": { + "@metamask/utils": "^9.0.0", + "fast-safe-stringify": "^2.0.6" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/rpc-errors/node_modules/@metamask/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.1.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/rpc-errors/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@metamask/safe-event-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz", + "integrity": "sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==", + "license": "ISC", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/sdk": { + "version": "0.31.4", + "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.31.4.tgz", + "integrity": "sha512-HLUN4IZGdyiy5YeebXmXi+ndpmrl6zslCQLdR2QHplIy4JmUL/eDyKNFiK7eBLVKXVVIDYFIb6g1iSEb+i8Kew==", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@metamask/onboarding": "^1.0.1", + "@metamask/providers": "16.1.0", + "@metamask/sdk-communication-layer": "0.31.0", + "@metamask/sdk-install-modal-web": "0.31.2", + "@paulmillr/qr": "^0.2.1", + "bowser": "^2.9.0", + "cross-fetch": "^4.0.0", + "debug": "^4.3.4", + "eciesjs": "^0.4.11", + "eth-rpc-errors": "^4.0.3", + "eventemitter2": "^6.4.9", + "obj-multiplex": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.2", + "socket.io-client": "^4.5.1", + "tslib": "^2.6.0", + "util": "^0.12.4", + "uuid": "^8.3.2" + } + }, + "node_modules/@metamask/sdk-install-modal-web": { + "version": "0.31.2", + "resolved": "https://registry.npmjs.org/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.31.2.tgz", + "integrity": "sha512-KPv36kQjmTwErU8g2neuHHSgkD5+1hp4D6ERfk5Kc2r73aOYNCdG9wDGRUmFmcY2MKkeK1EuDyZfJ4FPU30fxQ==", + "dependencies": { + "@paulmillr/qr": "^0.2.1" + } + }, + "node_modules/@metamask/sdk/node_modules/@metamask/sdk-communication-layer": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.31.0.tgz", + "integrity": "sha512-V9CxdzabDPjQVgmKGHsyU3SYt4Af27g+4DbGCx0fLoHqN/i1RBDZqs/LYbJX3ykJCANzE+llz/MolMCMrzM2RA==", + "dependencies": { + "bufferutil": "^4.0.8", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "utf-8-validate": "^5.0.2", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "cross-fetch": "^4.0.0", + "eciesjs": "*", + "eventemitter2": "^6.4.9", + "readable-stream": "^3.6.2", + "socket.io-client": "^4.5.1" + } + }, + "node_modules/@metamask/sdk/node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/@metamask/sdk/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@metamask/superstruct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.1.0.tgz", + "integrity": "sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@metamask/utils/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@motionone/animation": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", @@ -2243,13 +2687,24 @@ "tslib": "^2.3.1" } }, - "node_modules/@noble/curves": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", - "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "node_modules/@noble/ciphers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.0.tgz", + "integrity": "sha512-YGdEUzYEd+82jeaVbSKKVp1jFZb8LwaNMIIzHFkihGvYdd/KKAr7KaJHdEdSYGredE3ssSravXIa0Jxg28Sv5w==", "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", "dependencies": { - "@noble/hashes": "1.5.0" + "@noble/hashes": "1.6.0" }, "engines": { "node": "^14.21.3 || >=16" @@ -2259,10 +2714,9 @@ } }, "node_modules/@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", - "license": "MIT", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", "engines": { "node": "^14.21.3 || >=16" }, @@ -2646,6 +3100,15 @@ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT" }, + "node_modules/@paulmillr/qr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@paulmillr/qr/-/qr-0.2.1.tgz", + "integrity": "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==", + "license": "(MIT OR Apache-2.0)", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2711,6 +3174,284 @@ "resolved": "packages/webapp", "link": true }, + "node_modules/@reown/appkit": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.6.4.tgz", + "integrity": "sha512-7mP37wB+Bvth8ae9wCqxrXb1vLbUw5ZYVYieTgPoEjPk5Fk0twnNy9pkxl8OdpDmKFir1FbRQJEq5imLLQIa/Q==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.6.4", + "@reown/appkit-core": "1.6.4", + "@reown/appkit-polyfills": "1.6.4", + "@reown/appkit-scaffold-ui": "1.6.4", + "@reown/appkit-siwe": "1.6.4", + "@reown/appkit-ui": "1.6.4", + "@reown/appkit-utils": "1.6.4", + "@reown/appkit-wallet": "1.6.4", + "@walletconnect/types": "2.17.2", + "@walletconnect/universal-provider": "2.17.2", + "@walletconnect/utils": "2.17.2", + "bs58": "6.0.0", + "valtio": "1.11.2", + "viem": "2.x" + } + }, + "node_modules/@reown/appkit-adapter-wagmi": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-adapter-wagmi/-/appkit-adapter-wagmi-1.6.4.tgz", + "integrity": "sha512-gT65bf8HFHF1a9/St8kNHmYYMJm9H6ZXWwP6AnKl0WrZY1Sj6q7sumNcEvRpNFDlJu9ySPHFmCzkt6E7XxljiA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit": "1.6.4", + "@reown/appkit-common": "1.6.4", + "@reown/appkit-core": "1.6.4", + "@reown/appkit-polyfills": "1.6.4", + "@reown/appkit-scaffold-ui": "1.6.4", + "@reown/appkit-ui": "1.6.4", + "@reown/appkit-utils": "1.6.4", + "@reown/appkit-wallet": "1.6.4", + "@walletconnect/universal-provider": "2.17.2", + "@walletconnect/utils": "2.17.2", + "valtio": "1.11.2" + }, + "peerDependencies": { + "@coinbase/wallet-sdk": "4.2.4", + "@wagmi/connectors": ">=5.1", + "@wagmi/core": ">=2.13", + "viem": "2.x", + "wagmi": ">=2.12" + } + }, + "node_modules/@reown/appkit-common": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.6.4.tgz", + "integrity": "sha512-TN8mKZYiTl7VQ7csrxxgB9EBsmp1qGj5dqcAv2JPZqD3rMkJtMCipIuf/Lg8gUjOJ3B8OyeNFDe8g+dhLZgTag==", + "license": "Apache-2.0", + "dependencies": { + "bignumber.js": "9.1.2", + "dayjs": "1.11.10", + "viem": "2.x" + } + }, + "node_modules/@reown/appkit-common/node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "license": "MIT" + }, + "node_modules/@reown/appkit-core": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-core/-/appkit-core-1.6.4.tgz", + "integrity": "sha512-hewOtE6P+s5rYEcjB5lzgiALTH50xbjROkliulyHLasBUvbP/L/M5RIsuOM3n/9/3bUu/Sc3wX+cFdh0/YbBaQ==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.6.4", + "@reown/appkit-wallet": "1.6.4", + "@walletconnect/universal-provider": "2.17.2", + "valtio": "1.11.2", + "viem": "2.x" + } + }, + "node_modules/@reown/appkit-polyfills": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.6.4.tgz", + "integrity": "sha512-JF4ypel+k6S108xTDwQVzouFqHCHSmItX6OcGf/MU+1VhIEQO9xxZV5ee2IVPtmgdgireNREPXr+VOepMNKBsQ==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/@reown/appkit-scaffold-ui": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.6.4.tgz", + "integrity": "sha512-uhsmDE8PoWT2d4HvFkcwm3IdYUU7RQCPEv3SUjYWQP94g+vPgZl6TT1iEmw455WOcg0oeYZ9COFKBsGSgVmPbw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.6.4", + "@reown/appkit-core": "1.6.4", + "@reown/appkit-ui": "1.6.4", + "@reown/appkit-utils": "1.6.4", + "@reown/appkit-wallet": "1.6.4", + "lit": "3.1.0" + } + }, + "node_modules/@reown/appkit-scaffold-ui/node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@reown/appkit-scaffold-ui/node_modules/lit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", + "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.0.0", + "lit-element": "^4.0.0", + "lit-html": "^3.1.0" + } + }, + "node_modules/@reown/appkit-scaffold-ui/node_modules/lit-element": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", + "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.2.0" + } + }, + "node_modules/@reown/appkit-scaffold-ui/node_modules/lit-html": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", + "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/@reown/appkit-siwe": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-siwe/-/appkit-siwe-1.6.4.tgz", + "integrity": "sha512-++gmCXQBu3XI1lG1h8by6XfExcPMfdEovrlO2t7z8dUwQETc7FY6yDkvTO2piCDvqpMGR5MDYmlIv19xIpuAwQ==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.6.4", + "@reown/appkit-core": "1.6.4", + "@reown/appkit-ui": "1.6.4", + "@reown/appkit-utils": "1.6.4", + "@reown/appkit-wallet": "1.6.4", + "@walletconnect/utils": "2.17.2", + "lit": "3.1.0", + "valtio": "1.11.2" + } + }, + "node_modules/@reown/appkit-siwe/node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@reown/appkit-siwe/node_modules/lit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", + "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.0.0", + "lit-element": "^4.0.0", + "lit-html": "^3.1.0" + } + }, + "node_modules/@reown/appkit-siwe/node_modules/lit-element": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", + "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.2.0" + } + }, + "node_modules/@reown/appkit-siwe/node_modules/lit-html": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", + "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/@reown/appkit-ui": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.6.4.tgz", + "integrity": "sha512-NprNidUe6SDrFJJ5MQHc5J3Y+e/SI43OKNmVg9Lgui7HLPsowxC3T6YSBTXh1HwsKHOHyMjiLyefoi0fLNaZ7A==", + "license": "Apache-2.0", + "dependencies": { + "lit": "3.1.0", + "qrcode": "1.5.3" + } + }, + "node_modules/@reown/appkit-ui/node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@reown/appkit-ui/node_modules/lit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", + "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.0.0", + "lit-element": "^4.0.0", + "lit-html": "^3.1.0" + } + }, + "node_modules/@reown/appkit-ui/node_modules/lit-element": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", + "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.2.0" + } + }, + "node_modules/@reown/appkit-ui/node_modules/lit-html": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", + "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/@reown/appkit-utils": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.6.4.tgz", + "integrity": "sha512-Dq3Z02Qvc404DqRVZ2ZTYH9ldTmwTUxP5V77H8XUwKaTNEn+NsigQ+PdjsMbdYuqzqFhEOw0VUQABgziBbcNAA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.6.4", + "@reown/appkit-core": "1.6.4", + "@reown/appkit-polyfills": "1.6.4", + "@reown/appkit-wallet": "1.6.4", + "@walletconnect/logger": "2.1.2", + "@walletconnect/universal-provider": "2.17.2", + "valtio": "1.11.2", + "viem": "2.x" + }, + "peerDependencies": { + "valtio": "1.11.2" + } + }, + "node_modules/@reown/appkit-wallet": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.6.4.tgz", + "integrity": "sha512-GfS4+ESVEGubkLrPEOE/QOSufkzSU7FZRK+RG4mD4zMjx2dcXEMrSBOuNOOf5PdgCFdd3XLCPfPj6HhMyVcVWQ==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.6.4", + "@reown/appkit-polyfills": "1.6.4", + "@walletconnect/logger": "2.1.2", + "zod": "3.22.4" + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", @@ -2986,12 +3727,87 @@ "x64" ], "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@safe-global/safe-apps-provider": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.5.tgz", + "integrity": "sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g==", + "license": "MIT", + "dependencies": { + "@safe-global/safe-apps-sdk": "^9.1.0", + "events": "^3.3.0" + } + }, + "node_modules/@safe-global/safe-apps-sdk": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz", + "integrity": "sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==", + "license": "MIT", + "dependencies": { + "@safe-global/safe-gateway-typescript-sdk": "^3.5.3", + "viem": "^2.1.1" + } + }, + "node_modules/@safe-global/safe-gateway-typescript-sdk": { + "version": "3.22.6", + "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.22.6.tgz", + "integrity": "sha512-R0Ck7n8fj7KtFUpbsGi0j3e2t0/bhpHTY/U8P8315vQ8aT/sfZrWMcfFcD5I9Kw8TEU7rvKY0+sngT1lCptJmQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@scure/base": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", + "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@scure/base": { + "node_modules/@scure/bip32/node_modules/@scure/base": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", @@ -3000,33 +3816,40 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip32": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", - "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "license": "MIT", "dependencies": { - "@noble/curves": "~1.6.0", - "@noble/hashes": "~1.5.0", - "@scure/base": "~1.1.7" + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip39": { + "node_modules/@scure/bip39/node_modules/@noble/hashes": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", - "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.5.0", - "@scure/base": "~1.1.8" + "engines": { + "node": ">= 16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sentry-internal/feedback": { "version": "7.120.0", "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.120.0.tgz", @@ -3541,6 +4364,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@square/svelte-store": { "version": "1.0.18", "resolved": "https://registry.npmjs.org/@square/svelte-store/-/svelte-store-1.0.18.tgz", @@ -3851,8 +4680,36 @@ "version": "5.59.20", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.20.tgz", "integrity": "sha512-e8vw0lf7KwfGe1if4uPFhvZRWULqHjFcz3K8AebtieXvnMOz5FSzlZe3mTLlPuUBcydCnBRqYs2YJ5ys68wwLg==", - "dev": true, + "devOptional": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.64.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.64.1.tgz", + "integrity": "sha512-vW5ggHpIO2Yjj44b4sB+Fd3cdnlMJppXRBJkEHvld6FXh3j5dwWJoQo7mGtKI2RbSFyiyu/PhGAy0+Vv5ev9Eg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tanstack/query-core": "5.64.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query/node_modules/@tanstack/query-core": { + "version": "5.64.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.64.1.tgz", + "integrity": "sha512-978Wx4Wl4UJZbmvU/rkaM9cQtXXrbhK0lsz/UZhYIbyKYA8E4LdomTwyh2GHZ4oU0BKKoDH4YlKk2VscCUgNmg==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -4050,6 +4907,15 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -4087,6 +4953,12 @@ "integrity": "sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg==", "license": "MIT" }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "18.19.64", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", @@ -5058,6 +5930,201 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@wagmi/connectors": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.7.3.tgz", + "integrity": "sha512-i7Gk5M/Fc9gMvkVHbqw2kGtXvY8POsSY798/9I5npyglVjBddxoVk3xTYmcYTB1VIa4Fi0T2gLTHpQnpLrq1CQ==", + "license": "MIT", + "dependencies": { + "@coinbase/wallet-sdk": "4.2.3", + "@metamask/sdk": "0.31.4", + "@safe-global/safe-apps-provider": "0.18.5", + "@safe-global/safe-apps-sdk": "9.1.0", + "@walletconnect/ethereum-provider": "2.17.0", + "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@wagmi/core": "2.16.3", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@wagmi/connectors/node_modules/@coinbase/wallet-sdk": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.2.3.tgz", + "integrity": "sha512-BcyHZ/Ec84z0emORzqdXDv4P0oV+tV3a0OirfA8Ko1JGBIAVvB+hzLvZzCDvnuZx7MTK+Dd8Y9Tjlo446BpCIg==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "^1.4.0", + "clsx": "^1.2.1", + "eventemitter3": "^5.0.1", + "preact": "^10.24.2" + } + }, + "node_modules/@wagmi/connectors/node_modules/@walletconnect/core": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.17.0.tgz", + "integrity": "sha512-On+uSaCfWdsMIQsECwWHZBmUXfrnqmv6B8SXRRuTJgd8tUpEvBkLQH4X7XkSm3zW6ozEkQTCagZ2ox2YPn3kbw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.14", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.0.4", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.17.0", + "@walletconnect/utils": "2.17.0", + "events": "3.3.0", + "lodash.isequal": "4.5.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@wagmi/connectors/node_modules/@walletconnect/ethereum-provider": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.17.0.tgz", + "integrity": "sha512-b+KTAXOb6JjoxkwpgYQQKPUcTwENGmdEdZoIDLeRicUmZTn/IQKfkMoC2frClB4YxkyoVMtj1oMV2JAax+yu9A==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/modal": "2.7.0", + "@walletconnect/sign-client": "2.17.0", + "@walletconnect/types": "2.17.0", + "@walletconnect/universal-provider": "2.17.0", + "@walletconnect/utils": "2.17.0", + "events": "3.3.0" + } + }, + "node_modules/@wagmi/connectors/node_modules/@walletconnect/sign-client": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.17.0.tgz", + "integrity": "sha512-sErYwvSSHQolNXni47L3Bm10ptJc1s1YoJvJd34s5E9h9+d3rj7PrhbiW9X82deN+Dm5oA8X9tC4xty1yIBrVg==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.17.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.17.0", + "@walletconnect/utils": "2.17.0", + "events": "3.3.0" + } + }, + "node_modules/@wagmi/connectors/node_modules/@walletconnect/types": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.17.0.tgz", + "integrity": "sha512-i1pn9URpvt9bcjRDkabuAmpA9K7mzyKoLJlbsAujRVX7pfaG7wur7u9Jz0bk1HxvuABL5LHNncTnVKSXKQ5jZA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@wagmi/connectors/node_modules/@walletconnect/universal-provider": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.17.0.tgz", + "integrity": "sha512-d3V5Be7AqLrvzcdMZSBS8DmGDRdqnyLk1DWmRKAGgR6ieUWykhhUKlvfeoZtvJrIXrY7rUGYpH1X41UtFkW5Pw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.17.0", + "@walletconnect/types": "2.17.0", + "@walletconnect/utils": "2.17.0", + "events": "3.3.0" + } + }, + "node_modules/@wagmi/connectors/node_modules/@walletconnect/utils": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.17.0.tgz", + "integrity": "sha512-1aeQvjwsXy4Yh9G6g2eGmXrEl+BzkNjHRdCrGdMYqFTFa8ROEJfTGsSH3pLsNDlOY94CoBUvJvM55q/PMoN/FQ==", + "license": "Apache-2.0", + "dependencies": { + "@stablelib/chacha20poly1305": "1.0.1", + "@stablelib/hkdf": "1.0.1", + "@stablelib/random": "1.0.2", + "@stablelib/sha256": "1.0.1", + "@stablelib/x25519": "1.0.3", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.0.4", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.17.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "detect-browser": "5.3.0", + "elliptic": "^6.5.7", + "query-string": "7.1.3", + "uint8arrays": "3.1.0" + } + }, + "node_modules/@wagmi/connectors/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/@wagmi/core": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.16.3.tgz", + "integrity": "sha512-SVovoWHaQ2AIkmGf+ucNijT6AHXcTMffFcLmcFF6++y21x+ge7Gkh3UoJiU91SDDv8n08eTQ9jbyia3GEgU5jQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "5.0.1", + "mipd": "0.0.7", + "zustand": "5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@tanstack/query-core": ">=5.0.0", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "@tanstack/query-core": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@wagmi/core/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/@walletconnect/core": { "version": "2.17.2", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.17.2.tgz", @@ -5520,6 +6587,20 @@ } } }, + "node_modules/@web3modal/ethers5/node_modules/@coinbase/wallet-sdk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.0.0.tgz", + "integrity": "sha512-7q8k39a2Iuz30dAEeh86AaSAbLgVPW3gfLa1UYh2IqP7gS+X9witoMEMM8o016K6vxP5N++PrM+Lgu/O1KByBA==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "^6.0.3", + "clsx": "^1.2.1", + "eventemitter3": "^5.0.1", + "keccak": "^3.0.3", + "preact": "^10.16.0", + "sha.js": "^2.4.11" + } + }, "node_modules/@web3modal/ethers5/node_modules/@walletconnect/core": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.13.0.tgz", @@ -5673,6 +6754,12 @@ "uint8arrays": "3.1.0" } }, + "node_modules/@web3modal/ethers5/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/@web3modal/polyfills": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/@web3modal/polyfills/-/polyfills-4.2.3.tgz", @@ -5974,10 +7061,9 @@ "dev": true }, "node_modules/abitype": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", - "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==", - "license": "MIT", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.7.tgz", + "integrity": "sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -5994,6 +7080,18 @@ } } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6359,6 +7457,21 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -6381,6 +7494,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/base-x": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", + "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==", + "license": "MIT" + }, "node_modules/base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -6510,6 +7629,12 @@ "dev": true, "license": "MIT" }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6581,6 +7706,15 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -6627,8 +7761,6 @@ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", "hasInstallScript": true, - "optional": true, - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -6663,21 +7795,46 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=10.6.0" + "node": ">=10.6.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6767,6 +7924,30 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cbw-sdk": { + "name": "@coinbase/wallet-sdk", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz", + "integrity": "sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.1", + "buffer": "^6.0.3", + "clsx": "^1.2.1", + "eth-block-tracker": "^7.1.0", + "eth-json-rpc-filters": "^6.0.0", + "eventemitter3": "^5.0.1", + "keccak": "^3.0.3", + "preact": "^10.16.0", + "sha.js": "^2.4.11" + } + }, + "node_modules/cbw-sdk/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/chai": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", @@ -7176,7 +8357,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, "license": "MIT" }, "node_modules/cors": { @@ -7200,6 +8380,18 @@ "dev": true, "license": "MIT" }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -7773,6 +8965,22 @@ "node": ">=18" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/dayjs": { "version": "1.11.13", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", @@ -7858,7 +9066,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -8069,6 +9276,19 @@ "dev": true, "license": "MIT" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -8088,6 +9308,23 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/eciesjs": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.13.tgz", + "integrity": "sha512-zBdtR4K+wbj10bWPpIOF9DW+eFYQu8miU5ypunh0t4Bvt83ZPlEWgT5Dq/0G6uwEXumZKjfb5BZxYUZQ2Hzn/Q==", + "license": "MIT", + "dependencies": { + "@ecies/ciphers": "^0.2.2", + "@noble/ciphers": "^1.0.0", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0" + }, + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8154,6 +9391,49 @@ "once": "^1.4.0" } }, + "node_modules/engine.io-client": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", + "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -8168,14 +9448,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -8184,7 +9459,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8197,6 +9471,17 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.1.tgz", + "integrity": "sha512-BPOBuyUF9QIVhuNLhbToCLHP6+0MHwZ7xLBkPPCZqK4JmpJgGnv10035STzzQwFpqdzNFMB3irvDI63IagvDwA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -8609,6 +9894,127 @@ "node": ">= 0.6" } }, + "node_modules/eth-block-tracker": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz", + "integrity": "sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==", + "license": "MIT", + "dependencies": { + "@metamask/eth-json-rpc-provider": "^1.0.0", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^5.0.1", + "json-rpc-random-id": "^1.0.1", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/eth-block-tracker/node_modules/@metamask/utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", + "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.1.2", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "semver": "^7.3.8", + "superstruct": "^1.0.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/eth-block-tracker/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-json-rpc-filters": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz", + "integrity": "sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==", + "license": "ISC", + "dependencies": { + "@metamask/safe-event-emitter": "^3.0.0", + "async-mutex": "^0.2.6", + "eth-query": "^2.1.2", + "json-rpc-engine": "^6.1.0", + "pify": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/eth-json-rpc-filters/node_modules/async-mutex": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", + "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/eth-query": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", + "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", + "license": "ISC", + "dependencies": { + "json-rpc-random-id": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "node_modules/eth-rpc-errors": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", + "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", + "license": "MIT", + "dependencies": { + "fast-safe-stringify": "^2.0.6" + } + }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", @@ -8657,6 +10063,21 @@ "@ethersproject/wordlists": "5.7.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" + }, "node_modules/eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", @@ -8795,6 +10216,44 @@ "dev": true, "license": "MIT" }, + "node_modules/extension-port-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-3.0.0.tgz", + "integrity": "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==", + "license": "ISC", + "dependencies": { + "readable-stream": "^3.6.2 || ^4.4.2", + "webextension-polyfill": ">=0.10.0 <1.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extension-port-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/extension-port-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/fancy-canvas": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fancy-canvas/-/fancy-canvas-2.1.0.tgz", @@ -8804,8 +10263,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", @@ -8871,6 +10329,12 @@ "node": ">=6" } }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -9112,6 +10576,15 @@ "tailwindcss": "^3.3.2" } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -9344,17 +10817,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "license": "MIT", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9369,6 +10845,18 @@ "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", "license": "MIT" }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -9499,13 +10987,11 @@ "license": "MIT" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9611,7 +11097,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -9620,12 +11105,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "license": "MIT", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -9633,12 +11116,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -10035,6 +11520,22 @@ "url": "https://github.com/sponsors/brc-dd" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -10047,6 +11548,18 @@ "node": ">=8" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", @@ -10095,6 +11608,24 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -10165,6 +11696,24 @@ "@types/estree": "^1.0.6" } }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -10177,6 +11726,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -10211,7 +11775,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -10448,6 +12011,31 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-rpc-engine": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", + "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", + "license": "ISC", + "dependencies": { + "@metamask/safe-event-emitter": "^2.0.0", + "eth-rpc-errors": "^4.0.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/json-rpc-engine/node_modules/@metamask/safe-event-emitter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", + "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==", + "license": "ISC" + }, + "node_modules/json-rpc-random-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", + "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", + "license": "ISC" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10838,6 +12426,14 @@ "node": ">= 16" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -10889,6 +12485,12 @@ "node": ">= 0.6" } }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -11048,6 +12650,26 @@ "node": ">=8" } }, + "node_modules/mipd": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mipd/-/mipd-0.0.7.tgz", + "integrity": "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -14320,6 +15942,17 @@ "dev": true, "license": "MIT" }, + "node_modules/obj-multiplex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/obj-multiplex/-/obj-multiplex-1.0.0.tgz", + "integrity": "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==", + "license": "ISC", + "dependencies": { + "end-of-stream": "^1.4.0", + "once": "^1.4.0", + "readable-stream": "^2.3.3" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14430,16 +16063,15 @@ } }, "node_modules/ox": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz", - "integrity": "sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.0.tgz", + "integrity": "sha512-blUzTLidvUlshv0O02CnLFqBLidNzPoAZdIth894avUAotTuWziznv6IENv5idRuOSSP3dH8WzcYw84zVdu0Aw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], - "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", @@ -14458,11 +16090,60 @@ } } }, + "node_modules/ox/node_modules/@noble/curves": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.0.tgz", + "integrity": "sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==", + "dependencies": { + "@noble/hashes": "1.7.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@noble/hashes": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", + "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/bip32": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.1.tgz", + "integrity": "sha512-jSO+5Ud1E588Y+LFo8TaB8JVPNAZw/lGGao+1SepHDeTs2dFLurdNIAgUuDlwezqEjRjElkCJajVrtrZaBxvaQ==", + "dependencies": { + "@noble/curves": "~1.8.0", + "@noble/hashes": "~1.7.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/bip39": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.1.tgz", + "integrity": "sha512-GnlufVSP9UdAo/H2Patfv22VTtpNTyfi+I3qCKpvuB5l1KWzEYx+l2TNpBy9Ksh4xTs3Rn06tBlpWCi/1Vz8gw==", + "dependencies": { + "@noble/hashes": "~1.7.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ox/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/p-limit": { "version": "3.1.0", @@ -14773,7 +16454,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -14875,6 +16555,15 @@ "node": ">=10.13.0" } }, + "node_modules/pony-cause": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", + "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", + "license": "0BSD", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/portfinder": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", @@ -14900,6 +16589,15 @@ "ms": "^2.1.1" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", @@ -15249,11 +16947,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, "license": "MIT" }, "node_modules/process-warning": { @@ -15328,6 +17034,16 @@ "url": "https://bjornlu.com/sponsor" } }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -15522,7 +17238,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -15538,7 +17253,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, "license": "MIT" }, "node_modules/readdirp": { @@ -15821,6 +17535,23 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", @@ -15963,7 +17694,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -16090,6 +17820,34 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/socks": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", @@ -16451,6 +18209,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17918,8 +19685,6 @@ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "hasInstallScript": true, - "optional": true, - "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -17927,6 +19692,19 @@ "node": ">=6.14.2" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -17947,7 +19725,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -18006,23 +19783,24 @@ } }, "node_modules/viem": { - "version": "2.21.51", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.51.tgz", - "integrity": "sha512-IBZTFoo9cZvMBkFqaJq5G8Ori4IeEDe9AHE5CmOlvNw7ytkC3vdVrJ/APL+V3H4d/5i1FiV331UsckIqQLIM0w==", + "version": "2.22.8", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.22.8.tgz", + "integrity": "sha512-iB3PW/a/qzpYbpjo3R662u6a/zo6piZHez/N/bOC25C79FYXBCs8mQDqwiHk3FYErUhS4KVZLabKV9zGMd+EgQ==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { - "@noble/curves": "1.6.0", - "@noble/hashes": "1.5.0", - "@scure/bip32": "1.5.0", - "@scure/bip39": "1.4.0", - "abitype": "1.0.6", + "@noble/curves": "1.7.0", + "@noble/hashes": "1.6.1", + "@scure/bip32": "1.6.0", + "@scure/bip39": "1.5.0", + "abitype": "1.0.7", "isows": "1.0.6", - "ox": "0.1.2", + "ox": "0.6.0", "webauthn-p256": "0.0.10", "ws": "8.18.0" }, @@ -18035,6 +19813,42 @@ } } }, + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip32": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.0.tgz", + "integrity": "sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==", + "dependencies": { + "@noble/curves": "~1.7.0", + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip39": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.0.tgz", + "integrity": "sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==", + "dependencies": { + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/vite": { "version": "5.4.11", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", @@ -18518,6 +20332,40 @@ "node": ">=18" } }, + "node_modules/wagmi": { + "version": "2.14.7", + "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.14.7.tgz", + "integrity": "sha512-IwAWy8/UoO8T7p+szhKTwsNGdkTu3GpOg7vEzH/F4P6CoFdE3h7qwnE5RoahAEjgKlGHjP0JuyOJF+aOjkQuyA==", + "license": "MIT", + "dependencies": { + "@wagmi/connectors": "5.7.3", + "@wagmi/core": "2.16.3", + "use-sync-external-store": "1.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@tanstack/react-query": ">=5.0.0", + "react": ">=18", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/wagmi/node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/webauthn-p256": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", @@ -18534,6 +20382,12 @@ "@noble/hashes": "^1.4.0" } }, + "node_modules/webextension-polyfill": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", + "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", + "license": "MPL-2.0" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -18622,6 +20476,26 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "license": "ISC" }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -18813,11 +20687,18 @@ "dev": true, "license": "MIT" }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4" @@ -19011,6 +20892,35 @@ "dev": true, "license": "MIT" }, + "node_modules/zustand": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", + "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, "packages/orderbook": { "name": "@rainlanguage/orderbook", "version": "0.0.1-alpha.6", diff --git a/package.json b/package.json index f445231e8..d97f8df23 100644 --- a/package.json +++ b/package.json @@ -27,31 +27,32 @@ "lint-format-check:all": "npm run lint:all && npm run format:all && npm run check:all" }, "devDependencies": { + "@square/svelte-store": "^1.0.18", + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^3.0.0", "@tanstack/svelte-query": "^5.59.20", - "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.3.1", "@testing-library/jest-dom": "^6.4.2", "@testing-library/svelte": "^5.1.0", "@testing-library/user-event": "^14.5.2", - "@sveltejs/adapter-auto": "^3.0.0", - "@sveltejs/adapter-static": "^3.0.1", - "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^9.6.0", - "@types/node": "^18.13.0", "@types/lodash": "^4.14.202", + "@types/node": "^18.13.0", "@types/uuid": "^9.0.7", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", "@vitest/expect": "^1.5.2", - "@square/svelte-store": "^1.0.18", - "dayjs": "^1.11.13", - "jsdom": "^24.0.0", "autoprefixer": "^10.4.20", + "dayjs": "^1.11.13", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.1", "eslint-plugin-svelte": "^2.36.0", "globals": "^15.0.0", + "jsdom": "^24.0.0", "lodash": "^4.17.21", "mockttp": "^3.15.1", + "postcss": "^8.4.32", "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.2.6", "prettier-plugin-tailwindcss": "^0.6.5", @@ -63,22 +64,25 @@ "ts-node": "^10.9.1", "typescript": "^5.0.0", "typescript-eslint": "^8.0.0", + "viem": "^2.22.8", "vite": "^5.0.11", - "viem": "^2.21.44", - "vitest": "^2.0.5", - "postcss": "^8.4.32" - - }, + "vitest": "^2.0.5" + }, "workspaces": [ - "packages/*", "tauri-app" + "packages/*", + "tauri-app" ], "dependencies": { - "flowbite": "^2.2.1", - "flowbite-svelte": "^0.44.21", - "flowbite-svelte-icons": "^0.4.5", "@rainlanguage/orderbook": "*", "@rainlanguage/ui-components": "*", + "@reown/appkit": "^1.6.4", + "@reown/appkit-adapter-wagmi": "^1.6.4", + "@sveltejs/kit": "^2.0.0", "@sveltejs/package": "^2.0.0", - "@sveltejs/kit": "^2.0.0" + "@wagmi/core": "^2.16.3", + "flowbite": "^2.2.1", + "flowbite-svelte": "^0.44.21", + "flowbite-svelte-icons": "^0.4.5", + "wagmi": "^2.14.7" } } diff --git a/packages/orderbook/test/js_api/gui.test.ts b/packages/orderbook/test/js_api/gui.test.ts index 965a7986c..349b4bea0 100644 --- a/packages/orderbook/test/js_api/gui.test.ts +++ b/packages/orderbook/test/js_api/gui.test.ts @@ -6,12 +6,13 @@ import { AllFieldValuesResult, AllowancesResult, ApprovalCalldataResult, + DeploymentDetails, DeploymentKeys, DepositAndAddOrderCalldataResult, DepositCalldataResult, Gui, GuiDeployment, - GuiDetails, + NameAndDescription, TokenDeposit, TokenInfo } from '../../dist/types/js_api.js'; @@ -365,10 +366,25 @@ describe('Rain Orderbook JS API Package Bindgen Tests - Gui', async function () const guiConfig = gui.getGuiConfig() as Gui; assert.equal(guiConfig.name, 'Fixed limit'); assert.equal(guiConfig.description, 'Fixed limit order strategy'); + }); + + it('should get strategy details', async () => { + const strategyDetails: NameAndDescription = + await DotrainOrderGui.getStrategyDetails(dotrainWithGui); + assert.equal(strategyDetails.name, 'Fixed limit'); + assert.equal(strategyDetails.description, 'Fixed limit order strategy'); + }); - const guiDetails: GuiDetails = gui.getGuiDetails(); - assert.equal(guiDetails.name, 'Fixed limit'); - assert.equal(guiDetails.description, 'Fixed limit order strategy'); + it('should get deployment details', async () => { + const deploymentDetails: DeploymentDetails = + await DotrainOrderGui.getDeploymentDetails(dotrainWithGui); + const entries = Array.from(deploymentDetails.entries()); + assert.equal(entries[0][0], 'other-deployment'); + assert.equal(entries[0][1].name, 'Test test'); + assert.equal(entries[0][1].description, 'Test test test'); + assert.equal(entries[1][0], 'some-deployment'); + assert.equal(entries[1][1].name, 'Buy WETH with USDC on Base.'); + assert.equal(entries[1][1].description, 'Buy WETH with USDC for fixed price on Base network.'); }); it('should get token infos', async () => { diff --git a/packages/ui-components/src/__tests__/InputHex.test.ts b/packages/ui-components/src/__tests__/InputHex.test.ts new file mode 100644 index 000000000..5e038c069 --- /dev/null +++ b/packages/ui-components/src/__tests__/InputHex.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/svelte'; +import InputHex from '../lib/components/input/InputHex.svelte'; + +describe('InputHex', () => { + it('renders an input element', () => { + render(InputHex); + expect(screen.getByRole('textbox')).toBeTruthy(); + }); + + it('initializes with empty string when no value provided', () => { + render(InputHex); + const input = screen.getByRole('textbox') as HTMLInputElement; + expect(input.value).toBe(''); + }); + + it('displays hex value when bigint is provided', () => { + render(InputHex, { props: { value: 255n } }); + const input = screen.getByRole('textbox') as HTMLInputElement; + expect(input.value).toBe('0xff'); + }); +}); diff --git a/packages/ui-components/src/lib/__mocks__/mockWeb3Config.ts b/packages/ui-components/src/lib/__mocks__/mockWeb3Config.ts new file mode 100644 index 000000000..61062fd4d --- /dev/null +++ b/packages/ui-components/src/lib/__mocks__/mockWeb3Config.ts @@ -0,0 +1,16 @@ +import { createConfig, http, fallback, type Config } from '@wagmi/core'; +import { mock } from '@wagmi/connectors'; +import { polygonAmoy } from '@wagmi/core/chains'; + +export const mockWeb3Config: Config = createConfig({ + multiInjectedProviderDiscovery: true, + chains: [polygonAmoy], + connectors: [ + mock({ + accounts: ['0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11'] + }) + ], + transports: { + [polygonAmoy.id]: fallback([http(), http('https://rpc-amoy.polygon.technology')]) + } +}); diff --git a/packages/ui-components/src/lib/__mocks__/stores.ts b/packages/ui-components/src/lib/__mocks__/stores.ts index 7eccaf6e5..fa1b9b39c 100644 --- a/packages/ui-components/src/lib/__mocks__/stores.ts +++ b/packages/ui-components/src/lib/__mocks__/stores.ts @@ -2,6 +2,9 @@ import type { ConfigSource } from '$lib/typeshare/config'; import { writable } from 'svelte/store'; import settingsFixture from '../__fixtures__/settings-12-11-24.json'; +import { type Config } from '@wagmi/core'; +import { mockWeb3Config } from './mockWeb3Config'; + const mockSettingsWritable = writable(settingsFixture); const mockActiveSubgraphsWritable = writable>({}); const mockAccountsWritable = writable>({}); @@ -14,6 +17,10 @@ const mockActiveOrderbookRefWritable = writable(''); const mockActiveAccountsWritable = writable>({}); const mockSubgraphUrlWritable = writable(''); const mockWalletAddressMatchesOrBlankWritable = writable<() => boolean>(() => false); +const mockSignerAddressWritable = writable(''); +const mockChainIdWritable = writable(0); +const mockConnectedWritable = writable(false); +const mockWagmiConfigWritable = writable(mockWeb3Config); export const mockWalletAddressMatchesOrBlankStore = { subscribe: mockWalletAddressMatchesOrBlankWritable.subscribe, @@ -89,3 +96,27 @@ export const mockSubgraphUrlStore = { set: mockSubgraphUrlWritable.set, mockSetSubscribeValue: (value: string): void => mockSubgraphUrlWritable.set(value) }; + +export const mockSignerAddressStore = { + subscribe: mockSignerAddressWritable.subscribe, + set: mockSignerAddressWritable.set, + mockSetSubscribeValue: (value: string): void => mockSignerAddressWritable.set(value) +}; + +export const mockChainIdStore = { + subscribe: mockChainIdWritable.subscribe, + set: mockChainIdWritable.set, + mockSetSubscribeValue: (value: number): void => mockChainIdWritable.set(value) +}; + +export const mockConnectedStore = { + subscribe: mockConnectedWritable.subscribe, + set: mockConnectedWritable.set, + mockSetSubscribeValue: (value: boolean): void => mockConnectedWritable.set(value) +}; + +export const mockWagmiConfigStore = { + subscribe: mockWagmiConfigWritable.subscribe, + set: mockWagmiConfigWritable.set, + mockSetSubscribeValue: (value: Config): void => mockWagmiConfigWritable.set(value) +}; diff --git a/packages/ui-components/src/lib/components/ButtonVaultLink.svelte b/packages/ui-components/src/lib/components/ButtonVaultLink.svelte index ba43689fd..8e1a532c7 100644 --- a/packages/ui-components/src/lib/components/ButtonVaultLink.svelte +++ b/packages/ui-components/src/lib/components/ButtonVaultLink.svelte @@ -18,16 +18,21 @@ on:click={() => goto(`/vaults/${subgraphName}-${tokenVault.id}`)} >
-
+
ID: {bigintStringToHex(tokenVault.vaultId)} {tokenVault.token.name} ({tokenVault.token.symbol}) - - {formatUnits(BigInt(tokenVault.balance), parseInt(tokenVault.token.decimals || '18'))} - +
+
+ Balance +
+ + {formatUnits(BigInt(tokenVault.balance), parseInt(tokenVault.token.decimals || '18'))} + +
diff --git a/packages/ui-components/src/lib/components/Hash.svelte b/packages/ui-components/src/lib/components/Hash.svelte index c223c3d99..b7faca74a 100644 --- a/packages/ui-components/src/lib/components/Hash.svelte +++ b/packages/ui-components/src/lib/components/Hash.svelte @@ -74,7 +74,7 @@ {/if} {#if shorten} - +
{#if type === HashType.Wallet} diff --git a/packages/ui-components/src/lib/components/ListViewOrderbookFilters.svelte b/packages/ui-components/src/lib/components/ListViewOrderbookFilters.svelte index e5f892f24..9be01f768 100644 --- a/packages/ui-components/src/lib/components/ListViewOrderbookFilters.svelte +++ b/packages/ui-components/src/lib/components/ListViewOrderbookFilters.svelte @@ -20,14 +20,17 @@ export let isOrdersPage: boolean; -
+
{#if isEmpty($settings?.networks)} - + No networks added to settings {:else} {#if isVaultsPage} -
+
{/if} diff --git a/packages/ui-components/src/lib/components/TanstackAppTable.svelte b/packages/ui-components/src/lib/components/TanstackAppTable.svelte index bbb9b18d7..854c8140a 100644 --- a/packages/ui-components/src/lib/components/TanstackAppTable.svelte +++ b/packages/ui-components/src/lib/components/TanstackAppTable.svelte @@ -32,7 +32,7 @@
{:else if $query.data} @@ -42,6 +42,7 @@ {#each $query.data?.pages as page} {#each page as item} { dispatch('clickRow', { item }); diff --git a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte index 4b48e06ed..a30638766 100644 --- a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte +++ b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte @@ -12,13 +12,15 @@ type DepositAndAddOrderCalldataResult, type GuiDeposit, type GuiFieldDefinition, - type GuiDetails, + type NameAndDescription, type GuiDeployment, type OrderIO } from '@rainlanguage/orderbook/js_api'; import { Button, Input, Spinner } from 'flowbite-svelte'; - import { createWalletClient, custom, type Chain } from 'viem'; + import { type Chain } from 'viem'; import { base, flare, arbitrum, polygon, bsc, mainnet, linea } from 'viem/chains'; + import { getAccount, sendTransaction, type Config } from '@wagmi/core'; + import { type Writable } from 'svelte/store'; enum DeploymentStepErrors { NO_GUI = 'Error loading GUI', @@ -50,13 +52,18 @@ let errorDetails: string | null = null; let strategyUrl = ''; let selectTokens: string[] | null = null; - let allFieldDefinitions: GuiFieldDefinition[] = []; let allDepositFields: GuiDeposit[] = []; let allTokenOutputs: OrderIO[] = []; + let allFieldDefinitions: GuiFieldDefinition[] = []; let allTokensSelected: boolean = false; - let guiDetails: GuiDetails; + let guiDetails: NameAndDescription; let inputVaultIds: string[] = []; let outputVaultIds: string[] = []; + let addOrderError: string | null = null; + let addOrderErrorDetails: string | null = null; + + export let wagmiConfig: Writable | null = null; + export let wagmiConnected: Writable | null = null; async function loadStrategyFromUrl() { isLoading = true; @@ -80,6 +87,7 @@ let gui: DotrainOrderGui | null = null; let availableDeployments: Record = {}; + async function initialize() { try { let deployments: DeploymentKeys = await DotrainOrderGui.getDeploymentKeys(dotrain); @@ -132,10 +140,10 @@ handleDeploymentChange(selectedDeployment as string); } - function getGuiDetails() { + async function getGuiDetails() { if (!gui) return; try { - guiDetails = gui.getGuiDetails(); + guiDetails = await DotrainOrderGui.getStrategyDetails(dotrain); } catch (e) { error = DeploymentStepErrors.NO_GUI_DETAILS; errorDetails = e instanceof Error ? e.message : 'Unknown error'; @@ -205,41 +213,28 @@ return chain; } - async function handleAddOrder() { + async function handleAddOrderWagmi() { try { - if (!gui) return; - - // @ts-expect-error window.ethereum is not typed - await window.ethereum?.request({ method: 'eth_requestAccounts' }); - const walletClient = createWalletClient({ - chain: getChainById( - gui.getCurrentDeployment().deployment.order.network['chain-id'] as number - ), - // @ts-expect-error window.ethereum is not typed - transport: custom(window.ethereum!) - }); - const [account] = await walletClient.getAddresses(); - - const approvals: ApprovalCalldataResult = await gui.generateApprovalCalldatas(account); + if (!gui || !$wagmiConfig) return; + const { address } = getAccount($wagmiConfig); + if (!address) return; + const approvals: ApprovalCalldataResult = await gui.generateApprovalCalldatas(address); for (const approval of approvals) { - await walletClient.sendTransaction({ - account, + await sendTransaction($wagmiConfig, { to: approval.token as `0x${string}`, data: approval.calldata as `0x${string}` }); } - const calldata: DepositAndAddOrderCalldataResult = await gui.generateDepositAndAddOrderCalldatas(); - await walletClient.sendTransaction({ - account, + await sendTransaction($wagmiConfig, { // @ts-expect-error orderbook is not typed to: gui.getCurrentDeployment().deployment.order.orderbook.address as `0x${string}`, data: calldata as `0x${string}` }); } catch (e) { - error = DeploymentStepErrors.ADD_ORDER_FAILED; - errorDetails = e instanceof Error ? e.message : 'Unknown error'; + addOrderError = DeploymentStepErrors.ADD_ORDER_FAILED; + addOrderErrorDetails = e instanceof Error ? e.message : 'Unknown error'; } } @@ -369,7 +364,21 @@ {/if} {/if} - +
+ {#if $wagmiConnected} + + {:else} + + {/if} +
+ {#if addOrderError} +

{addOrderError}

+ {/if} + {#if addOrderErrorDetails} +

{addOrderErrorDetails}

+ {/if} +
+
{/if} {/if} diff --git a/packages/ui-components/src/lib/components/detail/OrderDetail.svelte b/packages/ui-components/src/lib/components/detail/OrderDetail.svelte index 208dd4b48..d65db18b0 100644 --- a/packages/ui-components/src/lib/components/detail/OrderDetail.svelte +++ b/packages/ui-components/src/lib/components/detail/OrderDetail.svelte @@ -73,7 +73,9 @@ -
+
Order @@ -117,7 +119,7 @@ Input vaults -
+
diff --git a/packages/ui-components/src/lib/components/detail/TanstackOrderQuote.svelte b/packages/ui-components/src/lib/components/detail/TanstackOrderQuote.svelte index 157b9a9b1..265bd9067 100644 --- a/packages/ui-components/src/lib/components/detail/TanstackOrderQuote.svelte +++ b/packages/ui-components/src/lib/components/detail/TanstackOrderQuote.svelte @@ -91,7 +91,7 @@
-
+
Pair Maximum Output diff --git a/packages/ui-components/src/lib/components/detail/TanstackPageContentDetail.svelte b/packages/ui-components/src/lib/components/detail/TanstackPageContentDetail.svelte index d45ec7a72..cb859b088 100644 --- a/packages/ui-components/src/lib/components/detail/TanstackPageContentDetail.svelte +++ b/packages/ui-components/src/lib/components/detail/TanstackPageContentDetail.svelte @@ -21,11 +21,11 @@
-
-
+
+
-
+
diff --git a/packages/ui-components/src/lib/components/input/InputHex.svelte b/packages/ui-components/src/lib/components/input/InputHex.svelte new file mode 100644 index 000000000..2c34816c5 --- /dev/null +++ b/packages/ui-components/src/lib/components/input/InputHex.svelte @@ -0,0 +1,50 @@ + + + diff --git a/packages/ui-components/src/lib/components/input/InputOrderHash.svelte b/packages/ui-components/src/lib/components/input/InputOrderHash.svelte index fa636450d..b560cdd4e 100644 --- a/packages/ui-components/src/lib/components/input/InputOrderHash.svelte +++ b/packages/ui-components/src/lib/components/input/InputOrderHash.svelte @@ -13,7 +13,7 @@
-
+
; export let subgraphUrl: Readable; export let orderHash: Writable; @@ -90,6 +91,17 @@ {#if $query} + -
+
Vaults
{#if handleDepositGenericModal} @@ -110,23 +122,11 @@ data-testid="new-vault-button" on:click={() => { handleDepositGenericModal(); - }}>New vault + }} + >New vault + {/if}
-
- -
@@ -145,15 +145,15 @@ {item.subgraphName} - {bigintStringToHex(item.vault.vaultId)} - - + + + + + + + + + {item.vault.token.name} @@ -174,12 +174,9 @@ updateActiveNetworkAndOrderbook(item.subgraphName); goto(`/orders/${order.id}`); }} - > + + {/each} {#if item.vault.ordersAsInput.length > 3}...{/if}
@@ -198,12 +195,9 @@ updateActiveNetworkAndOrderbook(item.subgraphName); goto(`/orders/${order.id}`); }} - > + + {/each} {#if item.vault.ordersAsOutput.length > 3}...{/if}
@@ -237,15 +231,17 @@ on:click={(e) => { e.stopPropagation(); handleDepositModal(item.vault, $query.refetch); - }}>Deposit + }} + >Deposit + { e.stopPropagation(); handleWithdrawModal(item.vault, $query.refetch); - }}>Withdraw + }} + >Withdraw + {/if} {/if} diff --git a/packages/ui-components/src/lib/index.ts b/packages/ui-components/src/lib/index.ts index abeb19ccc..d57913e5b 100644 --- a/packages/ui-components/src/lib/index.ts +++ b/packages/ui-components/src/lib/index.ts @@ -60,6 +60,7 @@ export { default as InputToken } from './components/input/InputToken.svelte'; export { default as CodeMirrorDotrain } from './components/CodeMirrorDotrain.svelte'; export { default as License } from './components/License.svelte'; export { default as ButtonDarkMode } from './components/ButtonDarkMode.svelte'; +export { default as InputHex } from './components/input/InputHex.svelte'; //Types export type { AppStoresInterface } from './types/appStores.ts'; diff --git a/packages/webapp/env.example b/packages/webapp/env.example new file mode 100644 index 000000000..023f373ba --- /dev/null +++ b/packages/webapp/env.example @@ -0,0 +1 @@ +PLUBLIC_WALLETCONNECT_PROJECT_ID= \ No newline at end of file diff --git a/packages/webapp/src/lib/__mocks__/MockComponent.svelte b/packages/webapp/src/lib/__mocks__/MockComponent.svelte new file mode 100644 index 000000000..47d0e6eb2 --- /dev/null +++ b/packages/webapp/src/lib/__mocks__/MockComponent.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/webapp/src/lib/__mocks__/MockComponent.ts b/packages/webapp/src/lib/__mocks__/MockComponent.ts new file mode 100644 index 000000000..eb2e74c0d --- /dev/null +++ b/packages/webapp/src/lib/__mocks__/MockComponent.ts @@ -0,0 +1,3 @@ +import { writable } from 'svelte/store'; + +export const props = writable(); diff --git a/packages/webapp/src/lib/__mocks__/mockWeb3Config.ts b/packages/webapp/src/lib/__mocks__/mockWeb3Config.ts new file mode 100644 index 000000000..61062fd4d --- /dev/null +++ b/packages/webapp/src/lib/__mocks__/mockWeb3Config.ts @@ -0,0 +1,16 @@ +import { createConfig, http, fallback, type Config } from '@wagmi/core'; +import { mock } from '@wagmi/connectors'; +import { polygonAmoy } from '@wagmi/core/chains'; + +export const mockWeb3Config: Config = createConfig({ + multiInjectedProviderDiscovery: true, + chains: [polygonAmoy], + connectors: [ + mock({ + accounts: ['0xf08bcbce72f62c95dcb7c07dcb5ed26acfcfbc11'] + }) + ], + transports: { + [polygonAmoy.id]: fallback([http(), http('https://rpc-amoy.polygon.technology')]) + } +}); diff --git a/packages/webapp/src/lib/__mocks__/stores.ts b/packages/webapp/src/lib/__mocks__/stores.ts new file mode 100644 index 000000000..16f1815f4 --- /dev/null +++ b/packages/webapp/src/lib/__mocks__/stores.ts @@ -0,0 +1,40 @@ +import { writable } from 'svelte/store'; +import { type Config } from '@wagmi/core'; +import { mockWeb3Config } from './mockWeb3Config'; +import type { AppKit } from '@reown/appkit'; + +const mockSignerAddressWritable = writable(''); +const mockChainIdWritable = writable(0); +const mockConnectedWritable = writable(false); +const mockWagmiConfigWritable = writable(mockWeb3Config); +const mockAppKitModalWritable = writable(null); + +export const mockSignerAddressStore = { + subscribe: mockSignerAddressWritable.subscribe, + set: mockSignerAddressWritable.set, + mockSetSubscribeValue: (value: string): void => mockSignerAddressWritable.set(value) +}; + +export const mockChainIdStore = { + subscribe: mockChainIdWritable.subscribe, + set: mockChainIdWritable.set, + mockSetSubscribeValue: (value: number): void => mockChainIdWritable.set(value) +}; + +export const mockConnectedStore = { + subscribe: mockConnectedWritable.subscribe, + set: mockConnectedWritable.set, + mockSetSubscribeValue: (value: boolean): void => mockConnectedWritable.set(value) +}; + +export const mockWagmiConfigStore = { + subscribe: mockWagmiConfigWritable.subscribe, + set: mockWagmiConfigWritable.set, + mockSetSubscribeValue: (value: Config): void => mockWagmiConfigWritable.set(value) +}; + +export const mockAppKitModalStore = { + subscribe: mockAppKitModalWritable.subscribe, + set: mockAppKitModalWritable.set, + mockSetSubscribeValue: (value: AppKit): void => mockAppKitModalWritable.set(value) +}; diff --git a/packages/webapp/src/lib/__tests__/WalletConnect.test.ts b/packages/webapp/src/lib/__tests__/WalletConnect.test.ts new file mode 100644 index 000000000..5466547cc --- /dev/null +++ b/packages/webapp/src/lib/__tests__/WalletConnect.test.ts @@ -0,0 +1,42 @@ +import { render, screen } from '@testing-library/svelte'; +import WalletConnect from '../components/WalletConnect.svelte'; +import { describe, it, vi, beforeEach, expect } from 'vitest'; + +const { mockSignerAddressStore, mockConnectedStore, mockAppKitModalStore } = await vi.hoisted( + () => import('../__mocks__/stores') +); + +vi.mock('$lib/stores/wagmi', async (importOriginal) => { + const original = (await importOriginal()) as object; + return { + ...original, + appKitModal: mockAppKitModalStore, + connected: mockConnectedStore + }; +}); + +describe('WalletConnect component', () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it('displays "Connect" with red icon when wallet is not connected or wrong network', () => { + mockSignerAddressStore.mockSetSubscribeValue(''); + mockConnectedStore.mockSetSubscribeValue(false); + + render(WalletConnect); + + const connectButton = screen.getByTestId('wallet-connect'); + expect(connectButton).toBeInTheDocument(); + }); + + it('displays "Connected" with green icon when wallet is connected', () => { + mockSignerAddressStore.mockSetSubscribeValue('0x123'); + mockConnectedStore.mockSetSubscribeValue(true); + + render(WalletConnect); + + expect(screen.getByText('Connected')).toBeInTheDocument(); + }); +}); diff --git a/packages/webapp/src/lib/chains.ts b/packages/webapp/src/lib/chains.ts new file mode 100644 index 000000000..08c8cf174 --- /dev/null +++ b/packages/webapp/src/lib/chains.ts @@ -0,0 +1,12 @@ +import { mainnet, polygon, arbitrum, base, flare, linea, bsc } from 'wagmi/chains'; + +export const SupportedChains = { + mainnet, + polygon, + arbitrum, + base, + flare, + linea, + bsc +} as const; +export const supportedChainsList = [mainnet, polygon, arbitrum, base, flare, linea, bsc] as const; diff --git a/packages/webapp/src/lib/components/Sidebar.svelte b/packages/webapp/src/lib/components/Sidebar.svelte index 5d971ab21..c436c9ad4 100644 --- a/packages/webapp/src/lib/components/Sidebar.svelte +++ b/packages/webapp/src/lib/components/Sidebar.svelte @@ -4,10 +4,17 @@ SidebarGroup, SidebarItem, SidebarWrapper, - SidebarBrand + SidebarBrand, + CloseButton, + Button } from 'flowbite-svelte'; - import { WalletSolid, ReceiptSolid, FileLinesSolid, PlusOutline } from 'flowbite-svelte-icons'; - import { page } from '$app/stores'; + import { + WalletSolid, + ReceiptSolid, + FileLinesSolid, + PlusOutline, + BarsSolid + } from 'flowbite-svelte-icons'; import { ButtonDarkMode, IconTelegram, @@ -15,70 +22,121 @@ logoDark, logoLight } from '@rainlanguage/ui-components'; + import WalletConnect from './WalletConnect.svelte'; + import { onMount } from 'svelte'; export let colorTheme; + export let page; + let sideBarHidden: boolean = false; + let breakPoint: number = 1024; + let width: number; + $: sideBarHidden = width < breakPoint; + onMount(() => { + sideBarHidden = width < breakPoint; + }); + + const toggleSide = () => { + if (width < breakPoint) { + sideBarHidden = !sideBarHidden; + } + }; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
+ {#if sideBarHidden} + + {/if} + + {#if !sideBarHidden} + (sideBarHidden = true)} + /> + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/packages/webapp/src/lib/components/WalletConnect.svelte b/packages/webapp/src/lib/components/WalletConnect.svelte new file mode 100644 index 000000000..782f5e4aa --- /dev/null +++ b/packages/webapp/src/lib/components/WalletConnect.svelte @@ -0,0 +1,24 @@ + + + diff --git a/packages/webapp/src/lib/stores/wagmi.test.ts b/packages/webapp/src/lib/stores/wagmi.test.ts new file mode 100644 index 000000000..f030d371d --- /dev/null +++ b/packages/webapp/src/lib/stores/wagmi.test.ts @@ -0,0 +1,128 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { get } from 'svelte/store'; +import { + connected, + wagmiLoaded, + chainId, + signerAddress, + configuredConnectors, + loading, + defaultConfig, + init, + disconnectWagmi +} from './wagmi'; +import { + createConfig, + disconnect, + getAccount, + watchAccount, + type Config, + type GetAccountReturnType +} from '@wagmi/core'; +import { mainnet, type Chain } from '@wagmi/core/chains'; + +vi.mock('@wagmi/core', async (importOriginal) => ({ + ...(await importOriginal()), + createConfig: vi.fn(), + disconnect: vi.fn(), + getAccount: vi.fn(), + watchAccount: vi.fn(), + reconnect: vi.fn(), + http: vi.fn() +})); + +vi.mock('@reown/appkit', () => ({ + createAppKit: vi.fn(() => ({ + open: vi.fn(), + subscribeEvents: vi.fn() + })) +})); + +describe('wagmi store', () => { + beforeEach(() => { + // Reset all stores to initial state + connected.set(false); + wagmiLoaded.set(false); + chainId.set(null); + signerAddress.set(null); + configuredConnectors.set([]); + loading.set(true); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + describe('defaultConfig', () => { + it('should initialize with correct default values', () => { + const mockConfig = { chains: [mainnet], subscribe: vi.fn() }; + vi.mocked(createConfig).mockReturnValue(mockConfig as unknown as Config); + + const result = defaultConfig({ + appName: 'Test App', + projectId: 'test-project-id', + connectors: [] + }); + + expect(result).toHaveProperty('init'); + expect(get(wagmiLoaded)).toBe(true); + }); + }); + + describe('init', () => { + it('should initialize wallet connection successfully', async () => { + const mockAccount = { + address: '0x123' as `0x${string}`, + addresses: ['0x123'] as readonly `0x${string}`[], + chainId: 1, + chain: mainnet, + connector: undefined, + isConnected: true, + isConnecting: false, + isDisconnected: false, + isReconnecting: false, + status: 'connected' as const + }; + + vi.mocked(getAccount).mockReturnValue( + mockAccount as unknown as GetAccountReturnType + ); + vi.mocked(watchAccount).mockImplementation(() => { + return () => {}; + }); + + await init(); + + expect(get(connected)).toBe(true); + expect(get(signerAddress)).toBe('0x123'); + expect(get(loading)).toBe(false); + }); + + it('should handle initialization failure', async () => { + vi.mocked(getAccount).mockImplementation(() => { + throw new Error('Connection failed'); + }); + + await init(); + + expect(get(connected)).toBe(false); + expect(get(loading)).toBe(false); + }); + }); + + describe('disconnectWagmi', () => { + it('should disconnect wallet and reset stores', async () => { + connected.set(true); + chainId.set(1); + signerAddress.set('0x123'); + + await disconnectWagmi(); + + expect(vi.mocked(disconnect)).toHaveBeenCalled(); + expect(get(connected)).toBe(false); + expect(get(chainId)).toBe(null); + expect(get(signerAddress)).toBe(null); + expect(get(loading)).toBe(false); + }); + }); +}); diff --git a/packages/webapp/src/lib/stores/wagmi.ts b/packages/webapp/src/lib/stores/wagmi.ts new file mode 100644 index 000000000..62814dc91 --- /dev/null +++ b/packages/webapp/src/lib/stores/wagmi.ts @@ -0,0 +1,194 @@ +import { writable, get } from 'svelte/store'; +import { + createConfig, + getAccount, + disconnect, + watchAccount, + reconnect, + type CreateConnectorFn, + type GetAccountReturnType, + type Config, + http +} from '@wagmi/core'; +import { type Chain } from '@wagmi/core/chains'; +import { AppKit, createAppKit } from '@reown/appkit'; +import { WagmiAdapter } from '@reown/appkit-adapter-wagmi'; +import { supportedChainsList } from '$lib/chains'; + +export const connected = writable(false); +export const wagmiLoaded = writable(false); +export const chainId = writable(null); +export const signerAddress = writable(null); +export const configuredConnectors = writable([]); +export const loading = writable(true); +export const appKitModal = writable(); +export const wagmiConfig = writable(); + +type DefaultConfigProps = { + appName: string; + appIcon?: string | null; + appDescription?: string | null; + appUrl?: string | null; + autoConnect?: boolean; + alchemyId?: string | null; + chains?: Chain[] | null; + connectors: CreateConnectorFn[]; + projectId: string; +}; + +export const defaultConfig = ({ + appName, + appDescription = null, + appUrl = null, + appIcon = null, + autoConnect = true, + chains = [], + connectors, + projectId +}: DefaultConfigProps) => { + if (connectors) configuredConnectors.set(connectors); + + const url = http(); + + const chainsToUse = chains ? chains.map((chain) => chain) : []; + const transports = chains + ? chains.reduce( + (acc, chain) => ({ + ...acc, + [chain.id]: url + }), + {} + ) + : {}; + const config = createConfig({ + chains: [supportedChainsList[0], ...supportedChainsList.slice(1)] as [Chain, ...Chain[]], + transports, + connectors: get(configuredConnectors) + }); + + wagmiConfig.set(config); + + if (autoConnect) reconnect(config); + + const wagmiAdapter = new WagmiAdapter({ + projectId, + networks: chainsToUse + }); + + const metadata = { + name: appName, + description: appDescription || 'AppKit Integration', + url: appUrl || window.location.origin, + icons: appIcon ? [appIcon] : [] + }; + + const modal = createAppKit({ + adapters: [wagmiAdapter], + networks: [supportedChainsList[0], ...supportedChainsList.slice(1)] as [Chain, ...Chain[]], + metadata, + projectId, + features: { + analytics: false, + socials: [], + email: false + } + }); + + appKitModal.set(modal); + wagmiLoaded.set(true); + + return { init }; +}; + +export const init = async () => { + try { + setupListeners(); + const account = await waitForConnection(); + if (account.address) { + const chain = get(wagmiConfig).chains.find((chain) => chain.id === account.chainId); + if (chain) chainId.set(chain.id); + connected.set(true); + signerAddress.set(account.address); + } + loading.set(false); + } catch { + loading.set(false); + } +}; + +const setupListeners = () => { + watchAccount(get(wagmiConfig), { + onChange(data) { + handleAccountChange(data); + } + }); +}; + +const handleAccountChange = (data: GetAccountReturnType) => { + return (async () => { + if (get(wagmiLoaded) && data.address) { + const chain = get(wagmiConfig).chains.find((chain) => chain.id === data.chainId); + + if (chain) chainId.set(chain.id); + connected.set(true); + loading.set(false); + signerAddress.set(data.address); + } else if (data.isDisconnected && get(connected)) { + loading.set(false); + await disconnectWagmi(); + } + })(); +}; + +export const WC = async () => { + try { + get(appKitModal).open(); + await waitForAccount(); + + return { success: true }; + } catch { + return { success: false }; + } +}; + +export const disconnectWagmi = async () => { + await disconnect(get(wagmiConfig)); + connected.set(false); + chainId.set(null); + signerAddress.set(null); + loading.set(false); +}; + +const waitForAccount = () => { + return new Promise((resolve, reject) => { + const unsub1 = get(appKitModal).subscribeEvents((newState) => { + if (newState.data.event === 'MODAL_CLOSE') { + reject('modal closed'); + unsub1(); + } + }); + const unsub = watchAccount(get(wagmiConfig), { + onChange(data) { + if (data?.isConnected) { + resolve(data); + unsub(); + } + } + }); + }); +}; + +const waitForConnection = (): Promise => + new Promise((resolve, reject) => { + const attemptToGetAccount = () => { + const account = getAccount(get(wagmiConfig)); + if (account.isDisconnected) reject('account is disconnected'); + if (account.isConnecting) { + setTimeout(attemptToGetAccount, 250); + } else { + resolve(account); + } + }; + + attemptToGetAccount(); + }); diff --git a/packages/webapp/src/routes/+layout.svelte b/packages/webapp/src/routes/+layout.svelte index efd62437d..8b97f8fe4 100644 --- a/packages/webapp/src/routes/+layout.svelte +++ b/packages/webapp/src/routes/+layout.svelte @@ -3,6 +3,14 @@ import { QueryClient, QueryClientProvider } from '@tanstack/svelte-query'; import Sidebar from '$lib/components/Sidebar.svelte'; import { colorTheme } from '$lib/darkMode'; + import { browser } from '$app/environment'; + import { supportedChainsList } from '$lib/chains'; + import { defaultConfig } from '$lib/stores/wagmi'; + import { injected } from '@wagmi/connectors'; + import { type Chain } from '@wagmi/core/chains'; + import { PUBLIC_WALLETCONNECT_PROJECT_ID } from '$env/static/public'; + + import { page } from '$app/stores'; const queryClient = new QueryClient({ defaultOptions: { queries: { @@ -10,12 +18,26 @@ } } }); + + const initWallet = async () => { + const erckit = defaultConfig({ + appName: 'Rain Language', + connectors: [injected()], + chains: supportedChainsList as unknown as Chain[], + projectId: PUBLIC_WALLETCONNECT_PROJECT_ID + }); + await erckit.init(); + }; + + $: if (browser && window.navigator) { + initWallet(); + }
- -
+ +
diff --git a/packages/webapp/src/routes/+layout.ts b/packages/webapp/src/routes/+layout.ts index de666886a..43a317565 100644 --- a/packages/webapp/src/routes/+layout.ts +++ b/packages/webapp/src/routes/+layout.ts @@ -6,7 +6,9 @@ import type { } from '@rainlanguage/ui-components'; import { writable, derived } from 'svelte/store'; import pkg from 'lodash'; + const { pickBy } = pkg; + export interface LayoutData { stores: AppStoresInterface; } @@ -16,8 +18,8 @@ export const load = async () => { 'https://raw.githubusercontent.com/rainlanguage/rain.strategies/refs/heads/main/settings.json' ); const settingsJson = await response.json(); - const activeNetworkRef = writable(''); const settings = writable(settingsJson); + const activeNetworkRef = writable(''); const activeOrderbookRef = writable(''); const activeOrderbook = derived( [settings, activeOrderbookRef], @@ -26,11 +28,7 @@ export const load = async () => { ? $settings.orderbooks[$activeOrderbookRef] : undefined ); - const subgraphUrl = derived([settings, activeOrderbook], ([$settings, $activeOrderbook]) => - $settings?.subgraphs !== undefined && $activeOrderbook?.subgraph !== undefined - ? $settings.subgraphs[$activeOrderbook.subgraph] - : undefined - ); + const activeNetworkOrderbooks = derived( [settings, activeNetworkRef], ([$settings, $activeNetworkRef]) => @@ -45,6 +43,11 @@ export const load = async () => { const accounts = derived(settings, ($settings) => $settings?.accounts); const activeAccountsItems = writable>({}); + const subgraphUrl = derived([settings, activeOrderbook], ([$settings, $activeOrderbook]) => + $settings?.subgraphs !== undefined && $activeOrderbook?.subgraph !== undefined + ? $settings.subgraphs[$activeOrderbook.subgraph] + : undefined + ); const activeAccounts = derived( [accounts, activeAccountsItems], ([$accounts, $activeAccountsItems]) => @@ -54,6 +57,7 @@ export const load = async () => { Object.entries($accounts || {}).filter(([key]) => key in $activeAccountsItems) ) ); + return { stores: { settings, diff --git a/packages/webapp/src/routes/deploy/+page.svelte b/packages/webapp/src/routes/deploy/+page.svelte index d6104a5d9..6dddc7b03 100644 --- a/packages/webapp/src/routes/deploy/+page.svelte +++ b/packages/webapp/src/routes/deploy/+page.svelte @@ -1,7 +1,11 @@
- + + +
diff --git a/packages/webapp/src/tests/Sidebar.test.ts b/packages/webapp/src/tests/Sidebar.test.ts new file mode 100644 index 000000000..d48f8bed7 --- /dev/null +++ b/packages/webapp/src/tests/Sidebar.test.ts @@ -0,0 +1,111 @@ +import { render, cleanup, screen, fireEvent, waitFor } from '@testing-library/svelte'; +import { vi, describe, it, expect, afterEach } from 'vitest'; +import Sidebar from '../lib/components/Sidebar.svelte'; +import { writable } from 'svelte/store'; + +vi.mock('@rainlanguage/ui-components', async () => { + const MockComponent = (await import('../lib/__mocks__/MockComponent.svelte')).default; + return { + ButtonDarkMode: MockComponent, + logoLight: 'mock-logo-light.svg', + logoDark: 'mock-logo-dark.svg', + IconTelegram: MockComponent, + IconExternalLink: MockComponent + }; +}); + +vi.mock('svelte/store', () => { + return { + writable: () => ({ + subscribe: () => { + return () => {}; + }, + set: vi.fn() + }) + }; +}); + +const mockWindowSize = (width: number) => { + Object.defineProperty(window, 'innerWidth', { writable: true, configurable: true, value: width }); + window.dispatchEvent(new Event('resize')); +}; + +describe('Sidebar', () => { + afterEach(() => { + cleanup(); + }); + + it('renders correctly with colorTheme store', async () => { + const mockColorTheme = writable('light'); + const mockPage = { + url: { pathname: '/' } + }; + const { container } = render(Sidebar, { + props: { + colorTheme: mockColorTheme, + page: mockPage + } + }); + + expect(container).toBeTruthy(); + }); + it('renders menu bars button when screen width is small', () => { + // Mock small screen width + mockWindowSize(500); + const mockColorTheme = writable('light'); + const mockPage = { + url: { pathname: '/' } + }; + render(Sidebar, { colorTheme: mockColorTheme, page: mockPage }); + + const barsButton = screen.getByTestId('sidebar-bars'); + expect(barsButton).toBeInTheDocument(); + }); + it('shows sidebar on wide screen', () => { + mockWindowSize(1025); + const mockColorTheme = writable('light'); + const mockPage = { + url: { pathname: '/' } + }; + render(Sidebar, { colorTheme: mockColorTheme, page: mockPage }); + + expect(screen.getByTestId('sidebar')).toBeInTheDocument(); + }); + it('renders sidebar when bars button is clicked', async () => { + // Mock small screen width + mockWindowSize(500); + const mockColorTheme = writable('light'); + const mockPage = { + url: { pathname: '/' } + }; + render(Sidebar, { colorTheme: mockColorTheme, page: mockPage }); + + const barsButton = screen.getByTestId('sidebar-bars'); + fireEvent.click(barsButton); + + await waitFor(() => { + const sidebar = screen.getByTestId('sidebar'); + expect(sidebar.hidden).toBe(false); + }); + }); + it('hides sidebar when close button is clicked', async () => { + mockWindowSize(500); + const mockColorTheme = writable('light'); + const mockPage = { + url: { pathname: '/' } + }; + render(Sidebar, { colorTheme: mockColorTheme, page: mockPage }); + + const barsButton = screen.getByTestId('sidebar-bars'); + await fireEvent.click(barsButton); + await waitFor(() => { + expect(screen.getByTestId('sidebar')).toBeInTheDocument(); + }); + const closeButton = screen.getByTestId('close-button'); + await fireEvent.click(closeButton); + await waitFor(() => { + const sidebar = screen.getByTestId('sidebar'); + expect(sidebar.hidden).toBe(true); + }); + }); +}); diff --git a/packages/webapp/test-setup.ts b/packages/webapp/test-setup.ts new file mode 100644 index 000000000..d24aad058 --- /dev/null +++ b/packages/webapp/test-setup.ts @@ -0,0 +1,10 @@ +import '@testing-library/jest-dom/vitest'; +import { vi } from 'vitest'; + +vi.mock('@reown/appkit', () => ({ + default: vi.fn() +})); +// Mock for codemirror-rainlang +vi.mock('codemirror-rainlang', () => ({ + RainlangLR: vi.fn() +})); diff --git a/packages/webapp/tsconfig.json b/packages/webapp/tsconfig.json index 0b2d8865f..a988e6702 100644 --- a/packages/webapp/tsconfig.json +++ b/packages/webapp/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { + "allowImportingTsExtensions": true, + "allowArbitraryExtensions": true, "allowJs": true, "checkJs": true, "esModuleInterop": true, @@ -9,11 +11,8 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler" - } - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes - // from the referenced tsconfig.json - TypeScript does not merge them in -} + "module": "es2022", + "moduleResolution": "bundler", + "types": ["vitest/globals", "@testing-library/jest-dom", "vitest/importMeta", "codemirror-rainlang", "@rainlanguage/dotrain"] + }, +} \ No newline at end of file diff --git a/packages/webapp/vite.config.ts b/packages/webapp/vite.config.ts index d76fc8a56..848d89537 100644 --- a/packages/webapp/vite.config.ts +++ b/packages/webapp/vite.config.ts @@ -1,10 +1,38 @@ import { defineConfig } from 'vitest/config'; import { sveltekit } from '@sveltejs/kit/vite'; +import {loadEnv} from "vite"; -export default defineConfig({ +export default defineConfig(({ mode }) => ({ + assetsInclude: ['**/*.rain'], plugins: [sveltekit()], + resolve: { + conditions: mode === 'test' ? ['browser'] : [] + }, + define: { + 'process.env': {}, + 'import.meta.vitest': 'undefined' + }, test: { - include: ['src/**/*.{test,spec}.{js,ts}'] + // Jest like globals + includeSource: ['src/**/*.{js,ts}'], + globals: true, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.ts'], + // Extend jest-dom matchers + setupFiles: ['./test-setup.ts'], + // load env vars + env: loadEnv('', process.cwd(), ''), + testTimeout: 10000, + server: { + deps: { + inline: [ + /@reown\/appkit/, /@tanstack\/svelte-query/ + ] + } + }, + deps: { + interopDefault: true + } } -}); +})); diff --git a/prep-all.sh b/prep-all.sh index 42145c858..b5095296c 100755 --- a/prep-all.sh +++ b/prep-all.sh @@ -23,6 +23,7 @@ keep=( -k CI_SEPOLIA_METABOARD_URL -k RPC_URL_ETHEREUM_FORK -k COMMIT_SHA + -k PUBLIC_WALLETCONNECT_PROJECT_ID ) echo "Installing Forge dependencies..." diff --git a/tauri-app/src/lib/components/DropdownActiveNetwork.svelte b/tauri-app/src/lib/components/DropdownActiveNetwork.svelte deleted file mode 100644 index df7a59b9c..000000000 --- a/tauri-app/src/lib/components/DropdownActiveNetwork.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - - -{#if !isEmpty($settings?.networks)} - - - {#if selectedRef === undefined} - Select a network - {:else if selectedOption?.label} - {selectedOption.label} - {:else} - {selectedRef} - {/if} - - - -
-
{option.label ? option.label : ref}
- {option.rpc} -
-
-
-{/if} diff --git a/tauri-app/src/lib/components/DropdownActiveOrderbook.svelte b/tauri-app/src/lib/components/DropdownActiveOrderbook.svelte deleted file mode 100644 index 3cf66909e..000000000 --- a/tauri-app/src/lib/components/DropdownActiveOrderbook.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - -{#if isEmpty($activeNetworkOrderbooks)} - -{:else} - - - {#if selectedRef === undefined} - Select an orderbook - {:else if selectedOption?.label} - {selectedOption.label} - {:else} - {selectedRef} - {/if} - - - -
-
{option.label ? option.label : ref}
- {option.address} -
-
-
-{/if} diff --git a/tauri-app/src/lib/components/InputBlockNumber.svelte b/tauri-app/src/lib/components/InputBlockNumber.svelte deleted file mode 100644 index 1688f8e6e..000000000 --- a/tauri-app/src/lib/components/InputBlockNumber.svelte +++ /dev/null @@ -1,50 +0,0 @@ - - -
-
- -
- -
-
-
diff --git a/tauri-app/src/lib/components/InputHex.svelte b/tauri-app/src/lib/components/InputHex.svelte deleted file mode 100644 index ea13114fb..000000000 --- a/tauri-app/src/lib/components/InputHex.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - - diff --git a/tauri-app/src/lib/components/InputVaultId.svelte b/tauri-app/src/lib/components/InputVaultId.svelte index 7e3deb59c..48a30a853 100644 --- a/tauri-app/src/lib/components/InputVaultId.svelte +++ b/tauri-app/src/lib/components/InputVaultId.svelte @@ -1,6 +1,6 @@ diff --git a/tauri-app/src/lib/components/PageContentDetail.svelte b/tauri-app/src/lib/components/PageContentDetail.svelte deleted file mode 100644 index 407683e9d..000000000 --- a/tauri-app/src/lib/components/PageContentDetail.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - -{#if !isEmpty} -
- -
-
-
- -
-
- -
-
-
- -
-{:else if isFetching} -
- -
-{:else} -
{emptyMessage}
-{/if} diff --git a/tauri-app/src/lib/components/SkeletonRow.svelte b/tauri-app/src/lib/components/SkeletonRow.svelte deleted file mode 100644 index 49e5068a6..000000000 --- a/tauri-app/src/lib/components/SkeletonRow.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - -
diff --git a/tauri-app/src/lib/components/charts/LightweightChartHistogram.svelte b/tauri-app/src/lib/components/charts/LightweightChartHistogram.svelte deleted file mode 100644 index 96e21b07f..000000000 --- a/tauri-app/src/lib/components/charts/LightweightChartHistogram.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - chart.addHistogramSeries()} - {...$$props} - {lightweightChartsTheme} -/> diff --git a/tauri-app/src/lib/components/charts/LightweightChartLine.svelte b/tauri-app/src/lib/components/charts/LightweightChartLine.svelte deleted file mode 100644 index 759ad08ff..000000000 --- a/tauri-app/src/lib/components/charts/LightweightChartLine.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - chart.addLineSeries({ lineWidth: 1 })} - {...$$props} - {lightweightChartsTheme} -/> diff --git a/tauri-app/src/lib/components/detail/OrderDetail.svelte b/tauri-app/src/lib/components/detail/OrderDetail.svelte deleted file mode 100644 index e69de29bb..000000000