diff --git a/contract/contract/src/base/errors.rs b/contract/contract/src/base/errors.rs index 593df9a..e3c0498 100644 --- a/contract/contract/src/base/errors.rs +++ b/contract/contract/src/base/errors.rs @@ -51,4 +51,6 @@ pub enum CrowdfundingError { PoolAlreadyClosed = 45, PoolNotDisbursedOrRefunded = 46, InsufficientFees = 47, + /// Basis points must be in the range [0, 10_000] (i.e. 0–100 %) + InvalidFeeBasisPoints = 48, } diff --git a/contract/contract/src/base/fees.rs b/contract/contract/src/base/fees.rs new file mode 100644 index 0000000..4561e2e --- /dev/null +++ b/contract/contract/src/base/fees.rs @@ -0,0 +1,150 @@ +use crate::base::errors::CrowdfundingError; + +/// One hundred percent expressed in basis points. +pub const MAX_BASIS_POINTS: u32 = 10_000; + +/// Calculate a platform fee using basis points. +/// +/// # Arguments +/// * `amount` – The donation / contribution amount (in the token's smallest unit). +/// * `basis_points` – Fee rate in basis points, e.g. `250` = 2.50 %. +/// Must be in the range `[0, 10_000]`. +/// +/// # Returns +/// The fee portion that should be retained by the platform, rounded down. +/// +/// # Errors +/// Returns [`CrowdfundingError::InvalidFeeBasisPoints`] when `basis_points > 10_000`. +/// Returns [`CrowdfundingError::InvalidAmount`] when `amount < 0`. +/// +/// # Overflow safety +/// The internal multiplication is performed using `i128::checked_mul` so the +/// function never panics even for the maximum `i128` donation value. +pub fn calculate_platform_fee( + amount: i128, + basis_points: u32, +) -> Result { + if amount < 0 { + return Err(CrowdfundingError::InvalidAmount); + } + + if basis_points > MAX_BASIS_POINTS { + return Err(CrowdfundingError::InvalidFeeBasisPoints); + } + + // Zero fee short-circuit – avoids any arithmetic entirely. + if basis_points == 0 || amount == 0 { + return Ok(0); + } + + // Overflow-safe path: + // fee = amount * basis_points / 10_000 + // + // `i128::MAX * 10_000` overflows i128 (i128::MAX ≈ 1.7 × 10^38, and + // 10_000 * 1.7 × 10^38 > i128::MAX), so we use checked_mul and fall + // back to a wide-integer division when the intermediate value would + // overflow. + let fee = match amount.checked_mul(basis_points as i128) { + Some(product) => product / MAX_BASIS_POINTS as i128, + None => { + // amount is too large to multiply directly – divide first to keep + // values in range, then multiply. This loses at most + // (MAX_BASIS_POINTS - 1) units of precision but never overflows. + (amount / MAX_BASIS_POINTS as i128) * basis_points as i128 + } + }; + + Ok(fee) +} + +#[cfg(test)] +mod unit_tests { + use super::*; + + // ── happy-path ──────────────────────────────────────────────────────── + + #[test] + fn zero_fee_on_zero_bps() { + assert_eq!(calculate_platform_fee(1_000_000, 0).unwrap(), 0); + } + + #[test] + fn zero_fee_on_zero_amount() { + assert_eq!(calculate_platform_fee(0, 250).unwrap(), 0); + } + + #[test] + fn two_and_a_half_percent_small_amount() { + // 250 bps on 1_000 → 25 + assert_eq!(calculate_platform_fee(1_000, 250).unwrap(), 25); + } + + #[test] + fn two_and_a_half_percent_large_amount() { + // 250 bps on 10_000_000_000 → 250_000_000 + assert_eq!( + calculate_platform_fee(10_000_000_000, 250).unwrap(), + 250_000_000 + ); + } + + #[test] + fn one_percent() { + // 100 bps on 5_000 → 50 + assert_eq!(calculate_platform_fee(5_000, 100).unwrap(), 50); + } + + #[test] + fn full_hundred_percent() { + // 10_000 bps (100%) on 888 → 888 + assert_eq!(calculate_platform_fee(888, 10_000).unwrap(), 888); + } + + #[test] + fn flooring_behaviour() { + // 300 bps on 1 → floor(0.03) = 0 + assert_eq!(calculate_platform_fee(1, 300).unwrap(), 0); + // 5000 bps on 1 → floor(0.5) = 0 + assert_eq!(calculate_platform_fee(1, 5_000).unwrap(), 0); + } + + #[test] + fn max_i128_amount_does_not_overflow() { + // i128::MAX with 250 bps – should not panic. + let result = calculate_platform_fee(i128::MAX, 250); + assert!(result.is_ok(), "should not overflow for i128::MAX"); + // fee must be positive and strictly less than the amount + let fee = result.unwrap(); + assert!(fee > 0); + assert!(fee < i128::MAX); + } + + #[test] + fn large_realistic_amount() { + // 1 billion XLM in stroops (1 XLM = 10^7 stroops) at 250 bps + // 1_000_000_000 × 10^7 = 10^16 stroops + let one_billion_xlm_stroops: i128 = 10_000_000_000_000_000; + let fee = calculate_platform_fee(one_billion_xlm_stroops, 250).unwrap(); + assert_eq!(fee, 250_000_000_000_000); // 2.5% + } + + // ── error cases ─────────────────────────────────────────────────────── + + #[test] + fn rejects_negative_amount() { + let err = calculate_platform_fee(-1, 250).unwrap_err(); + assert_eq!(err, CrowdfundingError::InvalidAmount); + } + + #[test] + fn rejects_basis_points_over_ten_thousand() { + let err = calculate_platform_fee(1_000, 10_001).unwrap_err(); + assert_eq!(err, CrowdfundingError::InvalidFeeBasisPoints); + } + + #[test] + fn rejects_extreme_basis_points() { + let err = calculate_platform_fee(1_000, u32::MAX).unwrap_err(); + assert_eq!(err, CrowdfundingError::InvalidFeeBasisPoints); + } +} diff --git a/contract/contract/src/base/mod.rs b/contract/contract/src/base/mod.rs index 893ea69..9c289d4 100644 --- a/contract/contract/src/base/mod.rs +++ b/contract/contract/src/base/mod.rs @@ -1,3 +1,4 @@ pub mod errors; pub mod events; +pub mod fees; pub mod types; diff --git a/contract/contract/src/crowdfunding.rs b/contract/contract/src/crowdfunding.rs index fc08121..01e220b 100644 --- a/contract/contract/src/crowdfunding.rs +++ b/contract/contract/src/crowdfunding.rs @@ -1276,6 +1276,25 @@ impl CrowdfundingTrait for CrowdfundingContract { Ok(()) } + + /// Compute the platform fee for `amount` at the given `basis_points` rate. + /// + /// This is a **pure, read-only** function — it does not write any state. + /// Clients (frontend, other contracts) can call it to preview the fee that + /// will be deducted before crediting a pool. + /// + /// # Examples + /// ```text + /// 250 bps on 10_000 stroops → 25 stroops (2.5 %) + /// 100 bps on 5_000 stroops → 50 stroops (1.0 %) + /// ``` + fn calculate_platform_fee( + _env: Env, + amount: i128, + basis_points: u32, + ) -> Result { + crate::base::fees::calculate_platform_fee(amount, basis_points) + fn set_emergency_contact(env: Env, contact: Address) -> Result<(), CrowdfundingError> { let admin: Address = env .storage() diff --git a/contract/contract/src/interfaces/crowdfunding.rs b/contract/contract/src/interfaces/crowdfunding.rs index 63914fd..b09fa2e 100644 --- a/contract/contract/src/interfaces/crowdfunding.rs +++ b/contract/contract/src/interfaces/crowdfunding.rs @@ -154,6 +154,19 @@ pub trait CrowdfundingTrait { amount: i128, ) -> Result<(), CrowdfundingError>; + + /// Calculate the platform fee for a given `amount` using basis points. + /// + /// * `amount` – raw token amount (must be ≥ 0) + /// * `basis_points` – fee rate in bps; 250 = 2.50 % (must be ≤ 10 000) + /// + /// Returns the fee to be retained, or an error if inputs are invalid. + fn calculate_platform_fee( + env: Env, + amount: i128, + basis_points: u32, + ) -> Result; + fn set_emergency_contact(env: Env, contact: Address) -> Result<(), CrowdfundingError>; fn get_emergency_contact(env: Env) -> Result; diff --git a/contract/contract/test/mod.rs b/contract/contract/test/mod.rs index 1711cf2..a2fba5a 100644 --- a/contract/contract/test/mod.rs +++ b/contract/contract/test/mod.rs @@ -1,5 +1,7 @@ mod close_pool_test; mod create_pool; mod crowdfunding_test; + +mod platform_fee_test; mod renounce_admin_test; mod verify_cause; diff --git a/contract/contract/test/platform_fee_test.rs b/contract/contract/test/platform_fee_test.rs new file mode 100644 index 0000000..c7ad329 --- /dev/null +++ b/contract/contract/test/platform_fee_test.rs @@ -0,0 +1,128 @@ +/// Integration tests for `calculate_platform_fee` via the Soroban contract client. +/// +/// Unlike the unit tests in `base/fees.rs`, these tests exercise the full +/// contract dispatch path — i.e. they call through `CrowdfundingContractClient` +/// the same way a real off-chain caller would. +#[cfg(test)] +mod tests { + use soroban_sdk::Env; + use crate::{CrowdfundingContract, CrowdfundingContractClient}; + use crate::base::errors::CrowdfundingError; + + /// Spin up a minimal test environment and return a client. + /// `calculate_platform_fee` is pure and does not touch storage, so we + /// only need to register the contract — no `initialize` call is required. + fn setup(env: &Env) -> CrowdfundingContractClient<'_> { + env.mock_all_auths(); + let contract_id = env.register(CrowdfundingContract, ()); + CrowdfundingContractClient::new(env, &contract_id) + } + + // ── happy-path ──────────────────────────────────────────────────────── + + #[test] + fn two_and_half_percent_small() { + let env = Env::default(); + let client = setup(&env); + // 250 bps on 1_000 → 25 + assert_eq!(client.calculate_platform_fee(&1_000, &250), 25); + } + + #[test] + fn two_and_half_percent_large() { + let env = Env::default(); + let client = setup(&env); + // 250 bps on 10_000_000_000 → 250_000_000 + assert_eq!( + client.calculate_platform_fee(&10_000_000_000, &250), + 250_000_000 + ); + } + + #[test] + fn one_percent() { + let env = Env::default(); + let client = setup(&env); + // 100 bps on 5_000 → 50 + assert_eq!(client.calculate_platform_fee(&5_000, &100), 50); + } + + #[test] + fn zero_bps_yields_zero_fee() { + let env = Env::default(); + let client = setup(&env); + assert_eq!(client.calculate_platform_fee(&999_999, &0), 0); + } + + #[test] + fn zero_amount_yields_zero_fee() { + let env = Env::default(); + let client = setup(&env); + assert_eq!(client.calculate_platform_fee(&0, &250), 0); + } + + #[test] + fn full_hundred_percent() { + let env = Env::default(); + let client = setup(&env); + // 10_000 bps = 100% → fee == amount + assert_eq!(client.calculate_platform_fee(&888, &10_000), 888); + } + + #[test] + fn no_overflow_on_large_amount() { + let env = Env::default(); + let client = setup(&env); + // i128::MAX with 250 bps – must not panic and must be > 0 + let fee = client.calculate_platform_fee(&i128::MAX, &250); + assert!(fee > 0); + assert!(fee < i128::MAX); + } + + #[test] + fn realistic_xlm_stroop_amount() { + let env = Env::default(); + let client = setup(&env); + // 1 billion XLM in stroops at 250 bps + let billion_xlm: i128 = 10_000_000_000_000_000; + assert_eq!( + client.calculate_platform_fee(&billion_xlm, &250), + 250_000_000_000_000 // 2.5% + ); + } + + // ── error cases ─────────────────────────────────────────────────────── + + #[test] + fn rejects_negative_amount() { + let env = Env::default(); + let client = setup(&env); + let result = client.try_calculate_platform_fee(&-1, &250); + assert_eq!( + result.unwrap_err().unwrap(), + CrowdfundingError::InvalidAmount + ); + } + + #[test] + fn rejects_bps_over_ten_thousand() { + let env = Env::default(); + let client = setup(&env); + let result = client.try_calculate_platform_fee(&1_000, &10_001); + assert_eq!( + result.unwrap_err().unwrap(), + CrowdfundingError::InvalidFeeBasisPoints + ); + } + + #[test] + fn rejects_extreme_bps() { + let env = Env::default(); + let client = setup(&env); + let result = client.try_calculate_platform_fee(&1_000, &u32::MAX); + assert_eq!( + result.unwrap_err().unwrap(), + CrowdfundingError::InvalidFeeBasisPoints + ); + } +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4bccfe8..137f6ea 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -122,6 +122,17 @@ "tslib": "^2.4.0" } }, + + "node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + + "node_modules/@emnapi/runtime": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", @@ -132,6 +143,16 @@ "tslib": "^2.4.0" } }, + + "node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + + "node_modules/@emnapi/wasi-threads": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", @@ -143,6 +164,17 @@ "tslib": "^2.4.0" } }, + + "node_modules/@emnapi/wasi-threads/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + + "node_modules/@emurgo/cardano-serialization-lib-browser": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-13.2.1.tgz", @@ -1058,6 +1090,14 @@ "tslib": "^2.1.0" } }, + + "node_modules/@ledgerhq/devices/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@ledgerhq/errors": { "version": "6.29.0", "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.29.0.tgz", @@ -1147,6 +1187,14 @@ "tslib": "^2.3.1" } }, + + "node_modules/@motionone/animation/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@motionone/dom": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", @@ -1161,6 +1209,14 @@ "tslib": "^2.3.1" } }, + + "node_modules/@motionone/dom/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@motionone/easing": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", @@ -1171,6 +1227,14 @@ "tslib": "^2.3.1" } }, + + "node_modules/@motionone/easing/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@motionone/generators": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", @@ -1182,6 +1246,14 @@ "tslib": "^2.3.1" } }, + + "node_modules/@motionone/generators/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@motionone/svelte": { "version": "10.16.4", "resolved": "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.4.tgz", @@ -1192,6 +1264,14 @@ "tslib": "^2.3.1" } }, + + "node_modules/@motionone/svelte/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@motionone/types": { "version": "10.17.1", "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", @@ -1209,6 +1289,14 @@ "tslib": "^2.3.1" } }, + + "node_modules/@motionone/utils/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@motionone/vue": { "version": "10.16.4", "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.4.tgz", @@ -1220,6 +1308,14 @@ "tslib": "^2.3.1" } }, + + "node_modules/@motionone/vue/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -1233,6 +1329,7 @@ "@tybys/wasm-util": "^0.10.0" } }, + "node_modules/@near-js/accounts": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@near-js/accounts/-/accounts-1.4.1.tgz", @@ -1259,6 +1356,7 @@ "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", "license": "Apache-2.0" }, + "node_modules/@near-js/crypto": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@near-js/crypto/-/crypto-1.4.2.tgz", @@ -1279,6 +1377,7 @@ "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", "license": "Apache-2.0" }, + "node_modules/@near-js/keystores": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@near-js/keystores/-/keystores-0.2.2.tgz", @@ -1395,6 +1494,7 @@ "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", "license": "Apache-2.0" }, + "node_modules/@near-js/types": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@near-js/types/-/types-0.3.1.tgz", @@ -1413,6 +1513,7 @@ "mustache": "4.0.0" } }, + "node_modules/@near-js/wallet-account": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@near-js/wallet-account/-/wallet-account-1.3.3.tgz", @@ -1436,6 +1537,7 @@ "integrity": "sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==", "license": "Apache-2.0" }, + "node_modules/@near-wallet-selector/core": { "version": "8.10.2", "resolved": "https://registry.npmjs.org/@near-wallet-selector/core/-/core-8.10.2.tgz", @@ -1611,7 +1713,9 @@ "resolved": "https://registry.npmjs.org/@ngneat/elf/-/elf-2.5.1.tgz", "integrity": "sha512-13BItNZFgHglTiXuP9XhisNczwQ5QSzH+imAv9nAPsdbCq/3ortqkIYRnlxB8DGPVcuIjLujQ4OcZa+9QWgZtw==", "license": "MIT", + "peer": true, + "peerDependencies": { "rxjs": ">=7.0.0" } @@ -2691,7 +2795,9 @@ "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.3.0.tgz", "integrity": "sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==", "license": "MIT", + "peer": true, + "dependencies": { "@solana/accounts": "2.3.0", "@solana/addresses": "2.3.0", @@ -3048,7 +3154,9 @@ "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.3.0.tgz", "integrity": "sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==", "license": "MIT", + "peer": true, + "dependencies": { "@solana/accounts": "2.3.0", "@solana/codecs": "2.3.0", @@ -3171,7 +3279,9 @@ "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", "license": "MIT", + "peer": true, + "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -3372,6 +3482,25 @@ "license": "Apache-2.0" }, "node_modules/@stellar/stellar-base": { + + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.1.0.tgz", + "integrity": "sha512-90EArG+eCCEzDGj3OJNoCtwpWDwxjv+rs/RNPhvg4bulpjN/CSRj+Ys/SalRcfM4/WRC5/qAfjzmJBAuquWhkA==", + "license": "Apache-2.0", + "dependencies": { + "@stellar/js-xdr": "^3.1.2", + "base32.js": "^0.1.0", + "bignumber.js": "^9.1.2", + "buffer": "^6.0.3", + "sha.js": "^2.3.6", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "sodium-native": "^4.3.3" + "version": "14.0.4", "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-14.0.4.tgz", "integrity": "sha512-UbNW6zbdOBXJwLAV2mMak0bIC9nw3IZVlQXkv2w2dk1jgCbJjy3oRVC943zeGE5JAm0Z9PHxrIjmkpGhayY7kw==", @@ -3413,6 +3542,7 @@ }, "funding": { "url": "https://paulmillr.com/funding/" + } }, "node_modules/@stellar/stellar-sdk": { @@ -3420,7 +3550,9 @@ "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-13.3.0.tgz", "integrity": "sha512-8+GHcZLp+mdin8gSjcgfb/Lb6sSMYRX6Nf/0LcSJxvjLQR0XHpjGzOiRbYb2jSXo51EnA6kAV5j+4Pzh5OUKUg==", "license": "Apache-2.0", + "peer": true, + "dependencies": { "@stellar/stellar-base": "^13.1.0", "axios": "^1.8.4", @@ -3435,6 +3567,7 @@ "node": ">=18.0.0" } }, + "node_modules/@stellar/stellar-sdk/node_modules/@stellar/stellar-base": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-13.1.0.tgz", @@ -3454,7 +3587,7 @@ "optionalDependencies": { "sodium-native": "^4.3.3" } - }, + "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -3464,6 +3597,14 @@ "tslib": "^2.8.0" } }, + + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@tailwindcss/node": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.0.tgz", @@ -3736,6 +3877,15 @@ } }, "node_modules/@trezor/analytics": { + + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.4.2.tgz", + "integrity": "sha512-FgjJekuDvx1TjiDemvpnPiRck7Kp/v1ZeppsBYpQR3yGKyKzbG1pVpcl0RyI2237raXxbORaz7XV8tcyjq4BXg==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/env-utils": "1.4.2", + "@trezor/utils": "9.4.2" + "version": "1.5.0", "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.5.0.tgz", "integrity": "sha512-evILW5XJEmfPlf0TY1duOLtGJ47pdGeSKVE3P75ODEUsRNxtPVqlkOUBPmYpCxPnzS8XDmkatT8lf9/DF0G6nA==", @@ -3743,15 +3893,22 @@ "dependencies": { "@trezor/env-utils": "1.5.0", "@trezor/utils": "9.5.0" + }, "peerDependencies": { "tslib": "^2.6.2" } }, "node_modules/@trezor/analytics/node_modules/@trezor/env-utils": { + + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.2.tgz", + "integrity": "sha512-lQvrqcNK5I4dy2MuiLyMuEm0KzY59RIu2GLtc9GsvqyxSPZkADqVzGeLJjXj/vI2ajL8leSpMvmN4zPw3EK8AA==", + "version": "1.5.0", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.5.0.tgz", "integrity": "sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==", + "license": "See LICENSE.md in repo root", "dependencies": { "ua-parser-js": "^2.0.4" @@ -3774,6 +3931,42 @@ } } }, + + "node_modules/@trezor/analytics/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.5.2.tgz", + "integrity": "sha512-/egUnIt/fR57QY33ejnkPMhZwRvVRS/pUCoqdVIGitN1Q7QZsdopoR4hw37hdK/Ux/q1ZLH6LZz7U2UFahjppw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@solana-program/stake": "^0.2.1", + "@solana-program/token": "^0.5.1", + "@solana-program/token-2022": "^0.4.2", + "@solana/kit": "^2.1.1", + "@solana/rpc-types": "^2.1.1", + "@stellar/stellar-sdk": "^13.3.0", + "@trezor/blockchain-link-types": "1.4.2", + "@trezor/blockchain-link-utils": "1.4.2", + "@trezor/env-utils": "1.4.2", + "@trezor/utils": "9.4.2", + "@trezor/utxo-lib": "2.4.2", + "@trezor/websocket-client": "1.2.2", + "@types/web": "^0.0.197", + "events": "^3.3.0", + "socks-proxy-agent": "8.0.5", + "xrpl": "^4.3.0" + "node_modules/@trezor/blockchain-link": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.6.1.tgz", @@ -3798,12 +3991,21 @@ "socks-proxy-agent": "8.0.5", "stream-browserify": "^3.0.0", "xrpl": "4.4.3" + }, "peerDependencies": { "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link-types": { + + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.4.2.tgz", + "integrity": "sha512-KThBmGOFLJAFnmou9ThQhnjEVxfYPfEwMOaVTVNgJ+NAkt5rEMx0SKBBelCGZ63XtOLWdVPglFo83wtm+I9Vpg==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/utxo-lib": "2.4.2" + "version": "1.5.0", "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.5.0.tgz", "integrity": "sha512-wD6FKKxNr89MTWYL+NikRkBcWXhiWNFR0AuDHW6GHmlCEHhKu/hAvQtcER8X5jt/Wd0hSKNZqtHBXJ1ZkpJ6rg==", @@ -3811,12 +4013,25 @@ "dependencies": { "@trezor/utils": "9.5.0", "@trezor/utxo-lib": "2.5.0" + }, "peerDependencies": { "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link-utils": { + + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.4.2.tgz", + "integrity": "sha512-PBEBrdtHn0dn/c9roW6vjdHI/CucMywJm5gthETZAZmzBOtg6ZDpLTn+qL8+jZGIbwcAkItrQ3iHrHhR6xTP5g==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@mobily/ts-belt": "^3.13.1", + "@stellar/stellar-sdk": "^13.3.0", + "@trezor/env-utils": "1.4.2", + "@trezor/utils": "9.4.2", + "xrpl": "^4.3.0" + "version": "1.5.1", "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.5.1.tgz", "integrity": "sha512-2tDGLEj5jzydjsJQONGTWVmCDDy6FTZ4ytr1/2gE6anyYEJU8MbaR+liTt3UvcP5jwZTNutwYLvZixRfrb8JpA==", @@ -4057,11 +4272,15 @@ "@trezor/connect-common": "0.4.2", "@trezor/utils": "9.4.2", "@trezor/websocket-client": "1.2.2" + }, "peerDependencies": { "tslib": "^2.6.2" } }, + + "node_modules/@trezor/blockchain-link-utils/node_modules/@trezor/env-utils": { + "node_modules/@trezor/connect-web/node_modules/@trezor/analytics": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.4.2.tgz", @@ -4076,6 +4295,7 @@ } }, "node_modules/@trezor/connect-web/node_modules/@trezor/analytics/node_modules/@trezor/env-utils": { + "version": "1.4.2", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.2.tgz", "integrity": "sha512-lQvrqcNK5I4dy2MuiLyMuEm0KzY59RIu2GLtc9GsvqyxSPZkADqVzGeLJjXj/vI2ajL8leSpMvmN4zPw3EK8AA==", @@ -4101,6 +4321,15 @@ } } }, + + "node_modules/@trezor/blockchain-link-utils/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + "node_modules/@trezor/connect-web/node_modules/@trezor/blockchain-link": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.5.2.tgz", @@ -4123,11 +4352,15 @@ "events": "^3.3.0", "socks-proxy-agent": "8.0.5", "xrpl": "^4.3.0" + }, "peerDependencies": { "tslib": "^2.6.2" } }, + + "node_modules/@trezor/blockchain-link/node_modules/@trezor/env-utils": { + "node_modules/@trezor/connect-web/node_modules/@trezor/blockchain-link-types": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.4.2.tgz", @@ -4157,6 +4390,7 @@ } }, "node_modules/@trezor/connect-web/node_modules/@trezor/blockchain-link-utils/node_modules/@trezor/env-utils": { + "version": "1.4.2", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.2.tgz", "integrity": "sha512-lQvrqcNK5I4dy2MuiLyMuEm0KzY59RIu2GLtc9GsvqyxSPZkADqVzGeLJjXj/vI2ajL8leSpMvmN4zPw3EK8AA==", @@ -4182,6 +4416,21 @@ } } }, + + "node_modules/@trezor/blockchain-link/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/connect": { + "node_modules/@trezor/connect-web/node_modules/@trezor/blockchain-link/node_modules/@trezor/env-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.2.tgz", @@ -4209,6 +4458,7 @@ } }, "node_modules/@trezor/connect-web/node_modules/@trezor/connect": { + "version": "9.6.2", "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.6.2.tgz", "integrity": "sha512-XsSERBK+KnF6FPsATuhB9AEM0frekVLwAwFo35MRV9I4P+mdv6tnUiZUq8O8aoPbfJwDjtNJSYv+PMsKuRH6rg==", @@ -4250,7 +4500,11 @@ "tslib": "^2.6.2" } }, + + "node_modules/@trezor/connect-analytics": { + "node_modules/@trezor/connect-web/node_modules/@trezor/connect-analytics": { + "version": "1.3.5", "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.3.5.tgz", "integrity": "sha512-Aoi+EITpZZycnELQJEp9XV0mHFfaCQ6JE0Ka5mWuHtOny3nJdFLBrih4ipcEXJdJbww6pBxRJB09sJ19cTyacA==", @@ -4262,7 +4516,11 @@ "tslib": "^2.6.2" } }, + + "node_modules/@trezor/connect-common": { + "node_modules/@trezor/connect-web/node_modules/@trezor/connect-common": { + "version": "0.4.2", "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.4.2.tgz", "integrity": "sha512-ND5TTjrTPnJdfl8Wlhl9YtFWnY2u6FHM1dsPkNYCmyUKIMoflJ5cLn95Xabl6l1btHERYn3wTUvgEYQG7r8OVQ==", @@ -4275,6 +4533,12 @@ "tslib": "^2.6.2" } }, + + "node_modules/@trezor/connect-common/node_modules/@trezor/env-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.2.tgz", + "integrity": "sha512-lQvrqcNK5I4dy2MuiLyMuEm0KzY59RIu2GLtc9GsvqyxSPZkADqVzGeLJjXj/vI2ajL8leSpMvmN4zPw3EK8AA==", + "node_modules/@trezor/connect-web/node_modules/@trezor/connect-common/node_modules/@trezor/env-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.4.2.tgz", @@ -4320,6 +4584,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.5.0.tgz", "integrity": "sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==", + "license": "See LICENSE.md in repo root", "dependencies": { "ua-parser-js": "^2.0.4" @@ -4342,6 +4607,15 @@ } } }, + + "node_modules/@trezor/connect-common/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + "node_modules/@trezor/connect-web/node_modules/@trezor/protobuf": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.4.2.tgz", @@ -4351,11 +4625,38 @@ "@trezor/schema-utils": "1.3.4", "long": "5.2.5", "protobufjs": "7.4.0" + }, "peerDependencies": { "tslib": "^2.6.2" } }, + + "node_modules/@trezor/connect-plugin-stellar": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@trezor/connect-plugin-stellar/-/connect-plugin-stellar-9.2.1.tgz", + "integrity": "sha512-Orz5gFZzYFZs1+cTsgg8fz/VWFjhl7pqMCqD5DVNZpXW+wrjwBaRbcGJZ+ibkPKU3AlM7Uv3SVD/pjaQmAkZ2Q==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/utils": "9.4.1" + }, + "peerDependencies": { + "@stellar/stellar-sdk": "^13.3.0", + "@trezor/connect": "9.x.x", + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/connect-web": { + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.6.2.tgz", + "integrity": "sha512-QGuCjX8Bx9aCq1Pg52KifbbzYn00FQu9mCTDSgCVGH/HAzbxhcRkDKc86kFwW8z9NdJxw+XeVJq5Ky/js3iEDA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/connect": "9.6.2", + "@trezor/connect-common": "0.4.2", + "@trezor/utils": "9.4.2", + "@trezor/websocket-client": "1.2.2" +======= "node_modules/@trezor/connect-web/node_modules/@trezor/protocol": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.8.tgz", @@ -4395,12 +4696,14 @@ "tslib": "^2.6.2" } }, + "node_modules/@trezor/connect-web/node_modules/@trezor/type-utils": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.8.tgz", "integrity": "sha512-VtvkPXpwtMtTX9caZWYlMMTmhjUeDq4/1LGn0pSdjd4OuL/vQyuPWXCT/0RtlnRraW6R2dZF7rX2UON2kQIMTQ==", "license": "See LICENSE.md in repo root" }, + "node_modules/@trezor/connect-web/node_modules/@trezor/utils": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", @@ -4413,6 +4716,15 @@ "tslib": "^2.6.2" } }, + + "node_modules/@trezor/connect/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + "node_modules/@trezor/connect-web/node_modules/@trezor/utxo-lib": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.4.2.tgz", @@ -4436,11 +4748,15 @@ "typeforce": "^1.18.0", "varuint-bitcoin": "2.0.0", "wif": "^5.0.0" + }, "peerDependencies": { "tslib": "^2.6.2" } }, + + "node_modules/@trezor/connect/node_modules/base-x": { + "node_modules/@trezor/connect-web/node_modules/@trezor/websocket-client": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.2.2.tgz", @@ -4455,12 +4771,17 @@ } }, "node_modules/@trezor/connect-web/node_modules/base-x": { + "version": "5.0.1", "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", "license": "MIT" }, + + "node_modules/@trezor/connect/node_modules/bs58": { + "node_modules/@trezor/connect-web/node_modules/bs58": { + "version": "6.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", @@ -4469,7 +4790,26 @@ "base-x": "^5.0.0" } }, + + "node_modules/@trezor/crypto-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@trezor/crypto-utils/-/crypto-utils-1.1.4.tgz", + "integrity": "sha512-Y6VziniqMPoMi70IyowEuXKqRvBYQzgPAekJaUZTHhR+grtYNRKRH2HJCvuZ8MGmSKUFSYfa7y8AvwALA8mQmA==", + "license": "SEE LICENSE IN LICENSE.md", + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/device-utils": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@trezor/device-utils/-/device-utils-1.1.2.tgz", + "integrity": "sha512-R3AJvAo+a3wYVmcGZO2VNl9PZOmDEzCZIlmCJn0BlSRWWd8G9u1qyo/fL9zOwij/YhCaJyokmSHmIEmbY9qpgw==", + "license": "See LICENSE.md in repo root" + }, + "node_modules/@trezor/env-utils": { + "node_modules/@trezor/connect/node_modules/@trezor/env-utils": { + "version": "1.5.0", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.5.0.tgz", "integrity": "sha512-u1TN7dMQ5Qhpbae08Z4JJmI9fQrbbJ4yj8eIAsuzMQn6vb+Sg9vbntl+IDsZ1G9WeI73uHTLu1wWMmAgiujH8w==", @@ -4495,6 +4835,15 @@ } } }, + + "node_modules/@trezor/protobuf": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.4.2.tgz", + "integrity": "sha512-AeIYKCgKcE9cWflggGL8T9gD+IZLSGrwkzqCk3wpIiODd5dUCgEgA4OPBufR6OMu3RWu/Tgu2xviHunijG3LXQ==", + "license": "See LICENSE.md in repo root", + "dependencies": { + "@trezor/schema-utils": "1.3.4", + "node_modules/@trezor/connect/node_modules/base-x": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", @@ -4572,6 +4921,7 @@ "license": "See LICENSE.md in repo root", "dependencies": { "@trezor/schema-utils": "1.4.0", + "long": "5.2.5", "protobufjs": "7.4.0" }, @@ -4580,18 +4930,30 @@ } }, "node_modules/@trezor/protocol": { + + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.8.tgz", + "integrity": "sha512-8EH+EU4Z1j9X4Ljczjbl9G7vVgcUz41qXcdE+6FOG3BFvMDK4KUVvaOtWqD+1dFpeo5yvWSTEKdhgXMPFprWYQ==", + "version": "1.3.0", "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.3.0.tgz", "integrity": "sha512-rmrxbDrdgxTouBPbZcSeqU7ba/e5WVT1dxvxxEntHqRdTiDl7d3VK+BErCrlyol8EH5YCqEF3/rXt0crSOfoFw==", + "license": "See LICENSE.md in repo root", "peerDependencies": { "tslib": "^2.6.2" } }, "node_modules/@trezor/schema-utils": { + + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.3.4.tgz", + "integrity": "sha512-guP5TKjQEWe6c5HGx+7rhM0SAdEL5gylpkvk9XmJXjZDnl1Ew81nmLHUs2ghf8Od3pKBe4qjBIMBHUQNaOqWUg==", + "version": "1.4.0", "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.4.0.tgz", "integrity": "sha512-K7upSeh7VDrORaIC4KAxYVW93XNlohmUnH5if/5GKYmTdQSRp1nBkO6Jm+Z4hzIthdnz/1aLgnbeN3bDxWLRxA==", + "license": "See LICENSE.md in repo root", "dependencies": { "@sinclair/typebox": "^0.33.7", @@ -4602,6 +4964,17 @@ } }, "node_modules/@trezor/transport": { + + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.5.2.tgz", + "integrity": "sha512-rYP87zdVll2bNBtsD3VxJq0yjaNvIClcgszZjQwVTQxpKGFPkx8bLSpAGI05R9qfxusZJCfYarjX3qki9nHYPw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/protobuf": "1.4.2", + "@trezor/protocol": "1.2.8", + "@trezor/type-utils": "1.1.8", + "@trezor/utils": "9.4.2", + "version": "1.6.1", "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.6.1.tgz", "integrity": "sha512-RQNQingZ1TOVKSJu3Av9bmQovsu9n1NkcAYJ64+ZfapORfl/AzmZizRflhxU3FlIujQJK1gbIaW79+L54g7a8w==", @@ -4611,6 +4984,7 @@ "@trezor/protocol": "1.3.0", "@trezor/type-utils": "1.2.0", "@trezor/utils": "9.5.0", + "cross-fetch": "^4.0.0", "usb": "^2.15.0" }, @@ -4618,6 +4992,33 @@ "tslib": "^2.6.2" } }, + + "node_modules/@trezor/transport/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/type-utils": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.8.tgz", + "integrity": "sha512-VtvkPXpwtMtTX9caZWYlMMTmhjUeDq4/1LGn0pSdjd4OuL/vQyuPWXCT/0RtlnRraW6R2dZF7rX2UON2kQIMTQ==", + "license": "See LICENSE.md in repo root" + }, + "node_modules/@trezor/utils": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.1.tgz", + "integrity": "sha512-9MYNa99tzXiTBnKadABoY2D80YL9Mh3ntM5wziwVhjZ4HyhqFH6BsCxwFpWYLUIKBctD55QEdE4bASoqp7Ad1A==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + "node_modules/@trezor/type-utils": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.2.0.tgz", @@ -4631,18 +5032,29 @@ "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "bignumber.js": "^9.3.1" + }, "peerDependencies": { "tslib": "^2.6.2" } }, "node_modules/@trezor/utxo-lib": { + + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.4.2.tgz", + "integrity": "sha512-dTXfBg/cEKnmHM5CLG5+0qrp6fqOfwxqe8YPACdKeM7g1XJKCGDAuFpDUVeT3lrcUsTh6bEMHM06z4H3gZp5MQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/utils": "9.4.2", + "bchaddrjs": "^0.5.2", + "version": "2.5.0", "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.5.0.tgz", "integrity": "sha512-Fa2cZh0037oX6AHNLfpFIj65UR/OoX0ZJTocFuQASe77/1PjZHysf6BvvGfmzuFToKfrAQ+DM/1Sx+P/vnyNmA==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@trezor/utils": "9.5.0", + "bech32": "^2.0.0", "bip66": "^2.0.0", "bitcoin-ops": "^1.4.1", @@ -4651,7 +5063,9 @@ "bn.js": "^5.2.2", "bs58": "^6.0.0", "bs58check": "^4.0.0", + "cashaddrjs": "0.4.4", + "create-hmac": "^1.1.7", "int64-buffer": "^1.1.0", "pushdata-bitcoin": "^1.0.1", @@ -4664,6 +5078,20 @@ "tslib": "^2.6.2" } }, + + "node_modules/@trezor/utxo-lib/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/utxo-lib/node_modules/base-x": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", @@ -4680,18 +5108,41 @@ } }, "node_modules/@trezor/websocket-client": { + + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.2.2.tgz", + "integrity": "sha512-vu9L1V/5yh8LHQCmsGC9scCnihELsVuR5Tri1IvW3CdgTUFFcfjsEgXsFqFME3HlxuUmx6qokw0Gx/o0/hzaSQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@trezor/utils": "9.4.2", + "version": "1.3.0", "resolved": "https://registry.npmjs.org/@trezor/websocket-client/-/websocket-client-1.3.0.tgz", "integrity": "sha512-9KQSaVc3NtmM6rFFj1e+9bM0C5mVKVidbnxlfzuBJu7G2YMRdIdLPcAXhvmRZjs40uzDuBeApK+p547kODz2ug==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@trezor/utils": "9.5.0", + "ws": "^8.18.0" }, "peerDependencies": { "tslib": "^2.6.2" } }, + + "node_modules/@trezor/websocket-client/node_modules/@trezor/utils": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-Fm3m2gmfXsgv4chqn5HX8e8dElEr2ibBJSJ7HE3bsHh/1OSQcDdzsSioAK04Fo9ws/v7n6lt+QBZ6fGmwyIkZQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "bignumber.js": "^9.3.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -4703,6 +5154,16 @@ "tslib": "^2.4.0" } }, + + "node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -4723,6 +5184,9 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { @@ -4751,9 +5215,14 @@ "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + + "dev": true, + "license": "MIT", + "devOptional": true, "license": "MIT", "peer": true, + "dependencies": { "csstype": "^3.2.2" } @@ -4762,9 +5231,14 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + + "dev": true, + "license": "MIT", + "devOptional": true, "license": "MIT", "peer": true, + "peerDependencies": { "@types/react": "^19.2.0" } @@ -4847,7 +5321,9 @@ "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/types": "8.56.0", @@ -5387,6 +5863,7 @@ "uint8arrays": "^3.1.0" } }, + "node_modules/@walletconnect/core/node_modules/@walletconnect/keyvaluestorage": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", @@ -5502,6 +5979,7 @@ } } }, + "node_modules/@walletconnect/environment": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", @@ -5511,12 +5989,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/environment/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/events": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", @@ -5527,12 +6007,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/events/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/heartbeat": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz", @@ -5544,12 +6026,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/heartbeat/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/jsonrpc-provider": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz", @@ -5561,12 +6045,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/jsonrpc-provider/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/jsonrpc-types": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz", @@ -5577,12 +6063,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/jsonrpc-types/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/jsonrpc-utils": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", @@ -5594,12 +6082,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/jsonrpc-ws-connection": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz", @@ -5633,6 +6123,27 @@ } } }, + + "node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@walletconnect/logger": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.3.tgz", @@ -5773,12 +6284,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/safe-json/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/sign-client": { "version": "2.11.2", "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.11.2.tgz", @@ -5806,12 +6319,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/time/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/types": { "version": "2.11.2", "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.11.2.tgz", @@ -5826,6 +6341,7 @@ "events": "^3.3.0" } }, + "node_modules/@walletconnect/types/node_modules/@walletconnect/keyvaluestorage": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", @@ -5941,6 +6457,7 @@ } } }, + "node_modules/@walletconnect/utils": { "version": "2.11.2", "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.11.2.tgz", @@ -5972,12 +6489,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/window-getters/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@walletconnect/window-metadata": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", @@ -5988,12 +6507,14 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/window-metadata/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/@xrplf/isomorphic": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz", @@ -6030,7 +6551,9 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, + "bin": { "acorn": "bin/acorn" }, @@ -6300,6 +6823,7 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -6317,6 +6841,7 @@ "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, + "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -6624,6 +7149,7 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "license": "MIT" }, + "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -6737,6 +7263,7 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, + "node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -6801,11 +7328,27 @@ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, + + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "license": "MIT" + }, "node_modules/call-bind": { "version": "1.0.8", @@ -6902,6 +7445,7 @@ "big-integer": "1.6.36" } }, + "node_modules/cbor": { "version": "10.0.11", "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.11.tgz", @@ -6914,6 +7458,7 @@ "node": ">=20" } }, + "node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -7060,6 +7605,7 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -7076,6 +7622,7 @@ "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, + "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -7145,6 +7692,7 @@ "node": "*" } }, + "node_modules/crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -7167,11 +7715,16 @@ "node": "*" } }, + "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + + "dev": true, + "devOptional": true, + "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -7348,6 +7901,7 @@ "node": ">= 0.8" } }, + "node_modules/des.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", @@ -7358,6 +7912,7 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/destr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", @@ -7400,6 +7955,7 @@ "node": ">=8" } }, + "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -7417,6 +7973,7 @@ "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, + "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -7735,7 +8292,9 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -7909,7 +8468,9 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -8203,6 +8764,7 @@ "node": ">=12.0.0" } }, + "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -8219,6 +8781,7 @@ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "license": "Apache-2.0" }, + "node_modules/eyes": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", @@ -8292,6 +8855,7 @@ "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", "license": "MIT" }, + "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", @@ -8299,6 +8863,7 @@ "license": "CC0-1.0", "peer": true }, + "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -8309,6 +8874,27 @@ "reusify": "^1.0.4" } }, + + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + + "node_modules/feaxios": { "version": "0.0.23", "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", @@ -8488,6 +9074,7 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -8506,6 +9093,7 @@ "is-property": "^1.0.0" } }, + "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -8846,6 +9434,7 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -8877,6 +9466,7 @@ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "license": "ISC" }, + "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -8890,8 +9480,12 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz", "integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==", + + "license": "Apache-2.0" + "license": "Apache-2.0", "peer": true + }, "node_modules/ieee754": { "version": "1.2.1", @@ -9220,6 +9814,7 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-my-ip-valid": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", @@ -9239,6 +9834,7 @@ "xtend": "^4.0.0" } }, + "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -9279,12 +9875,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", "license": "MIT" }, + "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -9646,6 +10244,7 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", @@ -9655,6 +10254,7 @@ "node": ">=0.10.0" } }, + "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -10083,12 +10683,14 @@ "loose-envify": "cli.js" } }, + "node_modules/lru_map": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.4.1.tgz", "integrity": "sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==", "license": "MIT" }, + "node_modules/lru-cache": { "version": "11.2.6", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", @@ -10161,6 +10763,7 @@ "node": ">=8.6" } }, + "node_modules/miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -10180,6 +10783,7 @@ "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -10321,6 +10925,7 @@ "dev": true, "license": "MIT" }, + "node_modules/near-abi": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/near-abi/-/near-abi-0.2.0.tgz", @@ -10381,6 +10986,7 @@ } } }, + "node_modules/next": { "version": "15.5.4", "resolved": "https://registry.npmjs.org/next/-/next-15.5.4.tgz", @@ -10550,6 +11156,7 @@ "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", "license": "MIT" }, + "node_modules/nofilter": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", @@ -10807,6 +11414,7 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", @@ -10823,6 +11431,7 @@ "node": ">= 0.10" } }, + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10849,6 +11458,7 @@ "dev": true, "license": "MIT" }, + "node_modules/pbkdf2": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", @@ -10866,6 +11476,7 @@ "node": ">= 0.10" } }, + "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11039,6 +11650,7 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -11059,6 +11671,7 @@ "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, + "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -11156,6 +11769,7 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", @@ -11166,12 +11780,15 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", + "peer": true, + "engines": { "node": ">=0.10.0" } @@ -11181,7 +11798,9 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", + "peer": true, + main "dependencies": { "scheduler": "^0.26.0" }, @@ -11471,11 +12090,22 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", + "peer": true, + main "dependencies": { "tslib": "^2.1.0" } }, + + "node_modules/rxjs/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + + "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -11653,6 +12283,7 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -11937,6 +12568,7 @@ "dev": true, "license": "MIT" }, + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -11946,6 +12578,7 @@ "node": ">= 0.6" } }, + "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -12320,6 +12953,7 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -12338,13 +12972,16 @@ } } }, + "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, + "engines": { "node": ">=12" }, @@ -12379,6 +13016,7 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -12388,6 +13026,7 @@ "node": ">=0.6" } }, + "node_modules/toml": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", @@ -12433,11 +13072,18 @@ } }, "node_modules/tslib": { + + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", "peer": true + }, "node_modules/tw-animate-css": { "version": "1.4.0", @@ -12561,8 +13207,13 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + + "dev": true, + "license": "Apache-2.0", + "license": "Apache-2.0", "peer": true, + "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12718,6 +13369,105 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, + + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -12758,6 +13508,31 @@ "node": "^18 || ^20 || >= 21" } }, + + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -12804,6 +13579,7 @@ } } }, + "node_modules/valtio/node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -12813,6 +13589,7 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/varuint-bitcoin": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-2.0.0.tgz", @@ -12992,7 +13769,9 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", + "peer": true, + "engines": { "node": ">=10.0.0" }, @@ -13010,11 +13789,18 @@ } }, "node_modules/xrpl": { + + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.6.0.tgz", + "integr + "license"ity": "sha512-0nXZfqDHRJ6bsDv1WtA9MdCYalMtXuxVa9mtLdqT3xypRKf2LwT5DbuGL/kHcVfuqk3B+ly+SFARlrnX+LHtRQ==", + "version": "4.4.3", "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.4.3.tgz", "integrity": "sha512-vi2OjuNkiaP8nv1j+nqHp8GZwwEjO6Y8+j/OuVMg6M4LwXEwyHdIj33dlg7cyY1Lw5+jb9HqFOQvABhaywVbTQ==", - "license": "ISC", - "dependencies": { + + +, "dependencies": { "@scure/bip32": "^1.3.1", "@scure/bip39": "^1.2.1", "@xrplf/isomorphic": "^1.0.1", @@ -13023,13 +13809,18 @@ "eventemitter3": "^5.0.1", "fast-json-stable-stringify": "^2.1.0", "ripple-address-codec": "^5.0.0", + + "ripple-binary-codec": "^2.7.0", + "ripple-binary-codec": "^2.5.0", + "ripple-keypairs": "^2.0.0" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -13039,6 +13830,7 @@ "node": ">=0.4" } }, + "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", diff --git a/frontend/src/app/dashboard/contributions/page.tsx b/frontend/src/app/dashboard/contributions/page.tsx new file mode 100644 index 0000000..ef7d6aa --- /dev/null +++ b/frontend/src/app/dashboard/contributions/page.tsx @@ -0,0 +1,14 @@ +export default function ContributionsPage() { + return ( +
+
+

+ Contributions +

+

+ Track your contribution history across pools. +

+
+
+ ); +} diff --git a/frontend/src/app/dashboard/layout.tsx b/frontend/src/app/dashboard/layout.tsx new file mode 100644 index 0000000..407a82d --- /dev/null +++ b/frontend/src/app/dashboard/layout.tsx @@ -0,0 +1,13 @@ +import { DashboardShell } from "@/components/dashboard/DashboardShell"; + +export default function DashboardLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+ {children} +
+ ); +} diff --git a/frontend/src/app/dashboard/my-pools/page.tsx b/frontend/src/app/dashboard/my-pools/page.tsx new file mode 100644 index 0000000..eacacc1 --- /dev/null +++ b/frontend/src/app/dashboard/my-pools/page.tsx @@ -0,0 +1,45 @@ +import Link from "next/link"; + +export default function MyPoolsPage() { + return ( +
+
+
+

+ My Pools +

+

+ View and manage your donation pools. +

+
+ + + + + Create Pool + +
+ +
+
+ + + +
+

No pools yet

+

+ Get started by creating your first donation pool. +

+ + Create your first pool → + +
+
+ ); +} diff --git a/frontend/src/app/dashboard/page.tsx b/frontend/src/app/dashboard/page.tsx new file mode 100644 index 0000000..d8e4b23 --- /dev/null +++ b/frontend/src/app/dashboard/page.tsx @@ -0,0 +1,21 @@ +export default function DashboardOverviewPage() { + return ( +
+
+

+ Overview +

+

+ Welcome to your Nevo dashboard. Track your pools and contributions here. +

+
+ +
+

Quick stats

+

+ Stats and charts will appear in Part 2. +

+
+
+ ); +} diff --git a/frontend/src/app/dashboard/pools/create/page.tsx b/frontend/src/app/dashboard/pools/create/page.tsx new file mode 100644 index 0000000..707223e --- /dev/null +++ b/frontend/src/app/dashboard/pools/create/page.tsx @@ -0,0 +1,5 @@ +import { CreatePoolStepper } from "@/components/dashboard/CreatePoolStepper"; + +export default function CreatePoolPage() { + return ; +} diff --git a/frontend/src/app/dashboard/settings/page.tsx b/frontend/src/app/dashboard/settings/page.tsx new file mode 100644 index 0000000..7eb6466 --- /dev/null +++ b/frontend/src/app/dashboard/settings/page.tsx @@ -0,0 +1,14 @@ +export default function SettingsPage() { + return ( +
+
+

+ Settings +

+

+ Manage your account and preferences. +

+
+
+ ); +} diff --git a/frontend/src/components/dashboard/CreatePoolStepper.tsx b/frontend/src/components/dashboard/CreatePoolStepper.tsx new file mode 100644 index 0000000..a610f12 --- /dev/null +++ b/frontend/src/components/dashboard/CreatePoolStepper.tsx @@ -0,0 +1,247 @@ +"use client"; + +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { BasicInfoStep } from "./steps/BasicInfoStep"; +import { FinancialsStep } from "./steps/FinancialsStep"; +import { ReviewStep } from "./steps/ReviewStep"; +import { cn } from "@/lib/utils"; + +export interface FormData { + // Step 1 + poolName: string; + category: string; + description: string; + endDate: string; + // Step 2 + fundingGoal: string; + minContribution: string; + beneficiaryWallet: string; + visibility: "Public" | "Private"; +} + +const INITIAL_FORM: FormData = { + poolName: "", + category: "", + description: "", + endDate: "", + fundingGoal: "", + minContribution: "", + beneficiaryWallet: "", + visibility: "Public", +}; + +const STEPS = [ + { id: 1, label: "Basic Info" }, + { id: 2, label: "Financials" }, + { id: 3, label: "Review" }, +]; + +function isStep1Valid(data: FormData) { + return data.poolName.trim() !== "" && data.category !== "" && data.description.trim() !== ""; +} + +function isStep2Valid(data: FormData) { + return data.fundingGoal !== "" && Number(data.fundingGoal) > 0 && data.beneficiaryWallet.trim() !== ""; +} + +export function CreatePoolStepper() { + const router = useRouter(); + const [currentStep, setCurrentStep] = useState(1); + const [formData, setFormData] = useState(INITIAL_FORM); + const [submitting, setSubmitting] = useState(false); + const [direction, setDirection] = useState<"forward" | "backward">("forward"); + const [animating, setAnimating] = useState(false); + + const updateForm = (updates: Partial) => { + setFormData((prev) => ({ ...prev, ...updates })); + }; + + const canProceed = + currentStep === 1 + ? isStep1Valid(formData) + : currentStep === 2 + ? isStep2Valid(formData) + : true; + + const transitionToStep = (next: number, dir: "forward" | "backward") => { + setDirection(dir); + setAnimating(true); + setTimeout(() => { + setCurrentStep(next); + setAnimating(false); + }, 220); + }; + + const handleNext = () => { + if (currentStep < 3 && canProceed) transitionToStep(currentStep + 1, "forward"); + }; + + const handleBack = () => { + if (currentStep > 1) transitionToStep(currentStep - 1, "backward"); + }; + + const handleSubmit = async () => { + setSubmitting(true); + // Simulate async submission + await new Promise((r) => setTimeout(r, 1500)); + setSubmitting(false); + router.push("/dashboard/my-pools"); + }; + + const progressPercent = ((currentStep - 1) / (STEPS.length - 1)) * 100; + + return ( +
+ {/* Header */} +
+

Create a New Pool

+

+ Complete each step to launch your donation pool on the Stellar blockchain. +

+
+ + {/* Progress bar + Step indicators */} +
+ {/* Step circles */} +
+ {STEPS.map((step, idx) => { + const isDone = currentStep > step.id; + const isActive = currentStep === step.id; + return ( +
+
+ {/* Circle */} +
+ {isDone ? ( + + + + ) : ( + step.id + )} +
+ {/* Label */} + + {step.label} + +
+ + {/* Connector line */} + {idx < STEPS.length - 1 && ( +
+
+
+ )} +
+ ); + })} +
+ + {/* Thin progress bar */} +
+
+
+

+ Step {currentStep} of {STEPS.length} +

+
+ + {/* Step content card */} +
+ {currentStep === 1 && } + {currentStep === 2 && } + {currentStep === 3 && } +
+ + {/* Navigation footer */} +
+ + + {currentStep < 3 ? ( + + ) : ( + + )} +
+
+ ); +} diff --git a/frontend/src/components/dashboard/DashboardShell.tsx b/frontend/src/components/dashboard/DashboardShell.tsx new file mode 100644 index 0000000..d7be006 --- /dev/null +++ b/frontend/src/components/dashboard/DashboardShell.tsx @@ -0,0 +1,18 @@ +"use client"; + +import { DashboardSidebar } from "./DashboardSidebar"; + +interface DashboardShellProps { + children: React.ReactNode; +} + +export function DashboardShell({ children }: DashboardShellProps) { + return ( +
+ +
+
{children}
+
+
+ ); +} diff --git a/frontend/src/components/dashboard/DashboardSidebar.tsx b/frontend/src/components/dashboard/DashboardSidebar.tsx new file mode 100644 index 0000000..cb270ba --- /dev/null +++ b/frontend/src/components/dashboard/DashboardSidebar.tsx @@ -0,0 +1,112 @@ +"use client"; + +import { useState } from "react"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { + LayoutDashboard, + Droplets, + Wallet, + Settings, + Menu, + X, +} from "lucide-react"; +import { cn } from "@/lib/utils"; + +const navItems = [ + { href: "/dashboard", label: "Overview", icon: LayoutDashboard }, + { href: "/dashboard/my-pools", label: "My Pools", icon: Droplets }, + { href: "/dashboard/contributions", label: "Contributions", icon: Wallet }, + { href: "/dashboard/settings", label: "Settings", icon: Settings }, +]; + +export function DashboardSidebar() { + const [isMobileOpen, setIsMobileOpen] = useState(false); + const pathname = usePathname(); + + const toggleMobile = () => setIsMobileOpen((prev) => !prev); + + const navLinks = ( + + ); + + return ( + <> + {/* Mobile header with hamburger */} +
+ setIsMobileOpen(false)} + > +
+ Nevo + + +
+ + {/* Mobile overlay */} + {isMobileOpen && ( +
setIsMobileOpen(false)} + aria-hidden + /> + )} + + {/* Sidebar - drawer on mobile, fixed on desktop */} + + + ); +} diff --git a/frontend/src/components/dashboard/steps/BasicInfoStep.tsx b/frontend/src/components/dashboard/steps/BasicInfoStep.tsx new file mode 100644 index 0000000..95b4b66 --- /dev/null +++ b/frontend/src/components/dashboard/steps/BasicInfoStep.tsx @@ -0,0 +1,99 @@ +"use client"; + +import { FormData } from "../CreatePoolStepper"; + +interface BasicInfoStepProps { + formData: FormData; + onChange: (updates: Partial) => void; +} + +const CATEGORIES = ["Education", "Medical", "Community", "Environment", "Arts", "Other"]; + +export function BasicInfoStep({ formData, onChange }: BasicInfoStepProps) { + return ( +
+
+

Basic Information

+

+ Tell the community what your donation pool is about. +

+
+ + {/* Pool Name */} +
+ + onChange({ poolName: e.target.value })} + placeholder="e.g. Community School Rebuild Fund" + className="w-full rounded-lg border border-slate-700/80 bg-slate-900/70 px-4 py-3 text-sm text-white placeholder:text-slate-500 outline-none transition-all duration-200 focus:border-emerald-500/70 focus:ring-2 focus:ring-emerald-500/20" + /> +
+ + {/* Category */} +
+ +
+ +
+ + + +
+
+
+ + {/* Description */} +
+ +