From d25ede2c83f44246df90fdd5e06f4c5ee1a7c8cd Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Wed, 11 Dec 2024 18:29:30 +0100 Subject: [PATCH 01/11] contract checking tx inclusion in block --- packages/onchain/Scarb.lock | 52 ++++++++++++++++++++++ packages/onchain/Scarb.toml | 13 +++++- packages/onchain/src/lib.cairo | 1 + packages/onchain/src/relay.cairo | 1 + packages/onchain/src/relay/relay.cairo | 61 ++++++++++++++++++++++++++ packages/onchain/src/utils/utils.cairo | 36 +++++++++++++++ 6 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 packages/onchain/src/relay.cairo create mode 100644 packages/onchain/src/relay/relay.cairo diff --git a/packages/onchain/Scarb.lock b/packages/onchain/Scarb.lock index ac734f9..aee286b 100644 --- a/packages/onchain/Scarb.lock +++ b/packages/onchain/Scarb.lock @@ -6,15 +6,27 @@ name = "alexandria_math" version = "0.2.1" source = "git+https://github.com/keep-starknet-strange/alexandria#95d98a5182001d07673b856a356eff0e6bd05354" +[[package]] +name = "consensus" +version = "0.1.0" +source = "git+https://github.com/keep-starknet-strange/raito.git?rev=02a13045b7074ae2b3247431cd91f1ad76263fb2#02a13045b7074ae2b3247431cd91f1ad76263fb2" +dependencies = [ + "shinigami_engine", + "utils", +] + [[package]] name = "onchain" version = "0.1.0" dependencies = [ "alexandria_math", + "consensus", "openzeppelin", "openzeppelin_token", "openzeppelin_utils", "snforge_std", + "utils", + "utu_relay", ] [[package]] @@ -123,6 +135,31 @@ name = "openzeppelin_utils" version = "0.19.0" source = "git+https://github.com/openzeppelin/cairo-contracts?tag=v0.19.0#8d49e8c445efd9bdc99b050c8b7d11ae5ad19628" +[[package]] +name = "ripemd160" +version = "0.1.0" +source = "git+https://github.com/j1mbo64/ripemd160_cairo.git#833e07d7d074d4ee51ceb40a5bcb4af2fe6898f3" + +[[package]] +name = "sha1" +version = "0.1.0" +source = "git+https://github.com/j1mbo64/sha1_cairo.git#2b65bc00a829bdcc244c140d0f31feda32f8d2c4" + +[[package]] +name = "shinigami_engine" +version = "0.1.0" +source = "git+https://github.com/keep-starknet-strange/shinigami.git?rev=3415ed6#3415ed6331d3ea2dc2de6f9ab8e0be6562585f2d" +dependencies = [ + "ripemd160", + "sha1", + "shinigami_utils", +] + +[[package]] +name = "shinigami_utils" +version = "0.1.0" +source = "git+https://github.com/keep-starknet-strange/shinigami.git?rev=3415ed6#3415ed6331d3ea2dc2de6f9ab8e0be6562585f2d" + [[package]] name = "snforge_scarb_plugin" version = "0.33.0" @@ -135,3 +172,18 @@ source = "git+https://github.com/foundry-rs/starknet-foundry?tag=v0.33.0#221b1db dependencies = [ "snforge_scarb_plugin", ] + +[[package]] +name = "utils" +version = "0.1.0" +source = "git+https://github.com/keep-starknet-strange/raito.git?rev=02a13045b7074ae2b3247431cd91f1ad76263fb2#02a13045b7074ae2b3247431cd91f1ad76263fb2" + +[[package]] +name = "utu_relay" +version = "0.1.0" +source = "git+https://github.com/lana-shanghai/utu_relay.git#25f8d9799df04465c716155e9ece61d9145b0f8c" +dependencies = [ + "openzeppelin", + "openzeppelin_upgrades", + "utils", +] diff --git a/packages/onchain/Scarb.toml b/packages/onchain/Scarb.toml index 4a81186..dc3e2ff 100644 --- a/packages/onchain/Scarb.toml +++ b/packages/onchain/Scarb.toml @@ -5,6 +5,9 @@ edition = "2024_07" # See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html +[patch.crates-io] +openzeppelin = "0.19.0" + [dependencies] snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry", tag = "v0.33.0" } openzeppelin = { git = "https://github.com/openzeppelin/cairo-contracts", tag = "v0.19.0" } @@ -12,11 +15,19 @@ starknet = "2.9.1" alexandria_math = { git = "https://github.com/keep-starknet-strange/alexandria" } openzeppelin_token = { git = "https://github.com/openzeppelin/cairo-contracts", tag = "v0.19.0" } openzeppelin_utils = { git = "https://github.com/openzeppelin/cairo-contracts", tag = "v0.19.0" } +utils = { git = "https://github.com/keep-starknet-strange/raito.git", rev = "02a13045b7074ae2b3247431cd91f1ad76263fb2" } +consensus = { git = "https://github.com/keep-starknet-strange/raito.git", rev = "02a13045b7074ae2b3247431cd91f1ad76263fb2" } +utu_relay = { git = "https://github.com/lana-shanghai/utu_relay.git" } [[target.starknet-contract]] casm = true sierra = true -build-external-contracts = ["openzeppelin_presets::erc20::ERC20Upgradeable"] +build-external-contracts = [ + "openzeppelin_presets::erc20::ERC20Upgradeable", + "utu_relay::utu_relay::UtuRelay" +] +allowed-libfuncs-list.name = "experimental" +casm-add-pythonic-hints = true [dev-dependencies] assert_macros = "2.9.1" diff --git a/packages/onchain/src/lib.cairo b/packages/onchain/src/lib.cairo index 9bfc256..f253d44 100644 --- a/packages/onchain/src/lib.cairo +++ b/packages/onchain/src/lib.cairo @@ -1,3 +1,4 @@ mod escrow; mod orderbook; mod utils; +mod relay; \ No newline at end of file diff --git a/packages/onchain/src/relay.cairo b/packages/onchain/src/relay.cairo new file mode 100644 index 0000000..6e71656 --- /dev/null +++ b/packages/onchain/src/relay.cairo @@ -0,0 +1 @@ +mod relay; \ No newline at end of file diff --git a/packages/onchain/src/relay/relay.cairo b/packages/onchain/src/relay/relay.cairo new file mode 100644 index 0000000..fcd50e1 --- /dev/null +++ b/packages/onchain/src/relay/relay.cairo @@ -0,0 +1,61 @@ +use utils::hash::Digest; +use utu_relay::bitcoin::block::BlockHeader; + +#[starknet::interface] +pub trait IBitcoinDepositor { + fn prove_inclusion( + ref self: TContractState, + tx_id: Digest, + block_height: u64, + block_header: BlockHeader, + tx_inclusion: Array<(Digest, bool)> + ); +} + +#[starknet::contract] +mod BitcoinDepositor { + use onchain::utils::utils::compute_merkle_root; + use utu_relay::bitcoin::block::BlockHashTrait; + use starknet::{ContractAddress, get_block_timestamp}; + use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; + use utils::{hash::Digest, numeric::u32_byte_reverse}; + use utu_relay::{ + interfaces::{IUtuRelayDispatcher, IUtuRelayDispatcherTrait}, bitcoin::block::BlockHeader + }; + + #[storage] + struct Storage { + depositor: ContractAddress, + utu_address: ContractAddress, + } + + #[constructor] + fn constructor(ref self: ContractState, utu_address: ContractAddress) { + self.utu_address.write(utu_address); + } + + #[abi(embed_v0)] + impl BitcoinDepositorImpl of super::IBitcoinDepositor { + fn prove_inclusion( + ref self: ContractState, + tx_id: Digest, + block_height: u64, + block_header: BlockHeader, + tx_inclusion: Array<(Digest, bool)> + ) { + // we verify this tx is included in the provided block + let merkle_root = compute_merkle_root(tx_id, tx_inclusion); + assert( + block_header.merkle_root_hash.value == merkle_root.value, 'Invalid inclusion proof.' + ); + + // we verify this block is safe to use (part of the canonical chain & sufficient pow) + // sufficient pow for our usecase: 100 sextillion expected hashes + let utu = IUtuRelayDispatcher { contract_address: self.utu_address.read() }; + utu.assert_safe(block_height, block_header.hash(), 100_000_000_000_000_000_000_000, 0); + // we ensure this block was not premined + let block_time = u32_byte_reverse(block_header.time).into(); + assert(block_time <= get_block_timestamp(), 'Block comes from the future.'); + } + } +} \ No newline at end of file diff --git a/packages/onchain/src/utils/utils.cairo b/packages/onchain/src/utils/utils.cairo index 8b13789..9f2f270 100644 --- a/packages/onchain/src/utils/utils.cairo +++ b/packages/onchain/src/utils/utils.cairo @@ -1 +1,37 @@ +use utils::hash::Digest; +use utils::double_sha256::double_sha256_parent; +/// Computes the Merkle root from a transaction hash and its siblings. +/// +/// Arguments: +/// - `tx_hash: Digest`: The transaction hash as a Digest +/// - `siblings: Array<(Digest, bool)>`: An array of tuples (Digest, bool), where the bool indicates if the sibling is on +/// the right +/// +/// Returns: +/// - `Digest`: The computed Merkle root as a Digest +pub fn compute_merkle_root(tx_hash: Digest, siblings: Array<(Digest, bool)>) -> Digest { + let mut current_hash = tx_hash; + + // Iterate through all siblings + let mut i = 0; + loop { + if i == siblings.len() { + break; + } + + let (sibling, is_left) = *siblings.at(i); + + // Concatenate current_hash and sibling based on the order + current_hash = + if is_left { + double_sha256_parent(@sibling, @current_hash) + } else { + double_sha256_parent(@current_hash, @sibling) + }; + + i += 1; + }; + + current_hash +} \ No newline at end of file From 09f0925d45da8bde715565649537fd90d51a1df1 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Wed, 11 Dec 2024 18:31:36 +0100 Subject: [PATCH 02/11] remove items from utu example --- packages/onchain/src/relay/relay.cairo | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/onchain/src/relay/relay.cairo b/packages/onchain/src/relay/relay.cairo index fcd50e1..14a35db 100644 --- a/packages/onchain/src/relay/relay.cairo +++ b/packages/onchain/src/relay/relay.cairo @@ -2,7 +2,7 @@ use utils::hash::Digest; use utu_relay::bitcoin::block::BlockHeader; #[starknet::interface] -pub trait IBitcoinDepositor { +pub trait ITransactionInclusion { fn prove_inclusion( ref self: TContractState, tx_id: Digest, @@ -13,7 +13,7 @@ pub trait IBitcoinDepositor { } #[starknet::contract] -mod BitcoinDepositor { +mod TransactionInclusion { use onchain::utils::utils::compute_merkle_root; use utu_relay::bitcoin::block::BlockHashTrait; use starknet::{ContractAddress, get_block_timestamp}; @@ -25,7 +25,6 @@ mod BitcoinDepositor { #[storage] struct Storage { - depositor: ContractAddress, utu_address: ContractAddress, } @@ -35,7 +34,7 @@ mod BitcoinDepositor { } #[abi(embed_v0)] - impl BitcoinDepositorImpl of super::IBitcoinDepositor { + impl TransactionInclusionImpl of super::ITransactionInclusion { fn prove_inclusion( ref self: ContractState, tx_id: Digest, From cfb2719ff5fa352447ae0cede6af3dbbaa2e36c1 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Wed, 11 Dec 2024 18:46:45 +0100 Subject: [PATCH 03/11] add call to relay to submit_inscription --- .../onchain/src/orderbook/orderbook.cairo | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/onchain/src/orderbook/orderbook.cairo b/packages/onchain/src/orderbook/orderbook.cairo index 4bcedaf..a27ead5 100644 --- a/packages/onchain/src/orderbook/orderbook.cairo +++ b/packages/onchain/src/orderbook/orderbook.cairo @@ -10,6 +10,7 @@ mod Orderbook { StoragePointerReadAccess, StoragePointerWriteAccess, }; use starknet::{ContractAddress, get_caller_address, get_contract_address, get_block_number}; + use starknet::{SyscallResultTrait, syscalls::call_contract_syscall}; #[storage] struct Storage { @@ -28,12 +29,14 @@ mod Orderbook { inscription_locks: Map, // STRK fee token. strk_token: ERC20ABIDispatcher, + // Address of the contract checking transaction inclusion. + relay_address: ContractAddress, } #[constructor] - fn constructor(ref self: ContractState, strk_token: ContractAddress) { + fn constructor(ref self: ContractState, strk_token: ContractAddress, relay_address: ContractAddress) { // initialize contract - self.initializer(:strk_token); + self.initializer(:strk_token, :relay_address); } #[abi(embed_v0)] @@ -159,7 +162,14 @@ mod Orderbook { let (_, precomputed_tx_hash, _) = self.inscription_locks.read(inscription_id); assert(precomputed_tx_hash == tx_hash, 'Precomputed hash != submitted'); - // TODO: process the submitted transaction hash, verify that it is on Bitcoin + const selector: felt252 = selector!("prove_inclusion"); + let to = self.relay_address.read(); + let calldata: Array = array![]; + + // TODO: assert successful inclusion call + call_contract_syscall(to, selector, calldata.span()).unwrap_syscall(); + + // TODO: assert that the witness data contains the requested inscription self.inscription_statuses.write(inscription_id, Status::Closed); } @@ -182,8 +192,9 @@ mod Orderbook { pub impl InternalImpl of InternalTrait { /// Executed once when the Orderbook contract is deployed. Used to set /// initial values for contract storage variables for the fee tokens. - fn initializer(ref self: ContractState, strk_token: ContractAddress) { + fn initializer(ref self: ContractState, strk_token: ContractAddress, relay_address: ContractAddress) { self.strk_token.write(ERC20ABIDispatcher { contract_address: strk_token }); + self.relay_address.write(relay_address); } } } From 0c25ea2a068f5cba874b7a1e5474ad46d031a901 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Thu, 12 Dec 2024 14:28:03 +0100 Subject: [PATCH 04/11] scarb fmt --- packages/onchain/src/lib.cairo | 2 +- packages/onchain/src/orderbook/orderbook.cairo | 8 ++++++-- packages/onchain/src/relay.cairo | 2 +- packages/onchain/src/relay/relay.cairo | 11 ++++++----- packages/onchain/src/utils/utils.cairo | 6 +++--- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/onchain/src/lib.cairo b/packages/onchain/src/lib.cairo index f253d44..d8b5e2a 100644 --- a/packages/onchain/src/lib.cairo +++ b/packages/onchain/src/lib.cairo @@ -1,4 +1,4 @@ mod escrow; mod orderbook; mod utils; -mod relay; \ No newline at end of file +mod relay; diff --git a/packages/onchain/src/orderbook/orderbook.cairo b/packages/onchain/src/orderbook/orderbook.cairo index a27ead5..a634fdf 100644 --- a/packages/onchain/src/orderbook/orderbook.cairo +++ b/packages/onchain/src/orderbook/orderbook.cairo @@ -34,7 +34,9 @@ mod Orderbook { } #[constructor] - fn constructor(ref self: ContractState, strk_token: ContractAddress, relay_address: ContractAddress) { + fn constructor( + ref self: ContractState, strk_token: ContractAddress, relay_address: ContractAddress, + ) { // initialize contract self.initializer(:strk_token, :relay_address); } @@ -192,7 +194,9 @@ mod Orderbook { pub impl InternalImpl of InternalTrait { /// Executed once when the Orderbook contract is deployed. Used to set /// initial values for contract storage variables for the fee tokens. - fn initializer(ref self: ContractState, strk_token: ContractAddress, relay_address: ContractAddress) { + fn initializer( + ref self: ContractState, strk_token: ContractAddress, relay_address: ContractAddress, + ) { self.strk_token.write(ERC20ABIDispatcher { contract_address: strk_token }); self.relay_address.write(relay_address); } diff --git a/packages/onchain/src/relay.cairo b/packages/onchain/src/relay.cairo index 6e71656..a723721 100644 --- a/packages/onchain/src/relay.cairo +++ b/packages/onchain/src/relay.cairo @@ -1 +1 @@ -mod relay; \ No newline at end of file +mod relay; diff --git a/packages/onchain/src/relay/relay.cairo b/packages/onchain/src/relay/relay.cairo index 14a35db..0f10308 100644 --- a/packages/onchain/src/relay/relay.cairo +++ b/packages/onchain/src/relay/relay.cairo @@ -8,7 +8,7 @@ pub trait ITransactionInclusion { tx_id: Digest, block_height: u64, block_header: BlockHeader, - tx_inclusion: Array<(Digest, bool)> + tx_inclusion: Array<(Digest, bool)>, ); } @@ -20,7 +20,7 @@ mod TransactionInclusion { use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; use utils::{hash::Digest, numeric::u32_byte_reverse}; use utu_relay::{ - interfaces::{IUtuRelayDispatcher, IUtuRelayDispatcherTrait}, bitcoin::block::BlockHeader + interfaces::{IUtuRelayDispatcher, IUtuRelayDispatcherTrait}, bitcoin::block::BlockHeader, }; #[storage] @@ -40,12 +40,13 @@ mod TransactionInclusion { tx_id: Digest, block_height: u64, block_header: BlockHeader, - tx_inclusion: Array<(Digest, bool)> + tx_inclusion: Array<(Digest, bool)>, ) { // we verify this tx is included in the provided block let merkle_root = compute_merkle_root(tx_id, tx_inclusion); assert( - block_header.merkle_root_hash.value == merkle_root.value, 'Invalid inclusion proof.' + block_header.merkle_root_hash.value == merkle_root.value, + 'Invalid inclusion proof.', ); // we verify this block is safe to use (part of the canonical chain & sufficient pow) @@ -57,4 +58,4 @@ mod TransactionInclusion { assert(block_time <= get_block_timestamp(), 'Block comes from the future.'); } } -} \ No newline at end of file +} diff --git a/packages/onchain/src/utils/utils.cairo b/packages/onchain/src/utils/utils.cairo index 9f2f270..b5de110 100644 --- a/packages/onchain/src/utils/utils.cairo +++ b/packages/onchain/src/utils/utils.cairo @@ -5,8 +5,8 @@ use utils::double_sha256::double_sha256_parent; /// /// Arguments: /// - `tx_hash: Digest`: The transaction hash as a Digest -/// - `siblings: Array<(Digest, bool)>`: An array of tuples (Digest, bool), where the bool indicates if the sibling is on -/// the right +/// - `siblings: Array<(Digest, bool)>`: An array of tuples (Digest, bool), where the bool indicates +/// if the sibling is on the right /// /// Returns: /// - `Digest`: The computed Merkle root as a Digest @@ -34,4 +34,4 @@ pub fn compute_merkle_root(tx_hash: Digest, siblings: Array<(Digest, bool)>) -> }; current_hash -} \ No newline at end of file +} From 071b52552a3c21bb6f9504f226072894de0538c0 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Thu, 12 Dec 2024 18:42:03 +0100 Subject: [PATCH 05/11] fix tests --- .../src/orderbook/test_orderbook.cairo | 80 +++++++++++-------- packages/onchain/src/utils/constants.cairo | 4 + 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/packages/onchain/src/orderbook/test_orderbook.cairo b/packages/onchain/src/orderbook/test_orderbook.cairo index 050bd78..aec56b5 100644 --- a/packages/onchain/src/orderbook/test_orderbook.cairo +++ b/packages/onchain/src/orderbook/test_orderbook.cairo @@ -13,41 +13,56 @@ use onchain::utils::{constants, erc20_utils}; fn setup_orderbook( - erc20_contract_address: ContractAddress, -) -> (OrderbookABIDispatcher, ContractAddress) { + erc20_contract_address: ContractAddress, relay_address: ContractAddress, +) -> OrderbookABIDispatcher { // declare Orderbook contract let contract_class = declare("Orderbook").unwrap().contract_class(); // deploy Orderbook contract let mut calldata = array![]; calldata.append_serde(erc20_contract_address); + calldata.append_serde(relay_address); let (contract_address, _) = contract_class.deploy(@calldata).unwrap(); - (OrderbookABIDispatcher { contract_address }, contract_address) + OrderbookABIDispatcher { contract_address } } -fn setup() -> ( - OrderbookABIDispatcher, ContractAddress, ERC20UpgradeableABIDispatcher, ContractAddress, -) { +fn setup_relay() -> ContractAddress { + // declare TransactionInclusion contract + let contract_class = declare("TransactionInclusion").unwrap().contract_class(); + + // deploy TransactionInclusion contract + let mut calldata = array![]; + calldata.append_serde(constants::UTU()); // TODO replace with deployed Utu contract + + let (relay_address, _) = contract_class.deploy(@calldata).unwrap(); + + relay_address +} + +fn setup() -> (OrderbookABIDispatcher, ERC20UpgradeableABIDispatcher) { // deploy an ERC20 - let (erc20_strk, erc20_address) = erc20_utils::setup_erc20(test_address()); + let (erc20_strk, _) = erc20_utils::setup_erc20(test_address()); + + // deploy relay contract + let relay_address = setup_relay(); // deploy Orderbook contract - let (orderbook, contract_address) = setup_orderbook(erc20_strk.contract_address); + let orderbook = setup_orderbook(erc20_strk.contract_address, relay_address); - (orderbook, contract_address, erc20_strk, erc20_address) + (orderbook, erc20_strk) } #[test] fn test_request_inscription_stored_and_retrieved() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "bc1p5d7rjq7g6r4jdyhzks9smlaqtedr4dekq08ge8ztwac72sfr9rusxg3297"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); @@ -56,7 +71,8 @@ fn test_request_inscription_stored_and_retrieved() { assert_eq!(expected, actual); let expected_contract_balance = 10; // the submitter fee transferred to the contract - let actual_contract_balance = token_dispatcher.balance_of(contract_address); + let actual_contract_balance = token_dispatcher + .balance_of(orderbook_dispatcher.contract_address); assert_eq!(expected_contract_balance, actual_contract_balance); let expected_user_balance = constants::SUPPLY - 10; // the user balance after the request call @@ -67,12 +83,12 @@ fn test_request_inscription_stored_and_retrieved() { #[test] #[should_panic] fn test_request_inscription_fails_wrong_currency() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 1, 'BTC'.into(), 10); } @@ -80,12 +96,12 @@ fn test_request_inscription_fails_wrong_currency() { #[test] #[should_panic] fn test_request_inscription_fails_insufficient_balance() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 2000); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 2000); orderbook_dispatcher .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 2000); @@ -93,12 +109,12 @@ fn test_request_inscription_fails_insufficient_balance() { #[test] fn test_lock_inscription_works() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); @@ -111,12 +127,12 @@ fn test_lock_inscription_works() { #[test] #[should_panic] fn test_lock_inscription_fails_prior_lock_not_expired() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); @@ -128,12 +144,12 @@ fn test_lock_inscription_fails_prior_lock_not_expired() { #[test] #[should_panic] fn test_lock_inscription_fails_inscription_not_found() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let _ = orderbook_dispatcher .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); @@ -147,19 +163,19 @@ fn test_lock_inscription_fails_status_closed() { // TODO: when `submit_inscripti #[test] fn test_cancel_inscription_works() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); - start_cheat_caller_address_global(contract_address); + start_cheat_caller_address_global(orderbook_dispatcher.contract_address); // TODO: is this the correct way to set permissions? - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); stop_cheat_caller_address_global(); orderbook_dispatcher.cancel_inscription(id, 'STRK'.into()); @@ -168,12 +184,12 @@ fn test_cancel_inscription_works() { #[test] #[should_panic] fn test_cancel_inscription_fails_locked() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); @@ -189,18 +205,18 @@ fn test_cancel_inscription_fails_closed() { // TODO: when `submit_inscription` i #[test] #[should_panic] fn test_cancel_inscription_fails_canceled() { - let (orderbook_dispatcher, contract_address, token_dispatcher, _) = setup(); + let (orderbook_dispatcher, token_dispatcher) = setup(); let test_taproot_address: ByteArray = "test"; let test_data: ByteArray = "data"; - token_dispatcher.approve(contract_address, 100); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); - start_cheat_caller_address_global(contract_address); - token_dispatcher.approve(contract_address, 100); + start_cheat_caller_address_global(orderbook_dispatcher.contract_address); + token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); stop_cheat_caller_address_global(); orderbook_dispatcher.cancel_inscription(id, 'STRK'.into()); diff --git a/packages/onchain/src/utils/constants.cairo b/packages/onchain/src/utils/constants.cairo index b586186..392a227 100644 --- a/packages/onchain/src/utils/constants.cairo +++ b/packages/onchain/src/utils/constants.cairo @@ -13,3 +13,7 @@ pub fn SYMBOL() -> ByteArray { pub fn OWNER() -> ContractAddress { contract_address_const::<'owner'>() } + +pub fn UTU() -> ContractAddress { + contract_address_const::<'utu'>() +} From a1d5fd77544d67019d1ee8bfc3941da714a49423 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Tue, 17 Dec 2024 17:22:34 +0100 Subject: [PATCH 06/11] emit events for request updates --- .../onchain/src/orderbook/orderbook.cairo | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/onchain/src/orderbook/orderbook.cairo b/packages/onchain/src/orderbook/orderbook.cairo index a634fdf..c515121 100644 --- a/packages/onchain/src/orderbook/orderbook.cairo +++ b/packages/onchain/src/orderbook/orderbook.cairo @@ -41,6 +41,36 @@ mod Orderbook { self.initializer(:strk_token, :relay_address); } + #[event] + #[derive(Drop, starknet::Event)] + pub enum Event { + RequestCreated: RequestCreated, + RequestCanceled: RequestCanceled, + RequestLocked: RequestLocked, + RequestCompleted: RequestCompleted, + } + + #[derive(Drop, starknet::Event)] + pub struct RequestCreated { + pub id: u32, + pub data: ByteArray, + } + + #[derive(Drop, starknet::Event)] + pub struct RequestCanceled { + pub id: u32, + } + + #[derive(Drop, starknet::Event)] + pub struct RequestLocked { + pub id: u32, + } + + #[derive(Drop, starknet::Event)] + pub struct RequestCompleted { + pub id: u32, + } + #[abi(embed_v0)] impl OrderbookImpl of super::IOrderbook { /// Called by a user. @@ -76,8 +106,9 @@ mod Orderbook { ); } let id = self.new_inscription_id.read(); - self.inscriptions.write(id, (inscription_data, submitter_fee)); + self.inscriptions.write(id, (inscription_data.clone(), submitter_fee)); self.inscription_statuses.write(id, Status::Open); + self.emit(RequestCreated { id: id, data: inscription_data }); id } @@ -122,6 +153,7 @@ mod Orderbook { let (inscription_data, _) = self.inscriptions.read(inscription_id); self.inscriptions.write(inscription_id, (inscription_data, 0)); self.inscription_statuses.write(inscription_id, Status::Canceled); + self.emit(RequestCanceled { id: inscription_id }); } /// Called by a submitter. Multiple submitters are allowed to lock the @@ -151,6 +183,7 @@ mod Orderbook { submitters.write(submitter, submitter); self.inscription_statuses.write(inscription_id, Status::Locked); + self.emit(RequestLocked { id: inscription_id }); } /// Called by a submitter. The fee is transferred to the submitter if @@ -174,6 +207,7 @@ mod Orderbook { // TODO: assert that the witness data contains the requested inscription self.inscription_statuses.write(inscription_id, Status::Closed); + self.emit(RequestCompleted { id: inscription_id }); } /// Helper function that checks if the inscription has already been locked. From ce9b25496bf530d22ddf50eb45e79cb9a12e9fa3 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Wed, 18 Dec 2024 14:01:09 +0100 Subject: [PATCH 07/11] remove redundant helper functions and param --- .../onchain/src/orderbook/interface.cairo | 6 ---- .../onchain/src/orderbook/orderbook.cairo | 29 ------------------- .../src/orderbook/test_orderbook.cairo | 19 ++++++------ 3 files changed, 9 insertions(+), 45 deletions(-) diff --git a/packages/onchain/src/orderbook/interface.cairo b/packages/onchain/src/orderbook/interface.cairo index 43f720d..fa2b5f1 100644 --- a/packages/onchain/src/orderbook/interface.cairo +++ b/packages/onchain/src/orderbook/interface.cairo @@ -16,7 +16,6 @@ pub trait IOrderbook { ref self: TContractState, inscription_data: ByteArray, receiving_address: ByteArray, - satoshi: felt252, currency_fee: felt252, submitter_fee: u256, ) -> u32; @@ -24,8 +23,6 @@ pub trait IOrderbook { fn lock_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); fn submit_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); fn query_inscription(self: @TContractState, inscription_id: u32) -> (ByteArray, u256); - fn is_valid_bitcoin_address(self: @TContractState, receiving_address: ByteArray) -> bool; - fn is_locked(self: @TContractState, tx_hash: ByteArray) -> (bool, ContractAddress); } #[starknet::interface] @@ -34,7 +31,6 @@ pub trait OrderbookABI { ref self: TContractState, inscription_data: ByteArray, receiving_address: ByteArray, - satoshi: felt252, currency_fee: felt252, submitter_fee: u256, ) -> u32; @@ -42,8 +38,6 @@ pub trait OrderbookABI { fn lock_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); fn submit_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); fn query_inscription(self: @TContractState, inscription_id: u32) -> (ByteArray, u256); - fn is_valid_bitcoin_address(self: @TContractState, receiving_address: ByteArray) -> bool; - fn is_locked(self: @TContractState, tx_hash: ByteArray) -> (bool, ContractAddress); // ERC20 functions fn balance_of(self: @TContractState, account: ContractAddress) -> felt252; diff --git a/packages/onchain/src/orderbook/orderbook.cairo b/packages/onchain/src/orderbook/orderbook.cairo index c515121..02ae419 100644 --- a/packages/onchain/src/orderbook/orderbook.cairo +++ b/packages/onchain/src/orderbook/orderbook.cairo @@ -77,7 +77,6 @@ mod Orderbook { /// Inputs: /// - `inscription_data: ByteArray`, the data to be inscribed on Bitcoin. /// - `receiving_address: ByteArray`, the taproot address that will own the inscription. - /// - `satoshi: felt252`, the Sat where the user wants to inscribe data. /// - `currency_fee: felt252`, 'STRK' tokens. /// - `submitter_fee: u256`, fee to be paid to the submitter for the inscription. /// Returns: @@ -86,14 +85,9 @@ mod Orderbook { ref self: ContractState, inscription_data: ByteArray, receiving_address: ByteArray, - satoshi: felt252, currency_fee: felt252, submitter_fee: u256, ) -> u32 { - assert( - self.is_valid_bitcoin_address(receiving_address) == true, - 'Not a valid bitcoin address', - ); assert(currency_fee == 'STRK'.into(), 'The currency is not supported'); let caller = get_caller_address(); let escrow_address = get_contract_address(); @@ -112,16 +106,6 @@ mod Orderbook { id } - /// Helper function that checks the format of the taproot address. - /// Inputs: - /// - `receiving_address: ByteArray`, the ID of the inscription. - /// Returns: - /// - `bool` - fn is_valid_bitcoin_address(self: @ContractState, receiving_address: ByteArray) -> bool { - // TODO: implement the check that the receiving address is in valid format. - true - } - /// Inputs: /// - `inscription_id: felt252`, the ID of the inscription. /// Returns: @@ -209,19 +193,6 @@ mod Orderbook { self.inscription_statuses.write(inscription_id, Status::Closed); self.emit(RequestCompleted { id: inscription_id }); } - - /// Helper function that checks if the inscription has already been locked. - /// Inputs: - /// - `tx_hash: ByteArray`, the precomputed transaction hash for the inscription - /// being locked. - /// Returns: - /// - `(bool, ContractAddress)` - fn is_locked(self: @ContractState, tx_hash: ByteArray) -> (bool, ContractAddress) { - // TODO: fetch the relevant lock made with the precomputed tx hash - - let caller = get_caller_address(); - (true, caller) - } } #[generate_trait] diff --git a/packages/onchain/src/orderbook/test_orderbook.cairo b/packages/onchain/src/orderbook/test_orderbook.cairo index aec56b5..99aed17 100644 --- a/packages/onchain/src/orderbook/test_orderbook.cairo +++ b/packages/onchain/src/orderbook/test_orderbook.cairo @@ -64,7 +64,7 @@ fn test_request_inscription_stored_and_retrieved() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); - orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); + orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); let expected = ("data", 10); // the inscription data and the submitter fee let actual = orderbook_dispatcher.query_inscription(0); @@ -90,7 +90,7 @@ fn test_request_inscription_fails_wrong_currency() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); - orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 1, 'BTC'.into(), 10); + orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 'BTC'.into(), 10); } #[test] @@ -103,8 +103,7 @@ fn test_request_inscription_fails_insufficient_balance() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 2000); - orderbook_dispatcher - .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 2000); + orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 'STRK'.into(), 2000); } #[test] @@ -117,7 +116,7 @@ fn test_lock_inscription_works() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher - .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); + .request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); start_cheat_block_number_global(1000); orderbook_dispatcher.lock_inscription(id, "hash"); @@ -135,7 +134,7 @@ fn test_lock_inscription_fails_prior_lock_not_expired() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher - .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); + .request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); orderbook_dispatcher.lock_inscription(id, "hash"); orderbook_dispatcher.lock_inscription(id, "other_hash"); @@ -152,7 +151,7 @@ fn test_lock_inscription_fails_inscription_not_found() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let _ = orderbook_dispatcher - .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); + .request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); orderbook_dispatcher.lock_inscription(42, "hash"); } @@ -171,7 +170,7 @@ fn test_cancel_inscription_works() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher - .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); + .request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); start_cheat_caller_address_global(orderbook_dispatcher.contract_address); // TODO: is this the correct way to set permissions? @@ -192,7 +191,7 @@ fn test_cancel_inscription_fails_locked() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher - .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); + .request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); orderbook_dispatcher.lock_inscription(id, "hash"); orderbook_dispatcher.cancel_inscription(id, 'STRK'.into()) @@ -213,7 +212,7 @@ fn test_cancel_inscription_fails_canceled() { token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); let id = orderbook_dispatcher - .request_inscription(test_data, test_taproot_address, 1, 'STRK'.into(), 10); + .request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); start_cheat_caller_address_global(orderbook_dispatcher.contract_address); token_dispatcher.approve(orderbook_dispatcher.contract_address, 100); From 86ebc1c327b57e9e0367974cf0a34ba2e89a2c75 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Wed, 18 Dec 2024 14:54:01 +0100 Subject: [PATCH 08/11] add emitted details in events --- .../onchain/src/orderbook/interface.cairo | 8 ++- .../onchain/src/orderbook/orderbook.cairo | 60 ++++++++++++++----- .../src/orderbook/test_orderbook.cairo | 2 +- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/packages/onchain/src/orderbook/interface.cairo b/packages/onchain/src/orderbook/interface.cairo index fa2b5f1..aa99638 100644 --- a/packages/onchain/src/orderbook/interface.cairo +++ b/packages/onchain/src/orderbook/interface.cairo @@ -22,7 +22,9 @@ pub trait IOrderbook { fn cancel_inscription(ref self: TContractState, inscription_id: u32, currency_fee: felt252); fn lock_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); fn submit_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); - fn query_inscription(self: @TContractState, inscription_id: u32) -> (ByteArray, u256); + fn query_inscription( + self: @TContractState, inscription_id: u32, + ) -> (ContractAddress, ByteArray, u256); } #[starknet::interface] @@ -37,7 +39,9 @@ pub trait OrderbookABI { fn cancel_inscription(ref self: TContractState, inscription_id: u32, currency_fee: felt252); fn lock_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); fn submit_inscription(ref self: TContractState, inscription_id: u32, tx_hash: ByteArray); - fn query_inscription(self: @TContractState, inscription_id: u32) -> (ByteArray, u256); + fn query_inscription( + self: @TContractState, inscription_id: u32, + ) -> (ContractAddress, ByteArray, u256); // ERC20 functions fn balance_of(self: @TContractState, account: ContractAddress) -> felt252; diff --git a/packages/onchain/src/orderbook/orderbook.cairo b/packages/onchain/src/orderbook/orderbook.cairo index 02ae419..7f8e70a 100644 --- a/packages/onchain/src/orderbook/orderbook.cairo +++ b/packages/onchain/src/orderbook/orderbook.cairo @@ -16,9 +16,9 @@ mod Orderbook { struct Storage { // ID of the next inscription. new_inscription_id: u32, - // A map from the inscription ID to a tuple with the inscribed - // data and submitter fee. - inscriptions: Map, + // A map from the inscription ID to a tuple with the caller, the + // inscribed data, and submitter fee. + inscriptions: Map, // A map from the inscription ID to status. Possible values: // 'Open', 'Locked', 'Canceled', 'Closed'. inscription_statuses: Map, @@ -53,22 +53,31 @@ mod Orderbook { #[derive(Drop, starknet::Event)] pub struct RequestCreated { pub id: u32, - pub data: ByteArray, + pub caller: ContractAddress, + pub inscription_data: ByteArray, + pub receiving_address: ByteArray, + pub currency_fee: felt252, + pub submitter_fee: u256, } #[derive(Drop, starknet::Event)] pub struct RequestCanceled { pub id: u32, + pub currency_fee: felt252, } #[derive(Drop, starknet::Event)] pub struct RequestLocked { pub id: u32, + pub submitter: ContractAddress, + pub tx_hash: ByteArray, } #[derive(Drop, starknet::Event)] pub struct RequestCompleted { pub id: u32, + pub submitter: ContractAddress, + pub tx_hash: ByteArray, } #[abi(embed_v0)] @@ -100,9 +109,19 @@ mod Orderbook { ); } let id = self.new_inscription_id.read(); - self.inscriptions.write(id, (inscription_data.clone(), submitter_fee)); + self.inscriptions.write(id, (caller, inscription_data.clone(), submitter_fee)); self.inscription_statuses.write(id, Status::Open); - self.emit(RequestCreated { id: id, data: inscription_data }); + self + .emit( + RequestCreated { + id: id, + caller: caller, + inscription_data: inscription_data, + receiving_address: receiving_address, + currency_fee: currency_fee, + submitter_fee: submitter_fee, + }, + ); id } @@ -110,7 +129,9 @@ mod Orderbook { /// - `inscription_id: felt252`, the ID of the inscription. /// Returns: /// - `(ByteArray, felt252)`, the tuple with the inscribed data and the fee. - fn query_inscription(self: @ContractState, inscription_id: u32) -> (ByteArray, u256) { + fn query_inscription( + self: @ContractState, inscription_id: u32, + ) -> (ContractAddress, ByteArray, u256) { self.inscriptions.read(inscription_id) } @@ -120,24 +141,27 @@ mod Orderbook { /// cancel. /// - `currency_fee: felt252`, the token that the user paid the submitter fee in. fn cancel_inscription(ref self: ContractState, inscription_id: u32, currency_fee: felt252) { + let caller = get_caller_address(); + let (request_creator, inscription_data, amount) = self + .inscriptions + .read(inscription_id); + assert(caller == request_creator, 'Caller cannot cancel this id'); + let status = self.inscription_statuses.read(inscription_id); assert(status != Status::Undefined, 'Inscription does not exist'); assert(status != Status::Locked, 'The inscription is locked'); assert(status != Status::Canceled, 'The inscription is canceled'); assert(status != Status::Closed, 'The inscription has been closed'); - let caller = get_caller_address(); // TODO: change the address to the actual escrow contract once it's implemented. let escrow_address = get_contract_address(); if (currency_fee == 'STRK'.into()) { let strk_token = self.strk_token.read(); - let (_, amount) = self.inscriptions.read(inscription_id); strk_token.transfer_from(sender: escrow_address, recipient: caller, amount: amount); } - let (inscription_data, _) = self.inscriptions.read(inscription_id); - self.inscriptions.write(inscription_id, (inscription_data, 0)); + self.inscriptions.write(inscription_id, (caller, inscription_data, 0)); self.inscription_statuses.write(inscription_id, Status::Canceled); - self.emit(RequestCanceled { id: inscription_id }); + self.emit(RequestCanceled { id: inscription_id, currency_fee: currency_fee }); } /// Called by a submitter. Multiple submitters are allowed to lock the @@ -167,7 +191,7 @@ mod Orderbook { submitters.write(submitter, submitter); self.inscription_statuses.write(inscription_id, Status::Locked); - self.emit(RequestLocked { id: inscription_id }); + self.emit(RequestLocked { id: inscription_id, submitter: submitter, tx_hash: tx_hash }); } /// Called by a submitter. The fee is transferred to the submitter if @@ -178,6 +202,11 @@ mod Orderbook { /// - `inscription_id: felt252`, the ID of the inscription being locked. /// - `tx_hash: ByteArray`, the hash of the transaction submitted to Bitcoin. fn submit_inscription(ref self: ContractState, inscription_id: u32, tx_hash: ByteArray) { + let caller = get_caller_address(); + let submitters = self.submitters.entry(inscription_id); + let submitter = submitters.read(caller); + assert(caller == submitter, 'Caller does not match submitter'); + let (_, precomputed_tx_hash, _) = self.inscription_locks.read(inscription_id); assert(precomputed_tx_hash == tx_hash, 'Precomputed hash != submitted'); @@ -191,7 +220,10 @@ mod Orderbook { // TODO: assert that the witness data contains the requested inscription self.inscription_statuses.write(inscription_id, Status::Closed); - self.emit(RequestCompleted { id: inscription_id }); + self + .emit( + RequestCompleted { id: inscription_id, submitter: submitter, tx_hash: tx_hash }, + ); } } diff --git a/packages/onchain/src/orderbook/test_orderbook.cairo b/packages/onchain/src/orderbook/test_orderbook.cairo index 99aed17..5bb5bdb 100644 --- a/packages/onchain/src/orderbook/test_orderbook.cairo +++ b/packages/onchain/src/orderbook/test_orderbook.cairo @@ -66,7 +66,7 @@ fn test_request_inscription_stored_and_retrieved() { orderbook_dispatcher.request_inscription(test_data, test_taproot_address, 'STRK'.into(), 10); - let expected = ("data", 10); // the inscription data and the submitter fee + let expected = (test_address(), "data", 10); // the inscription data and the submitter fee let actual = orderbook_dispatcher.query_inscription(0); assert_eq!(expected, actual); From 5e009bef17534ba51aff678f1e6aa4eda59ba9b2 Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Wed, 18 Dec 2024 17:27:59 +0100 Subject: [PATCH 09/11] match mock contract interface --- packages/onchain/src/orderbook/mock.cairo | 44 +++++++++++-------- .../onchain/src/orderbook/orderbook.cairo | 5 +++ 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/packages/onchain/src/orderbook/mock.cairo b/packages/onchain/src/orderbook/mock.cairo index 96cbc75..99e5c4b 100644 --- a/packages/onchain/src/orderbook/mock.cairo +++ b/packages/onchain/src/orderbook/mock.cairo @@ -17,7 +17,7 @@ mod OrderbookMock { new_inscription_id: u32, // A map from the inscription ID to a tuple with the inscribed // data and submitter fee. - inscriptions: Map, + inscriptions: Map, // A map from the inscription ID to status. Possible values: // 'Open', 'Locked', 'Canceled', 'Closed'. inscription_statuses: Map, @@ -47,7 +47,6 @@ mod OrderbookMock { caller: ContractAddress, inscription_data: ByteArray, receiving_address: ByteArray, - satoshi: felt252, currency_fee: felt252, submitter_fee: u256, } @@ -85,7 +84,6 @@ mod OrderbookMock { /// Inputs: /// - `inscription_data: ByteArray`, the data to be inscribed on Bitcoin. /// - `receiving_address: ByteArray`, the taproot address that will own the inscription. - /// - `satoshi: felt252`, the Sat where the user wants to inscribe data. /// - `currency_fee: felt252`, 'STRK' tokens. /// - `submitter_fee: u256`, fee to be paid to the submitter for the inscription. /// Returns: @@ -94,12 +92,13 @@ mod OrderbookMock { ref self: ContractState, inscription_data: ByteArray, receiving_address: ByteArray, - satoshi: felt252, currency_fee: felt252, submitter_fee: u256, ) -> u32 { + assert(currency_fee == 'STRK'.into(), 'The currency is not supported'); + let caller = get_caller_address(); let id = self.new_inscription_id.read(); - self.inscriptions.write(id, (inscription_data.clone(), submitter_fee)); + self.inscriptions.write(id, (caller, inscription_data.clone(), submitter_fee)); self.inscription_statuses.write(id, Status::Open); self.new_inscription_id.write(id + 1); self @@ -109,7 +108,6 @@ mod OrderbookMock { caller: get_caller_address(), inscription_data: inscription_data, receiving_address: receiving_address, - satoshi: satoshi, currency_fee: currency_fee, submitter_fee: submitter_fee, }, @@ -123,8 +121,25 @@ mod OrderbookMock { /// cancel. /// - `currency_fee: felt252`, the token that the user paid the submitter fee in. fn cancel_inscription(ref self: ContractState, inscription_id: u32, currency_fee: felt252) { - let (inscription_data, _) = self.inscriptions.read(inscription_id); - self.inscriptions.write(inscription_id, (inscription_data, 0)); + let caller = get_caller_address(); + let (request_creator, inscription_data, amount) = self + .inscriptions + .read(inscription_id); + assert(caller == request_creator, 'Caller cannot cancel this id'); + + let status = self.inscription_statuses.read(inscription_id); + assert(status != Status::Undefined, 'Inscription does not exist'); + assert(status != Status::Locked, 'The inscription is locked'); + assert(status != Status::Canceled, 'The inscription is canceled'); + assert(status != Status::Closed, 'The inscription has been closed'); + + // TODO: change the address to the actual escrow contract once it's implemented. + let escrow_address = get_contract_address(); + if (currency_fee == 'STRK'.into()) { + let strk_token = self.strk_token.read(); + strk_token.transfer_from(sender: escrow_address, recipient: caller, amount: amount); + } + self.inscriptions.write(inscription_id, (caller, inscription_data, 0)); self.inscription_statuses.write(inscription_id, Status::Canceled); self .emit( @@ -165,18 +180,11 @@ mod OrderbookMock { self.emit(RequestCompleted { inscription_id: inscription_id, tx_hash: tx_hash }); } - fn query_inscription(self: @ContractState, inscription_id: u32) -> (ByteArray, u256) { + fn query_inscription( + self: @ContractState, inscription_id: u32, + ) -> (ContractAddress, ByteArray, u256) { return self.inscriptions.read(inscription_id); } - - - fn is_valid_bitcoin_address(self: @ContractState, receiving_address: ByteArray) -> bool { - return true; - } - - fn is_locked(self: @ContractState, tx_hash: ByteArray) -> (bool, ContractAddress) { - return (true, get_contract_address()); - } } #[generate_trait] diff --git a/packages/onchain/src/orderbook/orderbook.cairo b/packages/onchain/src/orderbook/orderbook.cairo index 7f8e70a..cbabc68 100644 --- a/packages/onchain/src/orderbook/orderbook.cairo +++ b/packages/onchain/src/orderbook/orderbook.cairo @@ -52,7 +52,9 @@ mod Orderbook { #[derive(Drop, starknet::Event)] pub struct RequestCreated { + #[key] pub id: u32, + #[key] pub caller: ContractAddress, pub inscription_data: ByteArray, pub receiving_address: ByteArray, @@ -62,12 +64,14 @@ mod Orderbook { #[derive(Drop, starknet::Event)] pub struct RequestCanceled { + #[key] pub id: u32, pub currency_fee: felt252, } #[derive(Drop, starknet::Event)] pub struct RequestLocked { + #[key] pub id: u32, pub submitter: ContractAddress, pub tx_hash: ByteArray, @@ -75,6 +79,7 @@ mod Orderbook { #[derive(Drop, starknet::Event)] pub struct RequestCompleted { + #[key] pub id: u32, pub submitter: ContractAddress, pub tx_hash: ByteArray, From 0ecaca9d57d0799e60e172c4819dd02d41048e7a Mon Sep 17 00:00:00 2001 From: Lana Ivina Date: Wed, 18 Dec 2024 18:31:45 +0100 Subject: [PATCH 10/11] remove redundant escrow contract --- README.md | 12 ++++-------- packages/onchain/src/escrow.cairo | 1 - packages/onchain/src/escrow/escrow.cairo | 17 ----------------- packages/onchain/src/lib.cairo | 1 - packages/onchain/src/orderbook/mock.cairo | 1 - packages/onchain/src/orderbook/orderbook.cairo | 2 -- 6 files changed, 4 insertions(+), 30 deletions(-) delete mode 100644 packages/onchain/src/escrow.cairo delete mode 100644 packages/onchain/src/escrow/escrow.cairo diff --git a/README.md b/README.md index c38a592..2991ed0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ > Order on Starknet, write on Bitcoin, get money trustlessly, repeat -Broly is a decentralized Bitcoin inscription service that uses Starknet for orderbook management and escrow. It enables trustless Bitcoin inscriptions with guaranteed payments through smart contracts. +Broly is a decentralized Bitcoin inscription service that uses Starknet for orderbook management. It enables trustless Bitcoin inscriptions with guaranteed payments through smart contracts.
GitHub Workflow Status @@ -34,7 +34,6 @@ flowchart TB subgraph Starknet OB[Orderbook Contract] - ES[Escrow Contract] end subgraph Bitcoin @@ -51,10 +50,8 @@ flowchart TB UI <--> SW API --> DB SW <--> OB - SW <--> ES IS --> BTC OM --> OB - OM --> ES API --> IS IS --> API ``` @@ -65,11 +62,11 @@ flowchart TB 2. User creates an inscription order: - Specifies inscription content and reward amount - Order is created on Starknet orderbook - - Funds are locked in escrow contract + - Funds are locked in the contract 3. Inscribor service: - Monitors pending orders - Creates Bitcoin inscriptions - - Triggers escrow release on successful inscription + - Triggers reward release on successful inscription 4. User receives inscription, inscribor receives reward ## Getting Started @@ -144,7 +141,6 @@ broly/ ### Smart Contracts (onchain) - Orderbook contract -- Escrow contract - Payment handling ### Inscribor Service @@ -152,7 +148,7 @@ broly/ - Order monitoring - Bitcoin inscription creation - Transaction verification -- Starknet interaction for escrow release +- Starknet interaction for reward release ## License diff --git a/packages/onchain/src/escrow.cairo b/packages/onchain/src/escrow.cairo deleted file mode 100644 index 2af7051..0000000 --- a/packages/onchain/src/escrow.cairo +++ /dev/null @@ -1 +0,0 @@ -mod escrow; diff --git a/packages/onchain/src/escrow/escrow.cairo b/packages/onchain/src/escrow/escrow.cairo deleted file mode 100644 index b69d849..0000000 --- a/packages/onchain/src/escrow/escrow.cairo +++ /dev/null @@ -1,17 +0,0 @@ -#[starknet::interface] -trait IEscrow { - fn greet(ref self: TContractState) -> felt252; -} - -#[starknet::contract] -mod Escrow { - #[storage] - struct Storage {} - - #[abi(embed_v0)] - impl EscrowImpl of super::IEscrow { - fn greet(ref self: ContractState) -> felt252 { - 'Kakarotto' - } - } -} diff --git a/packages/onchain/src/lib.cairo b/packages/onchain/src/lib.cairo index d8b5e2a..51b511c 100644 --- a/packages/onchain/src/lib.cairo +++ b/packages/onchain/src/lib.cairo @@ -1,4 +1,3 @@ -mod escrow; mod orderbook; mod utils; mod relay; diff --git a/packages/onchain/src/orderbook/mock.cairo b/packages/onchain/src/orderbook/mock.cairo index 99e5c4b..6f58bf8 100644 --- a/packages/onchain/src/orderbook/mock.cairo +++ b/packages/onchain/src/orderbook/mock.cairo @@ -133,7 +133,6 @@ mod OrderbookMock { assert(status != Status::Canceled, 'The inscription is canceled'); assert(status != Status::Closed, 'The inscription has been closed'); - // TODO: change the address to the actual escrow contract once it's implemented. let escrow_address = get_contract_address(); if (currency_fee == 'STRK'.into()) { let strk_token = self.strk_token.read(); diff --git a/packages/onchain/src/orderbook/orderbook.cairo b/packages/onchain/src/orderbook/orderbook.cairo index cbabc68..7cfb441 100644 --- a/packages/onchain/src/orderbook/orderbook.cairo +++ b/packages/onchain/src/orderbook/orderbook.cairo @@ -107,7 +107,6 @@ mod Orderbook { let escrow_address = get_contract_address(); if (currency_fee == 'STRK'.into()) { let strk_token = self.strk_token.read(); - // TODO: change the transfer to the escrow contract once it's implemented. strk_token .transfer_from( sender: caller, recipient: escrow_address, amount: submitter_fee, @@ -158,7 +157,6 @@ mod Orderbook { assert(status != Status::Canceled, 'The inscription is canceled'); assert(status != Status::Closed, 'The inscription has been closed'); - // TODO: change the address to the actual escrow contract once it's implemented. let escrow_address = get_contract_address(); if (currency_fee == 'STRK'.into()) { let strk_token = self.strk_token.read(); From f74a317ff6df0579e5b17bddd13407f711fe143b Mon Sep 17 00:00:00 2001 From: Brandon R <54774639+b-j-roberts@users.noreply.github.com> Date: Wed, 18 Dec 2024 20:36:04 -0600 Subject: [PATCH 11/11] Feat: starknet wallet interact (#27) * Initialize wallet integration with starknetkit * Info screen, responsive, and add starknet-react * Cleanup icons * Fix icons shadows --- .env.example | 3 + README.md | 3 +- apps/web/package.json | 6 +- apps/web/public/images/logo-high.png | Bin 0 -> 37165 bytes apps/web/public/images/logo.png | Bin 21537 -> 21772 bytes apps/web/src/App.tsx | 132 +- apps/web/src/abi/orderbook.abi.json | 317 +++ apps/web/src/components/Header.css | 2 - apps/web/src/components/Header.tsx | 21 +- apps/web/src/components/StarknetProvider.tsx | 43 + apps/web/src/components/inscription/Form.css | 6 +- apps/web/src/components/inscription/Form.tsx | 5 +- apps/web/src/components/inscription/View.css | 3 +- apps/web/src/connections/index.tsx | 87 + apps/web/src/index.css | 13 +- apps/web/src/main.tsx | 5 +- apps/web/src/pages/Collection.tsx | 10 +- apps/web/src/pages/Home.tsx | 8 +- apps/web/src/pages/Info.tsx | 47 +- apps/web/src/pages/Inscription.tsx | 2 +- apps/web/src/pages/Inscriptions.tsx | 12 +- apps/web/src/pages/Request.tsx | 2 +- docker-compose.yml | 2 + pnpm-lock.yaml | 2131 +++++++++++++++++- 24 files changed, 2780 insertions(+), 80 deletions(-) create mode 100644 apps/web/public/images/logo-high.png create mode 100644 apps/web/src/abi/orderbook.abi.json create mode 100644 apps/web/src/components/StarknetProvider.tsx create mode 100644 apps/web/src/connections/index.tsx diff --git a/.env.example b/.env.example index 43dcd2b..66f9c77 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,6 @@ +# Needed to run Indexer APIBARA_AUTH_TOKEN=dna_xxx + +# Only needed to deploy the contract STARKNET_KEYSTORE=$HOME/.starkli-sepolia/starkli-keystore.json STARKNET_ACCOUNT=$HOME/.starkli-sepolia/starkli-account.json diff --git a/README.md b/README.md index 2991ed0..be09fc6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- broly-logo + broly-logo # B.R.O.L.Y. ***Bitcoin Registry Orchestrates Like Yesterday*** @@ -97,6 +97,7 @@ broly/ ├── packages/ │ ├── inscribor/ # Bitcoin inscription service │ ├── onchain/ # Starknet smart contracts +│ ├── scripts/ # Deployment & Testing scripts │ └── indexer/ # Starknet contract indexing ├── package.json └── turbo.json diff --git a/apps/web/package.json b/apps/web/package.json index 7d15a18..b932943 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,9 +11,13 @@ "preview": "vite preview" }, "dependencies": { + "@starknet-react/chains": "^3.1.1", + "@starknet-react/core": "^3.6.3", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router": "^7.0.1" + "react-router": "^7.0.1", + "starknet": "^6.11.0", + "starknetkit": "^2.6.1" }, "devDependencies": { "@eslint/js": "^9.13.0", diff --git a/apps/web/public/images/logo-high.png b/apps/web/public/images/logo-high.png new file mode 100644 index 0000000000000000000000000000000000000000..59cc6aea9aa7c393b6211ed85a2501dfdc9d0af4 GIT binary patch literal 37165 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 { + // TODO: If no wallet/connectors? + // TODO: Auto-reconnect on page refresh? + const { connector } = await starknetkitConnectModal() + if (!connector) { + return + } + connect({ connector }) + setConnector(connector) + } + + useEffect(() => { + if (!connectors) return; + if (connectors.length === 0) return; + if (isConnected) return; + + const connectIfReady = async () => { + for (let i = 0; i < connectors.length; i++) { + let ready = await connectors[i].ready(); + if (ready) { + connect({ connector: connectors[i] }) + //setConnector(connectors[i]) + break; + } + } + }; + connectIfReady(); + }, [connectors]); + + useEffect(() => { + if (status === 'connected') { + setIsConnected(true) + } else if (status === 'disconnected') { + setIsConnected(false) + } + }, [address, status]) + + const disconnectWallet = async () => { + if (!isConnected || !connector) { + return + } + disconnect() + setConnector(null) + setIsConnected(false) + } + + const toHex = (str: string) => { + let hex = '0x'; + for (let i = 0; i < str.length; i++) { + hex += '' + str.charCodeAt(i).toString(16); + } + return hex; + }; + + const { contract: orderbookContract } = useContract({ + address: import.meta.env.VITE_BROLY_CONTRACT_ADDRESS, + abi: orderbook_abi as any + }); + + const [calls, setCalls] = useState([] as any[]) + const requestInscriptionCall = async () => { + if (!address || !orderbookContract) { + return + } + const calldata = CallData.compile([ + byteArray.byteArrayFromString("message:Hello, Starknet!"), + byteArray.byteArrayFromString("tb1234567890123456789012345678901234567890"), + Number(100), + toHex("STRK"), + uint256.bnToUint256(2000) + ]); + setCalls( + [orderbookContract.populate('request_inscription', calldata)] + ) + } + const { send, data, isPending } = useSendTransaction({ + calls + }); + useEffect(() => { + const requestCall = async () => { + if (calls.length === 0) return; + send(); + console.log('Call successful:', data, isPending); + // TODO: Update the UI with the new vote count + }; + requestCall(); + }, [calls]); + + const cancelInscriptionCall = async () => { + // TODO + } + const [tabs, _setTabs] = useState([ - { name: 'Home', path: '/', component: Home }, + { name: 'Home', path: '/', component: Home as any }, { name: 'Inscriptions', path: '/inscriptions', component: Inscriptions }, { name: 'Collection', path: '/collection', component: Collection }, { name: 'Info', path: '/info', component: Info }, ]) + const tabProps = { + requestInscriptionCall, + cancelInscriptionCall, + orderbookContract + } // TODO: } /> return (
-
+
{tabs.map((tab) => ( - } /> + } /> ))} - } /> - } /> + } /> + } />
) diff --git a/apps/web/src/abi/orderbook.abi.json b/apps/web/src/abi/orderbook.abi.json new file mode 100644 index 0000000..97bf9e9 --- /dev/null +++ b/apps/web/src/abi/orderbook.abi.json @@ -0,0 +1,317 @@ +[ + { + "type": "impl", + "name": "OrderbookMockImpl", + "interface_name": "onchain::orderbook::interface::IOrderbook" + }, + { + "type": "struct", + "name": "core::byte_array::ByteArray", + "members": [ + { + "name": "data", + "type": "core::array::Array::" + }, + { + "name": "pending_word", + "type": "core::felt252" + }, + { + "name": "pending_word_len", + "type": "core::integer::u32" + } + ] + }, + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "interface", + "name": "onchain::orderbook::interface::IOrderbook", + "items": [ + { + "type": "function", + "name": "request_inscription", + "inputs": [ + { + "name": "inscription_data", + "type": "core::byte_array::ByteArray" + }, + { + "name": "receiving_address", + "type": "core::byte_array::ByteArray" + }, + { + "name": "satoshi", + "type": "core::felt252" + }, + { + "name": "currency_fee", + "type": "core::felt252" + }, + { + "name": "submitter_fee", + "type": "core::integer::u256" + } + ], + "outputs": [ + { + "type": "core::integer::u32" + } + ], + "state_mutability": "external" + }, + { + "type": "function", + "name": "cancel_inscription", + "inputs": [ + { + "name": "inscription_id", + "type": "core::integer::u32" + }, + { + "name": "currency_fee", + "type": "core::felt252" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "lock_inscription", + "inputs": [ + { + "name": "inscription_id", + "type": "core::integer::u32" + }, + { + "name": "tx_hash", + "type": "core::byte_array::ByteArray" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "submit_inscription", + "inputs": [ + { + "name": "inscription_id", + "type": "core::integer::u32" + }, + { + "name": "tx_hash", + "type": "core::byte_array::ByteArray" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "query_inscription", + "inputs": [ + { + "name": "inscription_id", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "(core::byte_array::ByteArray, core::integer::u256)" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "is_valid_bitcoin_address", + "inputs": [ + { + "name": "receiving_address", + "type": "core::byte_array::ByteArray" + } + ], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "is_locked", + "inputs": [ + { + "name": "tx_hash", + "type": "core::byte_array::ByteArray" + } + ], + "outputs": [ + { + "type": "(core::bool, core::starknet::contract_address::ContractAddress)" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "strk_token", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "event", + "name": "onchain::orderbook::mock::OrderbookMock::RequestCreated", + "kind": "struct", + "members": [ + { + "name": "inscription_id", + "type": "core::integer::u32", + "kind": "key" + }, + { + "name": "caller", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "key" + }, + { + "name": "inscription_data", + "type": "core::byte_array::ByteArray", + "kind": "data" + }, + { + "name": "receiving_address", + "type": "core::byte_array::ByteArray", + "kind": "data" + }, + { + "name": "satoshi", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "currency_fee", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "submitter_fee", + "type": "core::integer::u256", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "onchain::orderbook::mock::OrderbookMock::RequestCanceled", + "kind": "struct", + "members": [ + { + "name": "inscription_id", + "type": "core::integer::u32", + "kind": "key" + }, + { + "name": "currency_fee", + "type": "core::felt252", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "onchain::orderbook::mock::OrderbookMock::RequestLocked", + "kind": "struct", + "members": [ + { + "name": "inscription_id", + "type": "core::integer::u32", + "kind": "key" + }, + { + "name": "tx_hash", + "type": "core::byte_array::ByteArray", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "onchain::orderbook::mock::OrderbookMock::RequestCompleted", + "kind": "struct", + "members": [ + { + "name": "inscription_id", + "type": "core::integer::u32", + "kind": "key" + }, + { + "name": "tx_hash", + "type": "core::byte_array::ByteArray", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "onchain::orderbook::mock::OrderbookMock::Event", + "kind": "enum", + "variants": [ + { + "name": "RequestCreated", + "type": "onchain::orderbook::mock::OrderbookMock::RequestCreated", + "kind": "nested" + }, + { + "name": "RequestCanceled", + "type": "onchain::orderbook::mock::OrderbookMock::RequestCanceled", + "kind": "nested" + }, + { + "name": "RequestLocked", + "type": "onchain::orderbook::mock::OrderbookMock::RequestLocked", + "kind": "nested" + }, + { + "name": "RequestCompleted", + "type": "onchain::orderbook::mock::OrderbookMock::RequestCompleted", + "kind": "nested" + } + ] + } +] diff --git a/apps/web/src/components/Header.css b/apps/web/src/components/Header.css index f291722..52ce7d4 100644 --- a/apps/web/src/components/Header.css +++ b/apps/web/src/components/Header.css @@ -1,8 +1,6 @@ .tab__nav { - font-size: 1.2rem; font-weight: 500; color: #fff; - padding: 0.5rem 1rem; text-shadow: 0 0 5px rgba(0, 0, 0, 0.5); cursor: pointer; transition: all 0.2s; diff --git a/apps/web/src/components/Header.tsx b/apps/web/src/components/Header.tsx index 93c61ec..f65273c 100644 --- a/apps/web/src/components/Header.tsx +++ b/apps/web/src/components/Header.tsx @@ -1,22 +1,31 @@ import { NavLink } from "react-router"; +import { useAccount } from "@starknet-react/core"; import "./Header.css"; function Header(props: any) { return ( -
+
- B.R.O.L.Y. Logo -

B.R.O.L.Y.

+ B.R.O.L.Y. Logo +

B.R.O.L.Y.

-
); diff --git a/apps/web/src/components/StarknetProvider.tsx b/apps/web/src/components/StarknetProvider.tsx new file mode 100644 index 0000000..9e2dea6 --- /dev/null +++ b/apps/web/src/components/StarknetProvider.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +import { InjectedConnector } from "starknetkit/injected"; +import { ArgentMobileConnector, isInArgentMobileAppBrowser } from "starknetkit/argentMobile"; +import { WebWalletConnector } from "starknetkit/webwallet"; +import { mainnet, sepolia } from "@starknet-react/chains"; +import { StarknetConfig, publicProvider } from "@starknet-react/core"; + +export function StarknetProvider({ children }: { children: React.ReactNode }) { + const chains = [mainnet, sepolia] + + const connectors = isInArgentMobileAppBrowser() ? [ + ArgentMobileConnector.init({ + options: { + dappName: "B.R.O.L.Y.", + projectId: "broly-id", + url: window.location.href, + }, + inAppBrowserOptions: {}, + }) + ] : [ + new InjectedConnector({ options: { id: "braavos", name: "Braavos" }}), + new InjectedConnector({ options: { id: "argentX", name: "Argent X" }}), + new WebWalletConnector({ url: "https://web.argent.xyz" }), + ArgentMobileConnector.init({ + options: { + dappName: "B.R.O.L.Y.", + projectId: "broly-id", + url: window.location.href, + } + }) + ] + + return( + + {children} + + ) +} diff --git a/apps/web/src/components/inscription/Form.css b/apps/web/src/components/inscription/Form.css index 33d31f1..fb9a14b 100644 --- a/apps/web/src/components/inscription/Form.css +++ b/apps/web/src/components/inscription/Form.css @@ -2,9 +2,9 @@ height: 6rem; background-color: var(--color-tertiary); margin-right: 2rem; - border: 1px solid var(--color-primary-light); + border: 1px solid var(--color-primary-xlight); border-radius: 1rem; - box-shadow: 0 0 0.5rem var(--color-tertiary-dark); + box-shadow: 0 0 0.5rem var(--color-tertiary-ldark); position: relative; } @@ -41,7 +41,7 @@ height: 5.5rem; border: 1px solid var(--color-primary-light); border-radius: 1rem; - box-shadow: 0 0 2px var(--color-tertiary-dark); + box-shadow: 0 0 2px var(--color-tertiary-ldark); background-color: var(--color-primary); } diff --git a/apps/web/src/components/inscription/Form.tsx b/apps/web/src/components/inscription/Form.tsx index 74b2373..0ea4f44 100644 --- a/apps/web/src/components/inscription/Form.tsx +++ b/apps/web/src/components/inscription/Form.tsx @@ -8,12 +8,13 @@ function InscriptionForm(props: any) { const [uploadedImage, setUploadedImage] = useState(""); const [errorMessage, setErrorMessage] = useState(""); - const handleSubmit = (e: any) => { + const handleSubmit = async (e: any) => { e.preventDefault(); if (!uploadedImage) { setErrorMessage("Please upload an image"); return; } + await props.requestInscriptionCall(); props.setIsInscribing(true); }; @@ -34,7 +35,7 @@ function InscriptionForm(props: any) { // TODO: disabled button b4 input return ( -
+
{selectedOption === "Image" ? (
diff --git a/apps/web/src/components/inscription/View.css b/apps/web/src/components/inscription/View.css index 92cb02d..a47cbb7 100644 --- a/apps/web/src/components/inscription/View.css +++ b/apps/web/src/components/inscription/View.css @@ -6,10 +6,9 @@ background-image: linear-gradient( to bottom right, var(--color-tertiary) 60%, - var(--color-tertiary-dark) + var(--color-tertiary-ldark) ); box-shadow: 0 2px 4px var(--color-tertiary-dark); - overflow: hidden; cursor: pointer; transition: all 0.2s; } diff --git a/apps/web/src/connections/index.tsx b/apps/web/src/connections/index.tsx new file mode 100644 index 0000000..8a1872f --- /dev/null +++ b/apps/web/src/connections/index.tsx @@ -0,0 +1,87 @@ +import ARGENT_X_ICON from '../assets/argent-x.svg' +import ARGENTMOBILE_ICON from '../assets/argentmobile.svg' +import BRAAVOS_ICON from '../assets/braavos.svg' +import WEBWALLET_ICON from '../assets/webwallet.svg' +import { ArgentMobileConnector } from 'starknetkit/argentMobile' +import { InjectedConnector } from 'starknetkit/injected' +import { WebWalletConnector } from 'starknetkit/webwallet' + +enum ConnectionType { + ARGENT_X = 'ARGENT_X', + BRAAVOS = 'BRAAVOS', + WEBWALLET = 'WEBWALLET', + ARGENTMOBILE = 'ARGENTMOBILE', +} + +export interface L2Connection { + getName(): string + connector: InjectedConnector | ArgentMobileConnector | WebWalletConnector + type: ConnectionType + getIcon?(): string + shouldDisplay(): boolean + overrideActivate?: () => boolean +} + +export type Connection = L2Connection + +// ARGENT X + +const starknetArgentXWallet = new InjectedConnector({ options: { id: 'argentX' } }) + +const argentXWalletConnection: L2Connection = { + getName: () => 'Argent X', + connector: starknetArgentXWallet, + type: ConnectionType.ARGENT_X, + getIcon: () => ARGENT_X_ICON, + shouldDisplay: () => true, + // If on non-injected, non-mobile browser, prompt user to install ArgentX + overrideActivate: () => { + return false + }, +} + +// BRAAVOS + +const starknetBraavosWallet = new InjectedConnector({ options: { id: 'braavos' } }) + +const braavosWalletConnection: L2Connection = { + getName: () => 'Braavos', + connector: starknetBraavosWallet, + type: ConnectionType.BRAAVOS, + getIcon: () => BRAAVOS_ICON, + shouldDisplay: () => true, + // If on non-injected, prompt user to install Braavos + overrideActivate: () => { + return false + }, +} + +// WEB WALLET + +const webWallet = new WebWalletConnector({ url: 'https://web.argent.xyz' }) + +const webWalletConnection: L2Connection = { + getName: () => 'Argent Web Wallet', + connector: webWallet, + type: ConnectionType.WEBWALLET, + getIcon: () => WEBWALLET_ICON, + shouldDisplay: () => true, +} + +// ARGENT MOBILE + +const argentMobile = new ArgentMobileConnector() + +const argentMobileConnection: L2Connection = { + getName: () => 'Argent (mobile)', + connector: argentMobile, + type: ConnectionType.ARGENTMOBILE, + getIcon: () => ARGENTMOBILE_ICON, + shouldDisplay: () => true, +} + +// GETTERS + +export function getL2Connections() { + return [argentXWalletConnection, argentMobileConnection, braavosWalletConnection, webWalletConnection] +} diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 9935653..ab80f5b 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -6,11 +6,17 @@ :root { --color-primary: rgb(22, 19, 16); --color-primary-light: rgb(30, 28, 27); + --color-primary-xlight: rgb(100, 98, 97); --color-secondary: rgb(42, 220, 145); --color-secondary-dark: rgba(22, 160, 90, 1); - --color-tertiary: rgb(19, 16, 22); + --color-tertiary: rgb(24, 18, 26); + --color-tertiary-ldark: rgba(17, 12, 19); --color-tertiary-dark: rgba(8, 8, 10); } +/* + --color-tertiary: rgb(19, 16, 22); + --color-tertiary-dark: rgba(8, 8, 10); + */ :root { font-family: Helvetica, Arial, sans-serif; @@ -19,7 +25,7 @@ color-scheme: light dark; color: #f9f9f9; - background-color: #242424; + background-color: var(--color-tertiary); font-synthesis: none; text-rendering: optimizeLegibility; @@ -127,11 +133,10 @@ body { } .bg__color--tertiary { - background-image: linear-gradient(to bottom, var(--color-tertiary) 80%, var(--color-tertiary-dark)); + background-image: linear-gradient(to bottom, var(--color-tertiary) 80%, var(--color-tertiary-ldark)); } .button__secondary { - background-color: var(--color-secondary); color: #f9f9f9; border: 1px solid var(--dropbutton-primary-dark); border-radius: 0.5rem; diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index 72b9e7e..83a4d81 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -3,11 +3,14 @@ import { createRoot } from 'react-dom/client' import './index.css' import App from './App.tsx' import { BrowserRouter } from 'react-router' +import { StarknetProvider } from './components/StarknetProvider' createRoot(document.getElementById('root')!).render( - + + + ) diff --git a/apps/web/src/pages/Collection.tsx b/apps/web/src/pages/Collection.tsx index 4263c98..007e53b 100644 --- a/apps/web/src/pages/Collection.tsx +++ b/apps/web/src/pages/Collection.tsx @@ -6,7 +6,7 @@ import { mockAddress } from "../api/mock"; import { getMyNewInscriptions, getMyTopInscriptions, getMyInscriptionRequests } from "../api/inscriptions"; import { Pagination } from "../components/Pagination"; -function Collection() { +function Collection(props: any) { const filters = ["New", "Top", "Rare", "Requests"]; const [activeFilter, setActiveFilter] = useState(filters[0]); @@ -67,19 +67,19 @@ function Collection() { // TODO: Button to create new request if no requests are open // TODO: Button to view requests if requests are open + // return (
-

My Collection

-
- +

My Collection

+
{filters.map((filter) => ( ))}
-
+
{activeFilter === "Requests" ? myRequests.map((inscription) => ( )) : collection.map((inscription) => ( diff --git a/apps/web/src/pages/Home.tsx b/apps/web/src/pages/Home.tsx index fd0f7f3..19572bb 100644 --- a/apps/web/src/pages/Home.tsx +++ b/apps/web/src/pages/Home.tsx @@ -6,7 +6,7 @@ import InscriptionStatus from "../components/inscription/Status"; import { Pagination } from "../components/Pagination"; import { getNewInscriptions } from "../api/inscriptions"; -function Home() { +function Home(props: any) { const [isInscribing, setIsInscribing] = useState(false); const defaultInscription: any[] = []; @@ -42,17 +42,17 @@ function Home() {

Inscribe on Bitcoin

Starknet's Decentralized Inscriptor Network

- + {isInscribing && }

Recent Inscriptions

-

Explore →

+

Explore →

-
+
{recentInscriptions.map((inscription) => ( ))} diff --git a/apps/web/src/pages/Info.tsx b/apps/web/src/pages/Info.tsx index fe9aa2b..2b03829 100644 --- a/apps/web/src/pages/Info.tsx +++ b/apps/web/src/pages/Info.tsx @@ -1,7 +1,48 @@ -function Info() { +function Info(props: any) { + // TODO: Diagrams return ( -
-

Info

+
+ +
+
+

About

+
+

Order on Starknet, write on Bitcoin, get money trustlessly, repeat

+

Broly is a decentralized Bitcoin inscription service that uses Starknet for orderbook management. It enables a trustless Bitcoin inscription network with guaranteed payments through smart contracts and escrows. This project demonstrates a method for L2s like Starknet to send messages to/from Bitcoin L1 through the use of an inventivized network of relays/inscriptors!

+
+
+

How It Works

+
+

1. User connects both Bitcoin and Starknet wallets

+

2. User creates an inscription order

+

Specifies inscription content and reward amount

+

Order is created on Starknet orderbook

+

Funds are locked in the contract

+

3. Inscribor service

+

Monitors pending orders & locks any orders taken

+

Creates Bitcoin inscriptions

+

Triggers reward release on successful inscription

+

4. User receives inscription, inscribor receives reward

+
+
); } diff --git a/apps/web/src/pages/Inscription.tsx b/apps/web/src/pages/Inscription.tsx index 13191a0..67c89c2 100644 --- a/apps/web/src/pages/Inscription.tsx +++ b/apps/web/src/pages/Inscription.tsx @@ -4,7 +4,7 @@ import InscriptionLargeView from "../components/inscription/LargeView"; import InscriptionProperty from "../components/inscription/Property"; import { getInscription } from "../api/inscriptions"; -function Inscription() { +function Inscription(props: any) { let { id } = useParams<{ id: any }>(); const [inscription, setInscription] = useState(); diff --git a/apps/web/src/pages/Inscriptions.tsx b/apps/web/src/pages/Inscriptions.tsx index 9f79eac..1220f39 100644 --- a/apps/web/src/pages/Inscriptions.tsx +++ b/apps/web/src/pages/Inscriptions.tsx @@ -5,7 +5,7 @@ import InscriptionRequestView from "../components/inscription/RequestView"; import { getHotInscriptions, getNewInscriptions, getInscriptionRequests } from "../api/inscriptions"; import { Pagination } from "../components/Pagination"; -function Inscritpions() { +function Inscritpions(props: any) { const filters = ["Hot", "New", "Rare"]; const [activeFilter, setActiveFilter] = useState(filters[0]); @@ -87,7 +87,7 @@ function Inscritpions() { return (
-

Open Inscription Requests

+

Open Inscription Requests

{requests.map((request) => { return ( @@ -103,9 +103,9 @@ function Inscritpions() {
-

All Inscriptions

-
- +

All Inscriptions

+
+ {filters.map((filter) => (
-
+
{inscriptions.map((inscription) => ( ))} diff --git a/apps/web/src/pages/Request.tsx b/apps/web/src/pages/Request.tsx index 8b43c9a..e5bd063 100644 --- a/apps/web/src/pages/Request.tsx +++ b/apps/web/src/pages/Request.tsx @@ -3,7 +3,7 @@ import { useParams } from "react-router"; import InscriptionLargeView from "../components/inscription/LargeView"; import InscriptionProperty from "../components/inscription/Property"; -function Request() { +function Request(props: any) { // TODO: Implement unique request features: ie cancel, accept, reject, bid, other info, ... let { id } = useParams<{ id: string }>(); diff --git a/docker-compose.yml b/docker-compose.yml index 22afe3b..796a439 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -72,6 +72,8 @@ services: - 5173:5173 links: - backend + environment: + - VITE_BROLY_CONTRACT_ADDRESS=0x05a527197145ea9f40d683d1328e75b7f5bdf61d5ff9886f89ac7023873dcba9 volumes: - ./package.json:/app/package.json - ./pnpm-lock.yaml:/app/pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf77cee..a5ca074 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,12 @@ importers: apps/web: dependencies: + '@starknet-react/chains': + specifier: ^3.1.1 + version: 3.1.1 + '@starknet-react/core': + specifier: ^3.6.3 + version: 3.6.3(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.11.0)(typescript@5.6.3) react: specifier: ^18.3.1 version: 18.3.1 @@ -44,6 +50,12 @@ importers: react-router: specifier: ^7.0.1 version: 7.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + starknet: + specifier: ^6.11.0 + version: 6.11.0 + starknetkit: + specifier: ^2.6.1 + version: 2.6.1(starknet@6.11.0) devDependencies: '@eslint/js': specifier: ^9.13.0 @@ -65,13 +77,13 @@ importers: version: 10.4.20(postcss@8.4.49) eslint: specifier: ^9.13.0 - version: 9.15.0(jiti@1.21.6) + version: 9.15.0(jiti@2.4.2) eslint-plugin-react-hooks: specifier: ^5.0.0 - version: 5.0.0(eslint@9.15.0(jiti@1.21.6)) + version: 5.0.0(eslint@9.15.0(jiti@2.4.2)) eslint-plugin-react-refresh: specifier: ^0.4.14 - version: 0.4.14(eslint@9.15.0(jiti@1.21.6)) + version: 0.4.14(eslint@9.15.0(jiti@2.4.2)) globals: specifier: ^15.11.0 version: 15.12.0 @@ -86,7 +98,7 @@ importers: version: 5.6.3 typescript-eslint: specifier: ^8.11.0 - version: 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + version: 8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) vite: specifier: ^5.4.10 version: 5.4.11(@types/node@22.10.1) @@ -97,6 +109,9 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -368,6 +383,57 @@ packages: resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -419,6 +485,38 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@module-federation/runtime@0.1.21': + resolution: {integrity: sha512-/p4BhZ0SnjJuiL0wwu+FebFgIUJ9vM+oCY7CyprUHImyi/Y23ulI61WNWMVrKQGgdMoXQDQCL8RH4EnrVP2ZFw==} + + '@module-federation/sdk@0.1.21': + resolution: {integrity: sha512-r7xPiAm+O4e+8Zvw+8b4ToeD0D0VJD004nHmt+Y8r/l98J2eA6di72Vn1FeyjtQbCrFtiMw3ts/dlqtcmIBipw==} + + '@noble/curves@1.3.0': + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -431,6 +529,94 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@parcel/watcher-android-arm64@2.5.0': + resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.0': + resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.0': + resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.0': + resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.0': + resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.0': + resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.0': + resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.0': + resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.0': + resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-wasm@2.5.0': + resolution: {integrity: sha512-Z4ouuR8Pfggk1EYYbTaIoxc+Yv4o7cGQnH0Xy8+pQ+HbiW+ZnwhcD2LPf/prfq1nIWpAxjOkQ8uSMFWMtBLiVQ==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-win32-arm64@2.5.0': + resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.0': + resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.0': + resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.0': + resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -525,6 +711,110 @@ packages: cpu: [x64] os: [win32] + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.1': + resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + + '@scure/bip32@1.6.0': + resolution: {integrity: sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==} + + '@scure/bip39@1.5.0': + resolution: {integrity: sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==} + + '@scure/starknet@1.0.0': + resolution: {integrity: sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg==} + + '@stablelib/aead@1.0.1': + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + + '@stablelib/binary@1.0.1': + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + + '@stablelib/bytes@1.0.1': + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + + '@stablelib/chacha20poly1305@1.0.1': + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} + + '@stablelib/chacha@1.0.1': + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + + '@stablelib/constant-time@1.0.1': + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + + '@stablelib/ed25519@1.0.3': + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + + '@stablelib/hash@1.0.1': + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + + '@stablelib/hkdf@1.0.1': + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + + '@stablelib/hmac@1.0.1': + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + + '@stablelib/int@1.0.1': + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + + '@stablelib/keyagreement@1.0.1': + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + + '@stablelib/poly1305@1.0.1': + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + + '@stablelib/random@1.0.2': + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + + '@stablelib/sha256@1.0.1': + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + + '@stablelib/sha512@1.0.1': + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + + '@stablelib/wipe@1.0.1': + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + + '@stablelib/x25519@1.0.3': + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + + '@starknet-io/get-starknet-core@4.0.5': + resolution: {integrity: sha512-aMnDHhWO0IMdwusZcoyPPnvAxzREWv+XkPMAtB2O1h64x1QKvpR/oVoDl/ZY81JKS4YlUWqcuD+sMGGUVZAa7w==} + + '@starknet-io/get-starknet@4.0.5': + resolution: {integrity: sha512-eAj3Zh9PVrn3E2jC9N7E+HxU7VlMxiUckGpL9lrWLa7vnORJkZg/3tDmjfqzgVNGN9d7ElcjIXeJB6/5d5CUCg==} + + '@starknet-io/types-js@0.7.10': + resolution: {integrity: sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==} + + '@starknet-react/chains@3.1.1': + resolution: {integrity: sha512-1EboxfkZlmLNE3qegyq+/rJrj+FswQaI5j60y2l1mV6d/QuObtxwQhPAso1gklCnzr9p3G0NdZYB87P2QJfLhg==} + + '@starknet-react/core@3.6.3': + resolution: {integrity: sha512-838NJVlLKtb7TO9fr/PPBpelgtnsybDoI3NhPAGpBFheB/1ZvFKGWXf8NLJY1soY+ctCVTh1Uai4FH3VHa3R7A==} + peerDependencies: + get-starknet-core: ^4.0.0 + react: ^18.0 + starknet: ^6.11.0 + + '@tanstack/query-core@5.62.8': + resolution: {integrity: sha512-4fV31vDsUyvNGrKIOUNPrZztoyL187bThnoQOvAXEVlZbSiuPONpfx53634MKKdvsDir5NyOGm80ShFaoHS/mw==} + + '@tanstack/react-query@5.62.8': + resolution: {integrity: sha512-8TUstKxF/fysHonZsWg/hnlDVgasTdHx6Q+f1/s/oPKJBJbKUWPZEHwLTMOZgrZuroLMiqYKJ9w69Abm8mWP0Q==} + peerDependencies: + react: ^18 || ^19 + + '@trpc/client@10.45.2': + resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} + peerDependencies: + '@trpc/server': 10.45.2 + + '@trpc/server@10.45.2': + resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -629,6 +919,84 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 + '@walletconnect/core@2.17.3': + resolution: {integrity: sha512-57uv0FW4L6H/tmkb1kS2nG41MDguyDgZbGR58nkDUd1TO/HydyiTByVOhFzIxgN331cnY/1G1rMaKqncgdnOFA==} + engines: {node: '>=18'} + + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} + + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-auth@1.0.4': + resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@walletconnect/sign-client@2.17.3': + resolution: {integrity: sha512-OzOWxRTfVGCHU3OOF6ibPkgPfDpivFJjuknfcOUt9PYWpTAv6YKOmT4cyfBPhc7llruyHpV44fYbykMcLIvEcg==} + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.17.3': + resolution: {integrity: sha512-5eFxnbZGJJx0IQyCS99qz+OvozpLJJYfVG96dEHGgbzZMd+C9V1eitYqVClx26uX6V+WQVqVwjpD2Dyzie++Wg==} + + '@walletconnect/utils@2.17.3': + resolution: {integrity: sha512-tG77UpZNeLYgeOwViwWnifpyBatkPlpKSSayhN0gcjY1lZAUNqtYslpm4AdTxlrA3pL61MnyybXgWYT5eZjarw==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + abi-wan-kanabi@2.2.4: + resolution: {integrity: sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg==} + hasBin: true + + abitype@1.0.7: + resolution: {integrity: sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -667,6 +1035,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -683,6 +1054,13 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -701,10 +1079,19 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bn.js@4.12.1: + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + body-parser@1.18.3: resolution: {integrity: sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==} engines: {node: '>= 0.8'} + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -719,6 +1106,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browserslist@4.24.2: resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -739,6 +1129,10 @@ packages: caniuse-lite@1.0.30001684: resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} + cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -747,6 +1141,17 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -761,6 +1166,13 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} engines: {node: '>= 0.6'} @@ -772,6 +1184,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-parser@1.4.7: resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} engines: {node: '>= 0.8.0'} @@ -799,6 +1214,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.1: + resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -824,16 +1242,34 @@ packages: supports-color: optional: true + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destroy@1.0.4: resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==} + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -844,6 +1280,9 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -853,6 +1292,12 @@ packages: electron-to-chromium@1.5.65: resolution: {integrity: sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==} + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -863,6 +1308,9 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -930,6 +1378,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -950,6 +1403,17 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + express@4.16.4: resolution: {integrity: sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==} engines: {node: '>= 0.10.0'} @@ -967,9 +1431,16 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fetch-cookie@3.0.1: + resolution: {integrity: sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -986,6 +1457,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + finalhandler@1.1.1: resolution: {integrity: sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==} engines: {node: '>= 0.8'} @@ -1020,6 +1495,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1035,6 +1514,20 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + + get-starknet-core@4.0.0: + resolution: {integrity: sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ==} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1067,25 +1560,48 @@ packages: resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + h3@1.13.0: + resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + iconv-lite@0.4.23: resolution: {integrity: sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==} engines: {node: '>=0.10.0'} + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -1112,6 +1628,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1120,6 +1639,11 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1132,6 +1656,11 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1140,9 +1669,32 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -1150,6 +1702,13 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1176,9 +1735,15 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1194,10 +1759,20 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + listhen@1.9.0: + resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} + hasBin: true + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -1205,6 +1780,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lossless-json@4.0.2: + resolution: {integrity: sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1218,6 +1796,9 @@ packages: merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1242,6 +1823,21 @@ packages: resolution: {integrity: sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1253,6 +1849,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + morgan@1.9.1: resolution: {integrity: sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==} engines: {node: '>= 0.8.0'} @@ -1263,6 +1862,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -1278,6 +1880,25 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} @@ -1289,6 +1910,10 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1297,6 +1922,15 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -1308,10 +1942,22 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} + ox@0.1.2: + resolution: {integrity: sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1323,6 +1969,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1343,6 +1992,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -1353,6 +2006,9 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1364,10 +2020,23 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -1418,10 +2087,16 @@ packages: engines: {node: '>=14'} hasBin: true + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1430,9 +2105,22 @@ packages: resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} engines: {node: '>=0.6'} + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -1467,10 +2155,28 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1499,6 +2205,13 @@ packages: safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -1540,14 +2253,43 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + starknet@6.11.0: + resolution: {integrity: sha512-u50KrGDi9fbu1Ogu7ynwF/tSeFlp3mzOg1/Y5x50tYFICImo3OfY4lOz9OtYDk404HK4eUujKkhov9tG7GAKlg==} + + starknetkit@2.6.1: + resolution: {integrity: sha512-1w8F6BShtGr3IE8bTGvaXsiGn+ZUFB2jnC9fqMX89utBUEJtkft4K9r0YJWiPjTho+eap8o4dN0S0G4tisGW7A==} + peerDependencies: + starknet: ^6.9.0 + statuses@1.4.0: resolution: {integrity: sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==} engines: {node: '>= 0.6'} + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1556,6 +2298,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1564,6 +2309,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -1581,6 +2330,13 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-forms@2.3.1: + resolution: {integrity: sha512-ExX9PM0JgvdOWlHl2ztD7XzLNPOPt9U5hBKV8sUAisMfcYWpPRnyz+6EFmh35BOBGJJmuhTDBGm5/7seLjOTIA==} + + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + tailwindcss@3.4.15: resolution: {integrity: sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==} engines: {node: '>=14.0.0'} @@ -1596,10 +2352,26 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trpc-browser@1.4.2: + resolution: {integrity: sha512-A4p5LtEiI81fEBi/RduirnXx6MrbKab+qpu9lzYONVEVHeWkXzmIzGlG2gfowWgBmxtKKjku8F3fZTrPxl93Gw==} + peerDependencies: + '@trpc/client': ^10.0.0 + '@trpc/server': ^10.0.0 + ts-api-utils@1.4.1: resolution: {integrity: sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==} engines: {node: '>=16'} @@ -1609,6 +2381,15 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + turbo-darwin-64@2.3.1: resolution: {integrity: sha512-tjHfjW/Gs8Q9IO+9gPdIsSStZ8I09QYDRT/SyhFTPLnc7O2ZlxHPBVFfjUkHUjanHNYO8CpRGt+zdp1PaMCruw==} cpu: [x64] @@ -1673,22 +2454,99 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unstorage@1.13.1: + resolution: {integrity: sha512-ELexQHUrG05QVIM/iUeQNdl9FXDZhqLJ4yP59fnmn2jGUh0TEulwOgov1ubOb3Gt2ZGK/VMchJwPDNVEGWQpRg==} + peerDependencies: + '@azure/app-configuration': ^1.7.0 + '@azure/cosmos': ^4.1.1 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^4.5.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.25.0 + '@capacitor/preferences': ^6.0.2 + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/kv': ^1.0.1 + idb-keyval: ^6.2.1 + ioredis: ^5.4.1 + 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 + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + + untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -1700,6 +2558,14 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + viem@2.21.55: + resolution: {integrity: sha512-PgXew7C11cAuEtOSgRyQx2kJxEOPUwIwZA9dMglRByqJuFVA7wSGZZOOo/93iylAA8E15bEdqy9xulU3oKZ70Q==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + vite@5.4.11: resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1731,6 +2597,18 @@ packages: terser: optional: true + webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1747,6 +2625,34 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + 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 + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -1755,14 +2661,27 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} + '@adraffy/ens-normalize@1.11.0': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -1954,9 +2873,9 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.0(eslint@9.15.0(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.15.0(jiti@2.4.2))': dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.15.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} @@ -2011,6 +2930,117 @@ snapshots: dependencies: levn: 0.4.1 + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + '@ethersproject/abstract-signer@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/base64@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + + '@ethersproject/bignumber@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/constants@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.7.0': {} + + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/transactions@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -2060,6 +3090,32 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@module-federation/runtime@0.1.21': + dependencies: + '@module-federation/sdk': 0.1.21 + + '@module-federation/sdk@0.1.21': {} + + '@noble/curves@1.3.0': + dependencies: + '@noble/hashes': 1.3.3 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.7.0': + dependencies: + '@noble/hashes': 1.6.0 + + '@noble/hashes@1.3.3': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.6.0': {} + + '@noble/hashes@1.6.1': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2072,6 +3128,71 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@parcel/watcher-android-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-x64@2.5.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.0': + optional: true + + '@parcel/watcher-wasm@2.5.0': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.8 + + '@parcel/watcher-win32-arm64@2.5.0': + optional: true + + '@parcel/watcher-win32-ia32@2.5.0': + optional: true + + '@parcel/watcher-win32-x64@2.5.0': + optional: true + + '@parcel/watcher@2.5.0': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.0 + '@parcel/watcher-darwin-arm64': 2.5.0 + '@parcel/watcher-darwin-x64': 2.5.0 + '@parcel/watcher-freebsd-x64': 2.5.0 + '@parcel/watcher-linux-arm-glibc': 2.5.0 + '@parcel/watcher-linux-arm-musl': 2.5.0 + '@parcel/watcher-linux-arm64-glibc': 2.5.0 + '@parcel/watcher-linux-arm64-musl': 2.5.0 + '@parcel/watcher-linux-x64-glibc': 2.5.0 + '@parcel/watcher-linux-x64-musl': 2.5.0 + '@parcel/watcher-win32-arm64': 2.5.0 + '@parcel/watcher-win32-ia32': 2.5.0 + '@parcel/watcher-win32-x64': 2.5.0 + '@pkgjs/parseargs@0.11.0': optional: true @@ -2129,6 +3250,151 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.27.4': optional: true + '@scure/base@1.1.9': {} + + '@scure/base@1.2.1': {} + + '@scure/bip32@1.6.0': + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + + '@scure/bip39@1.5.0': + dependencies: + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + + '@scure/starknet@1.0.0': + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + + '@stablelib/aead@1.0.1': {} + + '@stablelib/binary@1.0.1': + dependencies: + '@stablelib/int': 1.0.1 + + '@stablelib/bytes@1.0.1': {} + + '@stablelib/chacha20poly1305@1.0.1': + dependencies: + '@stablelib/aead': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/chacha': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/poly1305': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/chacha@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/constant-time@1.0.1': {} + + '@stablelib/ed25519@1.0.3': + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hash@1.0.1': {} + + '@stablelib/hkdf@1.0.1': + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hmac@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/int@1.0.1': {} + + '@stablelib/keyagreement@1.0.1': + dependencies: + '@stablelib/bytes': 1.0.1 + + '@stablelib/poly1305@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/random@1.0.2': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha256@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha512@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/wipe@1.0.1': {} + + '@stablelib/x25519@1.0.3': + dependencies: + '@stablelib/keyagreement': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/wipe': 1.0.1 + + '@starknet-io/get-starknet-core@4.0.5': + dependencies: + '@module-federation/runtime': 0.1.21 + '@starknet-io/types-js': 0.7.10 + async-mutex: 0.5.0 + + '@starknet-io/get-starknet@4.0.5': + dependencies: + '@starknet-io/get-starknet-core': 4.0.5 + bowser: 2.11.0 + + '@starknet-io/types-js@0.7.10': {} + + '@starknet-react/chains@3.1.1': {} + + '@starknet-react/core@3.6.3(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.11.0)(typescript@5.6.3)': + dependencies: + '@starknet-io/types-js': 0.7.10 + '@starknet-react/chains': 3.1.1 + '@tanstack/react-query': 5.62.8(react@18.3.1) + abi-wan-kanabi: 2.2.4 + eventemitter3: 5.0.1 + get-starknet-core: 4.0.0 + react: 18.3.1 + starknet: 6.11.0 + viem: 2.21.55(typescript@5.6.3)(zod@3.24.1) + zod: 3.24.1 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@tanstack/query-core@5.62.8': {} + + '@tanstack/react-query@5.62.8(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.62.8 + react: 18.3.1 + + '@trpc/client@10.45.2(@trpc/server@10.45.2)': + dependencies: + '@trpc/server': 10.45.2 + + '@trpc/server@10.45.2': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.2 @@ -2171,15 +3437,15 @@ snapshots: '@types/prop-types': 15.7.13 csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.16.0 - '@typescript-eslint/type-utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.16.0 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.15.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -2189,14 +3455,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.4 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.15.0(jiti@2.4.2) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -2207,12 +3473,12 @@ snapshots: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/type-utils@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) debug: 4.3.4 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.15.0(jiti@2.4.2) ts-api-utils: 1.4.1(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -2236,13 +3502,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/utils@8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.15.0(jiti@2.4.2) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -2266,6 +3532,238 @@ snapshots: transitivePeerDependencies: - supports-color + '@walletconnect/core@2.17.3': + 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.16 + '@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.3 + '@walletconnect/utils': 2.17.3 + '@walletconnect/window-getters': 1.0.1 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - ioredis + - utf-8-validate + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.13.1(idb-keyval@6.2.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.0.4': + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.17.3': + dependencies: + '@walletconnect/core': 2.17.3 + '@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.3 + '@walletconnect/utils': 2.17.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - ioredis + - utf-8-validate + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.17.3': + 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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + + '@walletconnect/utils@2.17.3': + dependencies: + '@ethersproject/hash': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@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/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@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.3 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + elliptic: 6.6.1 + query-string: 7.1.3 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - ioredis + + '@walletconnect/window-getters@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/window-metadata@1.0.1': + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + abi-wan-kanabi@2.2.4: + dependencies: + ansicolors: 0.3.2 + cardinal: 2.1.1 + fs-extra: 10.1.0 + yargs: 17.7.2 + + abitype@1.0.7(typescript@5.6.3)(zod@3.24.1): + optionalDependencies: + typescript: 5.6.3 + zod: 3.24.1 + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -2300,6 +3798,8 @@ snapshots: ansi-styles@6.2.1: {} + ansicolors@0.3.2: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -2313,6 +3813,12 @@ snapshots: array-flatten@1.1.1: {} + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + atomic-sleep@1.0.0: {} + autoprefixer@10.4.20(postcss@8.4.49): dependencies: browserslist: 4.24.2 @@ -2331,6 +3837,10 @@ snapshots: binary-extensions@2.3.0: {} + bn.js@4.12.1: {} + + bn.js@5.2.1: {} + body-parser@1.18.3: dependencies: bytes: 3.0.0 @@ -2346,6 +3856,8 @@ snapshots: transitivePeerDependencies: - supports-color + bowser@2.11.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -2363,6 +3875,8 @@ snapshots: dependencies: fill-range: 7.1.1 + brorand@1.1.0: {} + browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001684 @@ -2378,6 +3892,11 @@ snapshots: caniuse-lite@1.0.30001684: {} + cardinal@2.1.1: + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -2395,6 +3914,22 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + citty@0.1.6: + dependencies: + consola: 3.2.3 + + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2405,12 +3940,18 @@ snapshots: concat-map@0.0.1: {} + confbox@0.1.8: {} + + consola@3.2.3: {} + content-disposition@0.5.2: {} content-type@1.0.5: {} convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} + cookie-parser@1.4.7: dependencies: cookie: 0.7.2 @@ -2436,6 +3977,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.1: + dependencies: + uncrypto: 0.1.3 + cssesc@3.0.0: {} csstype@3.1.3: {} @@ -2448,12 +3993,22 @@ snapshots: dependencies: ms: 2.1.2 + decode-uri-component@0.2.2: {} + deep-is@0.1.4: {} + defu@6.1.4: {} + depd@1.1.2: {} + destr@2.0.3: {} + destroy@1.0.4: {} + detect-browser@5.3.0: {} + + detect-libc@1.0.3: {} + didyoumean@1.2.2: {} dlv@1.1.3: {} @@ -2462,18 +4017,49 @@ snapshots: dependencies: esutils: 2.0.3 + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} electron-to-chromium@1.5.65: {} + elliptic@6.5.4: + dependencies: + bn.js: 4.12.1 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.1 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} encodeurl@1.0.2: {} + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -2506,13 +4092,13 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@5.0.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-react-hooks@5.0.0(eslint@9.15.0(jiti@2.4.2)): dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.15.0(jiti@2.4.2) - eslint-plugin-react-refresh@0.4.14(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-react-refresh@0.4.14(eslint@9.15.0(jiti@2.4.2)): dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.15.0(jiti@2.4.2) eslint-scope@7.2.2: dependencies: @@ -2571,9 +4157,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.15.0(jiti@1.21.6): + eslint@9.15.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 '@eslint/core': 0.9.0 @@ -2608,7 +4194,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.3 optionalDependencies: - jiti: 1.21.6 + jiti: 2.4.2 transitivePeerDependencies: - supports-color @@ -2624,6 +4210,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.5.0: dependencies: estraverse: 5.3.0 @@ -2638,6 +4226,22 @@ snapshots: etag@1.8.1: {} + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + express@4.16.4: dependencies: accepts: 1.3.8 @@ -2687,10 +4291,17 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 + fetch-cookie@3.0.1: + dependencies: + set-cookie-parser: 2.7.1 + tough-cookie: 4.1.4 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -2707,6 +4318,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@1.1.0: {} + finalhandler@1.1.1: dependencies: debug: 2.6.9 @@ -2748,6 +4361,12 @@ snapshots: fresh@0.5.2: {} + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -2757,6 +4376,16 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + + get-port-please@3.1.2: {} + + get-starknet-core@4.0.0: + dependencies: + '@starknet-io/types-js': 0.7.10 + + get-stream@8.0.1: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2793,14 +4422,40 @@ snapshots: globals@15.12.0: {} + graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + h3@1.13.0: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.1 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.2.1 + ohash: 1.1.4 + radix3: 1.1.2 + ufo: 1.5.4 + uncrypto: 0.1.3 + unenv: 1.10.0 + has-flag@4.0.0: {} + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + http-errors@1.6.3: dependencies: depd: 1.1.2 @@ -2808,10 +4463,16 @@ snapshots: setprototypeof: 1.1.0 statuses: 1.4.0 + http-shutdown@1.2.2: {} + + human-signals@5.0.0: {} + iconv-lite@0.4.23: dependencies: safer-buffer: 2.1.2 + idb-keyval@6.2.1: {} + ignore@5.3.1: {} import-fresh@3.3.0: @@ -2832,6 +4493,8 @@ snapshots: ipaddr.js@1.9.1: {} + iron-webcrypto@1.2.1: {} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -2840,6 +4503,8 @@ snapshots: dependencies: hasown: 2.0.2 + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2848,12 +4513,39 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-number@7.0.0: {} is-path-inside@3.0.3: {} + is-promise@4.0.0: {} + + is-stream@3.0.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + isexe@2.0.0: {} + isomorphic-fetch@3.0.0: + dependencies: + node-fetch: 2.7.0 + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + + isows@1.0.6(ws@8.18.0): + dependencies: + ws: 8.18.0 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -2862,6 +4554,10 @@ snapshots: jiti@1.21.6: {} + jiti@2.4.2: {} + + js-sha3@0.8.0: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -2878,10 +4574,18 @@ snapshots: json5@2.2.3: {} + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 + keyvaluestorage-interface@1.0.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -2893,16 +4597,43 @@ snapshots: lines-and-columns@1.2.4: {} + listhen@1.9.0: + dependencies: + '@parcel/watcher': 2.5.0 + '@parcel/watcher-wasm': 2.5.0 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.2.3 + crossws: 0.3.1 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.13.0 + http-shutdown: 1.2.2 + jiti: 2.4.2 + mlly: 1.7.3 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.8.0 + ufo: 1.5.4 + untun: 0.1.3 + uqr: 0.1.2 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + + lodash.isequal@4.5.0: {} + lodash.merge@4.6.2: {} loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + lossless-json@4.0.2: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -2913,6 +4644,8 @@ snapshots: merge-descriptors@1.0.1: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} methods@1.1.2: {} @@ -2930,6 +4663,14 @@ snapshots: mime@1.4.1: {} + mime@3.0.0: {} + + mimic-fn@4.0.0: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2940,6 +4681,13 @@ snapshots: minipass@7.1.2: {} + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + morgan@1.9.1: dependencies: basic-auth: 2.0.1 @@ -2954,6 +4702,8 @@ snapshots: ms@2.1.2: {} + multiformats@9.9.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -2966,16 +4716,40 @@ snapshots: negotiator@0.6.3: {} + node-addon-api@7.1.1: {} + + node-fetch-native@1.6.4: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + node-releases@2.0.18: {} normalize-path@3.0.0: {} normalize-range@0.1.2: {} + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + object-assign@4.1.1: {} object-hash@3.0.0: {} + ofetch@1.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + + ohash@1.1.4: {} + + on-exit-leak-free@0.2.0: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -2986,6 +4760,10 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -2995,6 +4773,20 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + ox@0.1.2(typescript@5.6.3)(zod@3.24.1): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.6.3)(zod@3.24.1) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - zod + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -3005,6 +4797,8 @@ snapshots: package-json-from-dist@1.0.1: {} + pako@2.1.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -3017,6 +4811,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -3026,14 +4822,43 @@ snapshots: path-to-regexp@0.1.7: {} + pathe@1.1.2: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} pify@2.3.0: {} + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + + pino-std-serializers@4.0.0: {} + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + pirates@4.0.6: {} + pkg-types@1.2.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + postcss-import@15.1.0(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -3075,17 +4900,36 @@ snapshots: prettier@3.2.5: {} + process-warning@1.0.0: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + psl@1.15.0: + dependencies: + punycode: 2.3.1 + punycode@2.3.1: {} qs@6.5.2: {} + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + + radix3@1.1.2: {} + range-parser@1.2.1: {} raw-body@2.3.3: @@ -3121,10 +4965,26 @@ snapshots: dependencies: pify: 2.3.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 + real-require@0.1.0: {} + + redeyed@2.1.1: + dependencies: + esprima: 4.0.1 + + require-directory@2.1.1: {} + + requires-port@1.0.0: {} + resolve-from@4.0.0: {} resolve@1.22.8: @@ -3169,6 +5029,10 @@ snapshots: safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} scheduler@0.23.2: @@ -3218,10 +5082,75 @@ snapshots: signal-exit@4.1.0: {} + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} + split-on-first@1.1.0: {} + + split2@4.2.0: {} + + starknet@6.11.0: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.6.1 + '@scure/base': 1.1.9 + '@scure/starknet': 1.0.0 + abi-wan-kanabi: 2.2.4 + fetch-cookie: 3.0.1 + get-starknet-core: 4.0.0 + isomorphic-fetch: 3.0.0 + lossless-json: 4.0.2 + pako: 2.1.0 + starknet-types-07: '@starknet-io/types-js@0.7.10' + ts-mixer: 6.0.4 + url-join: 4.0.1 + transitivePeerDependencies: + - encoding + + starknetkit@2.6.1(starknet@6.11.0): + dependencies: + '@starknet-io/get-starknet': 4.0.5 + '@starknet-io/get-starknet-core': 4.0.5 + '@starknet-io/types-js': 0.7.10 + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/server': 10.45.2 + '@walletconnect/sign-client': 2.17.3 + bowser: 2.11.0 + detect-browser: 5.3.0 + eventemitter3: 5.0.1 + events: 3.3.0 + lodash-es: 4.17.21 + starknet: 6.11.0 + svelte-forms: 2.3.1 + trpc-browser: 1.4.2(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - ioredis + - utf-8-validate + statuses@1.4.0: {} + std-env@3.8.0: {} + + stream-shift@1.0.3: {} + + strict-uri-encode@2.0.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3234,6 +5163,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3242,6 +5175,8 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-final-newline@3.0.0: {} + strip-json-comments@3.1.1: {} sucrase@3.35.0: @@ -3260,6 +5195,12 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte-forms@2.3.1: + dependencies: + is-promise: 4.0.0 + + system-architecture@0.1.0: {} + tailwindcss@3.4.15: dependencies: '@alloc/quick-lru': 5.2.0 @@ -3297,16 +5238,40 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@0.0.3: {} + + trpc-browser@1.4.2(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2): + dependencies: + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/server': 10.45.2 + ts-api-utils@1.4.1(typescript@5.6.3): dependencies: typescript: 5.6.3 ts-interface-checker@0.1.13: {} + ts-mixer@6.0.4: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + turbo-darwin-64@2.3.1: optional: true @@ -3347,12 +5312,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript-eslint@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3): + typescript-eslint@8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/parser': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.15.0(jiti@1.21.6) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/parser': 8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@2.4.2))(typescript@5.6.3) + eslint: 9.15.0(jiti@2.4.2) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -3360,26 +5325,94 @@ snapshots: typescript@5.6.3: {} + ufo@1.5.4: {} + + uint8arrays@3.1.0: + dependencies: + multiformats: 9.9.0 + + uncrypto@0.1.3: {} + undici-types@6.20.0: {} + unenv@1.10.0: + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + + universalify@0.2.0: {} + + universalify@2.0.1: {} + unpipe@1.0.0: {} + unstorage@1.13.1(idb-keyval@6.2.1): + dependencies: + anymatch: 3.1.3 + chokidar: 3.6.0 + citty: 0.1.6 + destr: 2.0.3 + h3: 1.13.0 + listhen: 1.9.0 + lru-cache: 10.4.3 + node-fetch-native: 1.6.4 + ofetch: 1.4.1 + ufo: 1.5.4 + optionalDependencies: + idb-keyval: 6.2.1 + + untun@0.1.3: + dependencies: + citty: 0.1.6 + consola: 3.2.3 + pathe: 1.1.2 + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 escalade: 3.2.0 picocolors: 1.1.1 + uqr@0.1.2: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 + url-join@4.0.1: {} + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} vary@1.1.2: {} + viem@2.21.55(typescript@5.6.3)(zod@3.24.1): + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.6.3)(zod@3.24.1) + isows: 1.0.6(ws@8.18.0) + ox: 0.1.2(typescript@5.6.3)(zod@3.24.1) + webauthn-p256: 0.0.10 + ws: 8.18.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + vite@5.4.11(@types/node@22.10.1): dependencies: esbuild: 0.21.5 @@ -3389,6 +5422,20 @@ snapshots: '@types/node': 22.10.1 fsevents: 2.3.3 + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + + webidl-conversions@3.0.1: {} + + whatwg-fetch@3.6.20: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -3407,8 +5454,28 @@ snapshots: wrappy@1.0.2: {} + ws@7.5.10: {} + + ws@8.18.0: {} + + y18n@5.0.8: {} + yallist@3.1.1: {} yaml@2.6.1: {} - yocto-queue@0.1.0: {} \ No newline at end of file + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zod@3.24.1: {}