From ca8464ca8f1c9c77893183464599cf894fb9af2c Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 10 Sep 2024 15:05:57 +0200 Subject: [PATCH 01/33] contracts: update starknet-foundry to 0.30.0 --- contracts/.tool-versions | 2 +- contracts/Scarb.lock | 6 +++--- contracts/Scarb.toml | 2 +- contracts/ark_oz/Scarb.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/.tool-versions b/contracts/.tool-versions index e0955bfc3..27f5ea63a 100644 --- a/contracts/.tool-versions +++ b/contracts/.tool-versions @@ -1,2 +1,2 @@ scarb 2.7.1 -starknet-foundry 0.28.0 \ No newline at end of file +starknet-foundry 0.30.0 \ No newline at end of file diff --git a/contracts/Scarb.lock b/contracts/Scarb.lock index 0c022abc2..afc5d0b48 100644 --- a/contracts/Scarb.lock +++ b/contracts/Scarb.lock @@ -141,12 +141,12 @@ source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.1#2f [[package]] name = "snforge_scarb_plugin" version = "0.1.0" -source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.28.0#4dfe39d96690ed6b3d56971512700de3f58288ea" +source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.30.0#196f06b251926697c3d66800f2a93ae595e76496" [[package]] name = "snforge_std" -version = "0.28.0" -source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.28.0#4dfe39d96690ed6b3d56971512700de3f58288ea" +version = "0.30.0" +source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.30.0#196f06b251926697c3d66800f2a93ae595e76496" dependencies = [ "snforge_scarb_plugin", ] diff --git a/contracts/Scarb.toml b/contracts/Scarb.toml index f9b906048..1808a18b8 100644 --- a/contracts/Scarb.toml +++ b/contracts/Scarb.toml @@ -12,7 +12,7 @@ members = [ [workspace.dependencies] starknet = "2.7.1" openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.15.1" } -snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.28.0" } +snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.30.0" } assert_macros = "0.1.0" [workspace.scripts] diff --git a/contracts/ark_oz/Scarb.toml b/contracts/ark_oz/Scarb.toml index a3c365ee4..9b73c8aef 100644 --- a/contracts/ark_oz/Scarb.toml +++ b/contracts/ark_oz/Scarb.toml @@ -9,7 +9,7 @@ starknet = "2.7.1" openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.15.1" } [dev-dependencies] -snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.28.0" } +snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.30.0" } assert_macros = "0.1.0" [tool.fmt] From 3923f5fd23246485999d9b0fdfa59c78c4304564 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 10 Sep 2024 18:25:03 +0200 Subject: [PATCH 02/33] contracts: add event testing in create_order --- .../src/orderbook/orderbook.cairo | 22 ++--- .../tests/integration/create_order.cairo | 80 ++++++++++++++++++- 2 files changed, 88 insertions(+), 14 deletions(-) diff --git a/contracts/ark_component/src/orderbook/orderbook.cairo b/contracts/ark_component/src/orderbook/orderbook.cairo index c26a133a6..2b23d2604 100644 --- a/contracts/ark_component/src/orderbook/orderbook.cairo +++ b/contracts/ark_component/src/orderbook/orderbook.cairo @@ -42,7 +42,7 @@ pub mod OrderbookComponent { /// Events emitted by the Orderbook contract. #[event] #[derive(Drop, starknet::Event)] - enum Event { + pub enum Event { OrderPlaced: OrderPlaced, OrderExecuted: OrderExecuted, OrderCancelled: OrderCancelled, @@ -51,10 +51,10 @@ pub mod OrderbookComponent { } // must be increased when `OrderPlaced` content change - const ORDER_PLACED_EVENT_VERSION: u8 = 1; + pub const ORDER_PLACED_EVENT_VERSION: u8 = 1; /// Event for when an order is placed. #[derive(Drop, starknet::Event)] - struct OrderPlaced { + pub struct OrderPlaced { #[key] order_hash: felt252, #[key] @@ -70,10 +70,10 @@ pub mod OrderbookComponent { } // must be increased when `OrderExecuted` content change - const ORDER_EXECUTED_EVENT_VERSION: u8 = 2; + pub const ORDER_EXECUTED_EVENT_VERSION: u8 = 2; /// Event for when an order is executed. #[derive(Drop, starknet::Event)] - struct OrderExecuted { + pub struct OrderExecuted { #[key] order_hash: felt252, #[key] @@ -88,10 +88,10 @@ pub mod OrderbookComponent { } // must be increased when `OrderPlaced` content change - const ORDER_CANCELLED_EVENT_VERSION: u8 = 1; + pub const ORDER_CANCELLED_EVENT_VERSION: u8 = 1; /// Event for when an order is cancelled. #[derive(Drop, starknet::Event)] - struct OrderCancelled { + pub struct OrderCancelled { #[key] order_hash: felt252, #[key] @@ -102,10 +102,10 @@ pub mod OrderbookComponent { } // must be increased when `RollbackStatus` content change - const ROLLBACK_STATUS_EVENT_VERSION: u8 = 1; + pub const ROLLBACK_STATUS_EVENT_VERSION: u8 = 1; /// Event for when an order has been rollbacked to placed. #[derive(Drop, starknet::Event)] - struct RollbackStatus { + pub struct RollbackStatus { #[key] order_hash: felt252, #[key] @@ -117,10 +117,10 @@ pub mod OrderbookComponent { } // must be increased when `OrderFulfilled` content change - const ORDER_FULFILLED_EVENT_VERSION: u8 = 1; + pub const ORDER_FULFILLED_EVENT_VERSION: u8 = 1; /// Event for when an order is fulfilled. #[derive(Drop, starknet::Event)] - struct OrderFulfilled { + pub struct OrderFulfilled { #[key] order_hash: felt252, #[key] diff --git a/contracts/ark_starknet/tests/integration/create_order.cairo b/contracts/ark_starknet/tests/integration/create_order.cairo index 7c7626cfa..9ef5336fa 100644 --- a/contracts/ark_starknet/tests/integration/create_order.cairo +++ b/contracts/ark_starknet/tests/integration/create_order.cairo @@ -1,7 +1,10 @@ -use ark_common::protocol::order_types::RouteType; - +use ark_common::protocol::order_types::{OrderStatus, OrderTrait, OrderType, RouteType}; use ark_common::protocol::order_v1::OrderV1; +use ark_component::orderbook::OrderbookComponent; +use ark_component::orderbook::interface::{IOrderbookDispatcher, IOrderbookDispatcherTrait,}; + +use ark_starknet::executor::executor; use ark_starknet::interfaces::{ IExecutorDispatcher, IExecutorDispatcherTrait, IMaintenanceDispatcher, @@ -13,7 +16,7 @@ use ark_tokens::erc20::IFreeMintDispatcherTrait as Erc20DispatcherTrait; use ark_tokens::erc721::IFreeMintDispatcher as Erc721Dispatcher; use ark_tokens::erc721::IFreeMintDispatcherTrait as Erc721DispatcherTrait; -use snforge_std::{cheat_caller_address, CheatSpan}; +use snforge_std::{cheat_caller_address, CheatSpan, spy_events, EventSpyAssertionsTrait,}; use starknet::{ContractAddress, contract_address_const}; use super::super::common::setup::{setup, setup_order}; @@ -28,11 +31,47 @@ fn test_create_order_erc20_to_erc721_ok() { Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); let mut order = setup_order(erc20_address, nft_address); + order.offerer = offerer; order.start_amount = start_amount; + let order_hash = order.compute_order_hash(); + let order_version = order.get_version(); + let mut spy = spy_events(); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderPlaced( + OrderbookComponent::OrderPlaced { + order_hash, + order_version, + order_type: OrderType::Offer, + version: OrderbookComponent::ORDER_PLACED_EVENT_VERSION, + cancelled_order_hash: Option::None, + order, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::Offer, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::Open, + "Wrong order status" + ); } #[test] @@ -49,9 +88,44 @@ fn test_create_order_erc721_to_erc20_ok() { order.route = RouteType::Erc721ToErc20.into(); order.offerer = offerer; order.token_id = Option::Some(token_id); + let order_hash = order.compute_order_hash(); + let order_version = order.get_version(); + let mut spy = spy_events(); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderPlaced( + OrderbookComponent::OrderPlaced { + order_hash, + order_version, + order_type: OrderType::Listing, + version: OrderbookComponent::ORDER_PLACED_EVENT_VERSION, + cancelled_order_hash: Option::None, + order, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::Listing, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::Open, + "Wrong order status" + ); } From fa46d5a619c0d08dce94c00ff00c48d1eb821729 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 10 Sep 2024 18:38:07 +0200 Subject: [PATCH 03/33] contracts: don't emit anymore `OrderExecuted` directly from starknet contract --- contracts/ark_starknet/src/executor.cairo | 7 ------- 1 file changed, 7 deletions(-) diff --git a/contracts/ark_starknet/src/executor.cairo b/contracts/ark_starknet/src/executor.cairo index 9c06fec98..0dbb41f61 100644 --- a/contracts/ark_starknet/src/executor.cairo +++ b/contracts/ark_starknet/src/executor.cairo @@ -681,13 +681,6 @@ mod executor { let transaction_hash = tx_info.transaction_hash; let block_timestamp = starknet::info::get_block_timestamp(); - self - .emit( - OrderExecuted { - order_hash: execution_info.order_hash, transaction_hash, block_timestamp, - } - ); - let vinfo = ExecutionValidationInfo { order_hash: execution_info.order_hash, transaction_hash, From 0ec898c4e48e322766190dd4afd249d5cf14b904 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Wed, 11 Sep 2024 11:26:35 +0200 Subject: [PATCH 04/33] conntracts: remove OrderExecuted event in executor and use #[flat] for OrderBookComponent events --- contracts/ark_starknet/src/executor.cairo | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/contracts/ark_starknet/src/executor.cairo b/contracts/ark_starknet/src/executor.cairo index 0dbb41f61..a40072e97 100644 --- a/contracts/ark_starknet/src/executor.cairo +++ b/contracts/ark_starknet/src/executor.cairo @@ -116,22 +116,12 @@ mod executor { #[event] #[derive(Drop, starknet::Event)] enum Event { - OrderExecuted: OrderExecuted, CollectionFallbackFees: CollectionFallbackFees, ExecutorInMaintenance: ExecutorInMaintenance, - // #[flat] // OrderExecuted conflict + #[flat] OrderbookEvent: OrderbookComponent::Event, } - #[derive(Drop, starknet::Event)] - struct OrderExecuted { - #[key] - order_hash: felt252, - #[key] - transaction_hash: felt252, - block_timestamp: u64 - } - #[derive(Drop, starknet::Event)] struct CollectionFallbackFees { #[key] From 86bbf23e1f4c9cb4c91fc47f73e7e7f6140d9cf3 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Wed, 11 Sep 2024 15:23:31 +0200 Subject: [PATCH 05/33] contracts: add test cases for create auction & collection offer orders --- .../ark_starknet/tests/common/setup.cairo | 107 +++++++++++- .../tests/integration/create_order.cairo | 164 ++++++++++++++---- .../tests/integration/fulfill_order.cairo | 40 ++--- 3 files changed, 247 insertions(+), 64 deletions(-) diff --git a/contracts/ark_starknet/tests/common/setup.cairo b/contracts/ark_starknet/tests/common/setup.cairo index 93772a860..2227a786b 100644 --- a/contracts/ark_starknet/tests/common/setup.cairo +++ b/contracts/ark_starknet/tests/common/setup.cairo @@ -68,7 +68,112 @@ fn setup_royalty() -> (ContractAddress, ContractAddress, ContractAddress) { (executor_address, erc20_address, nft_address) } -fn setup_order(erc20_address: ContractAddress, nft_address: ContractAddress) -> OrderV1 { +fn setup_order( + currency_address: ContractAddress, + nft_address: ContractAddress, + route: RouteType, + offerer: ContractAddress, + token_id: Option, + start_amount: u256, + end_amount: u256, +) -> OrderV1 { + let chain_id = 'SN_MAIN'; + let block_timestamp = starknet::get_block_timestamp(); + let end_date = block_timestamp + (30 * 24 * 60 * 60); + let data = array![]; + + OrderV1 { + route, + currency_address, + currency_chain_id: chain_id, + salt: 1, + offerer, + token_chain_id: chain_id, + token_address: nft_address, + token_id, + quantity: 1, + start_amount, + end_amount, + start_date: block_timestamp, + end_date: end_date, + broker_id: contract_address_const::<'broker_id'>(), + additional_data: data.span() + } +} + +fn setup_offer_order( + currency_address: ContractAddress, + nft_address: ContractAddress, + offerer: ContractAddress, + token_id: u256, + start_amount: u256, +) -> OrderV1 { + setup_order( + currency_address, + nft_address, + RouteType::Erc20ToErc721, + offerer, + Option::Some(token_id), + start_amount, + 0 + ) +} + +fn setup_listing_order( + currency_address: ContractAddress, + nft_address: ContractAddress, + offerer: ContractAddress, + token_id: u256, + start_amount: u256, +) -> OrderV1 { + setup_order( + currency_address, + nft_address, + RouteType::Erc721ToErc20, + offerer, + Option::Some(token_id), + start_amount, + 0 + ) +} + +fn setup_auction_order( + currency_address: ContractAddress, + nft_address: ContractAddress, + offerer: ContractAddress, + token_id: u256, + start_amount: u256, + end_amount: u256, +) -> OrderV1 { + setup_order( + currency_address, + nft_address, + RouteType::Erc721ToErc20, + offerer, + Option::Some(token_id), + start_amount, + end_amount + ) +} + +fn setup_collection_offer_order( + currency_address: ContractAddress, + nft_address: ContractAddress, + offerer: ContractAddress, + start_amount: u256, +) -> OrderV1 { + setup_order( + currency_address, + nft_address, + RouteType::Erc20ToErc721, + offerer, + Option::None, + start_amount, + 0 + ) +} + +fn setup_default_order(erc20_address: ContractAddress, nft_address: ContractAddress) -> OrderV1 { let chain_id = 'SN_MAIN'; let block_timestamp = starknet::get_block_timestamp(); let end_date = block_timestamp + (30 * 24 * 60 * 60); diff --git a/contracts/ark_starknet/tests/integration/create_order.cairo b/contracts/ark_starknet/tests/integration/create_order.cairo index 9ef5336fa..75c408ae0 100644 --- a/contracts/ark_starknet/tests/integration/create_order.cairo +++ b/contracts/ark_starknet/tests/integration/create_order.cairo @@ -19,21 +19,20 @@ use ark_tokens::erc721::IFreeMintDispatcherTrait as Erc721DispatcherTrait; use snforge_std::{cheat_caller_address, CheatSpan, spy_events, EventSpyAssertionsTrait,}; use starknet::{ContractAddress, contract_address_const}; -use super::super::common::setup::{setup, setup_order}; +use super::super::common::setup::{ + setup, setup_auction_order, setup_collection_offer_order, setup_listing_order, setup_offer_order +}; #[test] -fn test_create_order_erc20_to_erc721_ok() { +fn test_create_offer_order_ok() { let (executor_address, erc20_address, nft_address) = setup(); let offerer = contract_address_const::<'offerer'>(); let start_amount = 10_000_000; - + let token_id = 10_u256; Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); - let mut order = setup_order(erc20_address, nft_address); - - order.offerer = offerer; - order.start_amount = start_amount; + let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); let order_hash = order.compute_order_hash(); let order_version = order.get_version(); @@ -75,19 +74,16 @@ fn test_create_order_erc20_to_erc721_ok() { } #[test] -fn test_create_order_erc721_to_erc20_ok() { +fn test_create_listing_order_ok() { let (executor_address, erc20_address, nft_address) = setup(); let offerer = contract_address_const::<'offerer'>(); - + let start_amount = 10_000_000; let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } .get_current_token_id() .into(); Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); - let mut order = setup_order(erc20_address, nft_address); - order.route = RouteType::Erc721ToErc20.into(); - order.offerer = offerer; - order.token_id = Option::Some(token_id); + let order = setup_listing_order(erc20_address, nft_address, offerer, token_id, start_amount); let order_hash = order.compute_order_hash(); let order_version = order.get_version(); @@ -128,16 +124,121 @@ fn test_create_order_erc721_to_erc20_ok() { ); } +#[test] +fn test_create_auction_order_ok() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let end_amount = start_amount * 2; + let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } + .get_current_token_id() + .into(); + Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); + + let order = setup_auction_order( + erc20_address, nft_address, offerer, token_id, start_amount, end_amount + ); + let order_hash = order.compute_order_hash(); + let order_version = order.get_version(); + + let mut spy = spy_events(); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderPlaced( + OrderbookComponent::OrderPlaced { + order_hash, + order_version, + order_type: OrderType::Auction, + version: OrderbookComponent::ORDER_PLACED_EVENT_VERSION, + cancelled_order_hash: Option::None, + order, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::Auction, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::Open, + "Wrong order status" + ); +} + +#[test] +fn test_create_collection_offer_order_ok() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let token_id = 10_u256; + Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); + + let order = setup_collection_offer_order(erc20_address, nft_address, offerer, start_amount); + let order_hash = order.compute_order_hash(); + let order_version = order.get_version(); + + let mut spy = spy_events(); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderPlaced( + OrderbookComponent::OrderPlaced { + order_hash, + order_version, + order_type: OrderType::CollectionOffer, + version: OrderbookComponent::ORDER_PLACED_EVENT_VERSION, + cancelled_order_hash: Option::None, + order, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::CollectionOffer, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::Open, + "Wrong order status" + ); +} #[test] #[should_panic(expected: "Caller is not the offerer")] -fn test_create_order_offerer_shall_be_caller() { +fn test_create_offer_order_offerer_shall_be_caller() { let (executor_address, erc20_address, nft_address) = setup(); let offerer = contract_address_const::<'offerer'>(); let caller = contract_address_const::<'caller'>(); + let start_amount = 10_000_000; + let token_id = 10_u256; + + Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); - let mut order = setup_order(erc20_address, nft_address); - order.offerer = offerer; + let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); cheat_caller_address(executor_address, caller, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); @@ -145,17 +246,16 @@ fn test_create_order_offerer_shall_be_caller() { #[test] #[should_panic(expected: "Offerer does not own enough ERC20 tokens")] -fn test_create_order_offerer_not_enough_erc20_tokens() { +fn test_create_offer_order_offerer_not_enough_erc20_tokens() { let (executor_address, erc20_address, nft_address) = setup(); let offerer = contract_address_const::<'offerer'>(); let start_amount = 10_000_000; let minted = 10_000; + let token_id = 10_u256; Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, minted); - let mut order = setup_order(erc20_address, nft_address); - order.offerer = offerer; - order.start_amount = start_amount; + let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); @@ -163,20 +263,18 @@ fn test_create_order_offerer_not_enough_erc20_tokens() { #[test] #[should_panic(expected: "Offerer does not own the specified ERC721 token")] -fn test_create_order_offerer_not_own_ec721_token() { +fn test_create_listing_order_offerer_not_own_ec721_token() { let (executor_address, erc20_address, nft_address) = setup(); let offerer = contract_address_const::<'offerer'>(); let other = contract_address_const::<'other'>(); + let start_amount = 10_000_000; let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } .get_current_token_id() .into(); Erc721Dispatcher { contract_address: nft_address }.mint(other, 'base_uri'); - let mut order = setup_order(erc20_address, nft_address); - order.route = RouteType::Erc721ToErc20.into(); - order.offerer = offerer; - order.token_id = Option::Some(token_id); + let order = setup_listing_order(erc20_address, nft_address, offerer, token_id, start_amount); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); @@ -184,17 +282,16 @@ fn test_create_order_offerer_not_own_ec721_token() { #[test] #[should_panic(expected: 'Executor not enabled')] -fn test_create_order_erc20_to_erc721_disabled() { +fn test_create_offer_order_disabled() { let (executor_address, erc20_address, nft_address) = setup(); let admin = contract_address_const::<'admin'>(); let offerer = contract_address_const::<'offerer'>(); let start_amount = 10_000_000; + let token_id = 10_u256; Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); - let mut order = setup_order(erc20_address, nft_address); - order.offerer = offerer; - order.start_amount = start_amount; + let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); cheat_caller_address(executor_address, admin, CheatSpan::TargetCalls(1)); IMaintenanceDispatcher { contract_address: executor_address }.set_maintenance_mode(true); @@ -205,20 +302,17 @@ fn test_create_order_erc20_to_erc721_disabled() { #[test] #[should_panic(expected: 'Executor not enabled')] -fn test_create_order_erc721_to_erc20_disabled() { +fn test_create_listing_order_disabled() { let (executor_address, erc20_address, nft_address) = setup(); let admin = contract_address_const::<'admin'>(); let offerer = contract_address_const::<'offerer'>(); - + let start_amount = 10_000_000; let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } .get_current_token_id() .into(); Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); - let mut order = setup_order(erc20_address, nft_address); - order.route = RouteType::Erc721ToErc20.into(); - order.offerer = offerer; - order.token_id = Option::Some(token_id); + let order = setup_listing_order(erc20_address, nft_address, offerer, token_id, start_amount); cheat_caller_address(executor_address, admin, CheatSpan::TargetCalls(1)); IMaintenanceDispatcher { contract_address: executor_address }.set_maintenance_mode(true); diff --git a/contracts/ark_starknet/tests/integration/fulfill_order.cairo b/contracts/ark_starknet/tests/integration/fulfill_order.cairo index 72ec091d8..43b29a5c9 100644 --- a/contracts/ark_starknet/tests/integration/fulfill_order.cairo +++ b/contracts/ark_starknet/tests/integration/fulfill_order.cairo @@ -17,7 +17,10 @@ use openzeppelin::token::erc721::interface::{IERC721Dispatcher, IERC721Dispatche use snforge_std::{cheat_caller_address, CheatSpan}; use starknet::{ContractAddress, contract_address_const}; -use super::super::common::setup::{setup, setup_order}; +use super::super::common::setup::{ + setup, setup_default_order, setup_auction_order, setup_collection_offer_order, + setup_listing_order, setup_offer_order +}; fn create_offer_order( executor_address: ContractAddress, @@ -30,10 +33,7 @@ fn create_offer_order( IFreeMintDispatcher { contract_address: erc20_address }.mint(offerer, start_amount); - let mut order = setup_order(erc20_address, nft_address); - order.offerer = offerer; - order.start_amount = start_amount; - order.token_id = Option::Some(token_id); + let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); @@ -49,10 +49,7 @@ fn create_collection_offer_order( IFreeMintDispatcher { contract_address: erc20_address }.mint(offerer, start_amount); - let mut order = setup_order(erc20_address, nft_address); - order.offerer = offerer; - order.start_amount = start_amount; - order.token_id = Option::None; + let order = setup_collection_offer_order(erc20_address, nft_address, offerer, start_amount); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); @@ -73,11 +70,7 @@ fn create_listing_order( .into(); Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); - let mut order = setup_order(erc20_address, nft_address); - order.route = RouteType::Erc721ToErc20.into(); - order.offerer = offerer; - order.token_id = Option::Some(token_id); - order.start_amount = start_amount; + let order = setup_listing_order(erc20_address, nft_address, offerer, token_id, start_amount); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); @@ -99,12 +92,9 @@ fn create_auction_order( .into(); Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); - let mut order = setup_order(erc20_address, nft_address); - order.route = RouteType::Erc721ToErc20.into(); - order.offerer = offerer; - order.token_id = Option::Some(token_id); - order.start_amount = start_amount; - order.end_amount = end_amount; + let order = setup_auction_order( + erc20_address, nft_address, offerer, token_id, start_amount, end_amount + ); cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); @@ -410,10 +400,7 @@ fn test_fulfill_auction_order_ok() { IFreeMintDispatcher { contract_address: erc20_address }.mint(buyer, start_amount); - let mut buyer_order = setup_order(erc20_address, nft_address); - buyer_order.offerer = buyer; - buyer_order.start_amount = start_amount; - buyer_order.token_id = Option::Some(token_id); + let buyer_order = setup_offer_order(erc20_address, nft_address, buyer, token_id, start_amount); cheat_caller_address(executor_address, buyer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(buyer_order); @@ -446,10 +433,7 @@ fn test_fulfill_auction_order_fulfiller_same_as_offerer() { IFreeMintDispatcher { contract_address: erc20_address }.mint(buyer, start_amount); - let mut buyer_order = setup_order(erc20_address, nft_address); - buyer_order.offerer = buyer; - buyer_order.start_amount = start_amount; - buyer_order.token_id = Option::Some(token_id); + let buyer_order = setup_offer_order(erc20_address, nft_address, buyer, token_id, start_amount); cheat_caller_address(executor_address, buyer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(buyer_order); From fc8798d7724bd36a164338125cec1b1576c6464f Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Wed, 11 Sep 2024 15:42:41 +0200 Subject: [PATCH 06/33] contracts: move create_* to setup.cairo --- .../ark_starknet/tests/common/setup.cairo | 94 ++++++++++++++++++- .../tests/integration/fulfill_order.cairo | 80 +--------------- 2 files changed, 92 insertions(+), 82 deletions(-) diff --git a/contracts/ark_starknet/tests/common/setup.cairo b/contracts/ark_starknet/tests/common/setup.cairo index 2227a786b..bab0b3281 100644 --- a/contracts/ark_starknet/tests/common/setup.cairo +++ b/contracts/ark_starknet/tests/common/setup.cairo @@ -1,8 +1,16 @@ -use ark_common::protocol::order_types::RouteType; - +use ark_common::protocol::order_types::{OrderTrait, RouteType}; use ark_common::protocol::order_v1::OrderV1; + +use ark_starknet::interfaces::{IExecutorDispatcher, IExecutorDispatcherTrait,}; + +use ark_tokens::erc20::{IFreeMintDispatcher, IFreeMintDispatcherTrait}; +use ark_tokens::erc721::IFreeMintDispatcher as Erc721Dispatcher; +use ark_tokens::erc721::IFreeMintDispatcherTrait as Erc721DispatcherTrait; + use serde::Serde; -use snforge_std::{ContractClass, ContractClassTrait, declare, DeclareResultTrait}; +use snforge_std::{ + cheat_caller_address, CheatSpan, ContractClass, ContractClassTrait, declare, DeclareResultTrait +}; use starknet::{ContractAddress, contract_address_const}; @@ -197,3 +205,83 @@ fn setup_default_order(erc20_address: ContractAddress, nft_address: ContractAddr additional_data: data.span() } } + +fn create_offer_order( + executor_address: ContractAddress, + erc20_address: ContractAddress, + nft_address: ContractAddress, + token_id: u256 +) -> (felt252, ContractAddress, u256) { + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + + IFreeMintDispatcher { contract_address: erc20_address }.mint(offerer, start_amount); + + let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + (order.compute_order_hash(), offerer, start_amount) +} + +fn create_listing_order( + executor_address: ContractAddress, + erc20_address: ContractAddress, + nft_address: ContractAddress, + start_amount: u256 +) -> (felt252, ContractAddress, u256) { + let offerer = contract_address_const::<'offerer'>(); + + let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } + .get_current_token_id() + .into(); + Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); + + let order = setup_listing_order(erc20_address, nft_address, offerer, token_id, start_amount); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + (order.compute_order_hash(), offerer, token_id) +} + +fn create_auction_order( + executor_address: ContractAddress, + erc20_address: ContractAddress, + nft_address: ContractAddress, + start_amount: u256, + end_amount: u256 +) -> (felt252, ContractAddress, u256) { + let offerer = contract_address_const::<'offerer'>(); + + let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } + .get_current_token_id() + .into(); + Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); + + let order = setup_auction_order( + erc20_address, nft_address, offerer, token_id, start_amount, end_amount + ); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + (order.compute_order_hash(), offerer, token_id) +} + +fn create_collection_offer_order( + executor_address: ContractAddress, erc20_address: ContractAddress, nft_address: ContractAddress, +) -> (felt252, ContractAddress, u256) { + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + + IFreeMintDispatcher { contract_address: erc20_address }.mint(offerer, start_amount); + + let order = setup_collection_offer_order(erc20_address, nft_address, offerer, start_amount); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + + (order.compute_order_hash(), offerer, start_amount) +} diff --git a/contracts/ark_starknet/tests/integration/fulfill_order.cairo b/contracts/ark_starknet/tests/integration/fulfill_order.cairo index 43b29a5c9..86baa1b31 100644 --- a/contracts/ark_starknet/tests/integration/fulfill_order.cairo +++ b/contracts/ark_starknet/tests/integration/fulfill_order.cairo @@ -18,89 +18,11 @@ use snforge_std::{cheat_caller_address, CheatSpan}; use starknet::{ContractAddress, contract_address_const}; use super::super::common::setup::{ + create_auction_order, create_collection_offer_order, create_listing_order, create_offer_order, setup, setup_default_order, setup_auction_order, setup_collection_offer_order, setup_listing_order, setup_offer_order }; -fn create_offer_order( - executor_address: ContractAddress, - erc20_address: ContractAddress, - nft_address: ContractAddress, - token_id: u256 -) -> (felt252, ContractAddress, u256) { - let offerer = contract_address_const::<'offerer'>(); - let start_amount = 10_000_000; - - IFreeMintDispatcher { contract_address: erc20_address }.mint(offerer, start_amount); - - let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); - - cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); - IExecutorDispatcher { contract_address: executor_address }.create_order(order); - - (order.compute_order_hash(), offerer, start_amount) -} - -fn create_collection_offer_order( - executor_address: ContractAddress, erc20_address: ContractAddress, nft_address: ContractAddress, -) -> (felt252, ContractAddress, u256) { - let offerer = contract_address_const::<'offerer'>(); - let start_amount = 10_000_000; - - IFreeMintDispatcher { contract_address: erc20_address }.mint(offerer, start_amount); - - let order = setup_collection_offer_order(erc20_address, nft_address, offerer, start_amount); - - cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); - IExecutorDispatcher { contract_address: executor_address }.create_order(order); - - (order.compute_order_hash(), offerer, start_amount) -} - -fn create_listing_order( - executor_address: ContractAddress, - erc20_address: ContractAddress, - nft_address: ContractAddress, - start_amount: u256 -) -> (felt252, ContractAddress, u256) { - let offerer = contract_address_const::<'offerer'>(); - - let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } - .get_current_token_id() - .into(); - Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); - - let order = setup_listing_order(erc20_address, nft_address, offerer, token_id, start_amount); - - cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); - IExecutorDispatcher { contract_address: executor_address }.create_order(order); - - (order.compute_order_hash(), offerer, token_id) -} - -fn create_auction_order( - executor_address: ContractAddress, - erc20_address: ContractAddress, - nft_address: ContractAddress, - start_amount: u256, - end_amount: u256 -) -> (felt252, ContractAddress, u256) { - let offerer = contract_address_const::<'offerer'>(); - - let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } - .get_current_token_id() - .into(); - Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); - - let order = setup_auction_order( - erc20_address, nft_address, offerer, token_id, start_amount, end_amount - ); - - cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); - IExecutorDispatcher { contract_address: executor_address }.create_order(order); - - (order.compute_order_hash(), offerer, token_id) -} fn create_fulfill_info( order_hash: felt252, fulfiller: ContractAddress, token_address: ContractAddress, token_id: u256 From 424736bc2713b7a681e18ce24a7b496974ac530a Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Wed, 11 Sep 2024 16:09:06 +0200 Subject: [PATCH 07/33] contracts: WIP cancel_order tests --- .../tests/integration/cancel_order.cairo | 68 +++++++++++++++++++ contracts/ark_starknet/tests/lib.cairo | 1 + 2 files changed, 69 insertions(+) create mode 100644 contracts/ark_starknet/tests/integration/cancel_order.cairo diff --git a/contracts/ark_starknet/tests/integration/cancel_order.cairo b/contracts/ark_starknet/tests/integration/cancel_order.cairo new file mode 100644 index 000000000..fa889f512 --- /dev/null +++ b/contracts/ark_starknet/tests/integration/cancel_order.cairo @@ -0,0 +1,68 @@ +use ark_common::protocol::order_types::CancelInfo; + +use ark_starknet::interfaces::{ + IExecutorDispatcher, IExecutorDispatcherTrait, IMaintenanceDispatcher, + IMaintenanceDispatcherTrait +}; + +use snforge_std::{cheat_caller_address, CheatSpan, spy_events, EventSpyAssertionsTrait,}; + +use starknet::{ContractAddress, contract_address_const}; +use super::super::common::setup::{ + create_auction_order, create_collection_offer_order, create_listing_order, create_offer_order, + setup, setup_default_order, setup_auction_order, setup_collection_offer_order, + setup_listing_order, setup_offer_order +}; + +#[test] +fn test_cancel_offer_order() { + let (executor_address, erc20_address, nft_address) = setup(); + let token_id = 10; + + let (order_hash, offerer, start_amount) = create_offer_order( + executor_address, erc20_address, nft_address, token_id + ); + + let cancel_info = CancelInfo { + order_hash, + canceller: offerer, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::Some(token_id), + }; + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); +} + +// #[test] +// fn test_cancel_listing_order() {} +// +// #[test] +// fn test_cancel_auction_order() {} +// +// #[test] +// fn test_cancel_collection_offer_order() {} + +#[test] +#[should_panic] +fn test_cancel_offer_order_only_offerer() { + let (executor_address, erc20_address, nft_address) = setup(); + let token_id = 10; + let other = contract_address_const::<'other'>(); + + let (order_hash, offerer, start_amount) = create_offer_order( + executor_address, erc20_address, nft_address, token_id + ); + + let cancel_info = CancelInfo { + order_hash, + canceller: offerer, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::Some(token_id), + }; + + cheat_caller_address(executor_address, other, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); +} diff --git a/contracts/ark_starknet/tests/lib.cairo b/contracts/ark_starknet/tests/lib.cairo index 604ac5ca7..c575397ce 100644 --- a/contracts/ark_starknet/tests/lib.cairo +++ b/contracts/ark_starknet/tests/lib.cairo @@ -6,6 +6,7 @@ mod unit { mod test_fees; } mod integration { + mod cancel_order; mod create_order; // mod execute_order; mod fees_amount; From 61aab3a973d66109ee4126bf686a841623f16ca0 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Thu, 12 Sep 2024 00:40:35 +0200 Subject: [PATCH 08/33] fix(contracts): ensure caller is the canceller & canceller is the offerer --- contracts/ark_starknet/src/executor.cairo | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/contracts/ark_starknet/src/executor.cairo b/contracts/ark_starknet/src/executor.cairo index a40072e97..f19719cd3 100644 --- a/contracts/ark_starknet/src/executor.cairo +++ b/contracts/ark_starknet/src/executor.cairo @@ -285,6 +285,10 @@ mod executor { fn cancel_order(ref self: ContractState, cancelInfo: CancelInfo) { _ensure_is_not_in_maintenance(@self); + + let vinfo = CancelOrderInfo { cancelInfo: cancelInfo.clone() }; + _verify_cancel_order(@self, @vinfo); + self.orderbook.cancel_order(cancelInfo); } @@ -368,6 +372,19 @@ mod executor { } } + fn _verify_cancel_order(self: @ContractState, vinfo: @CancelOrderInfo) { + let cancel_info = vinfo.cancelInfo; + let caller = starknet::get_caller_address(); + let canceller = *(cancel_info.canceller); + assert!(caller == canceller, "Caller is not the canceller"); + + let order_info = self.orders.read(*cancel_info.order_hash); + // default value for ContractAddress is zero + // and an order's currency address shall not be zero + assert!(order_info.currency_address.is_non_zero(), "Order not found"); + assert!(order_info.offerer == canceller, "Canceller is not the offerer"); + } + fn _verify_fulfill_order(self: @ContractState, vinfo: @FulfillOrderInfo) { let fulfill_info = vinfo.fulfillInfo; let caller = starknet::get_caller_address(); From b5dc967484f4344e838f7a6ddb728645400fd1d4 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Thu, 12 Sep 2024 00:43:54 +0200 Subject: [PATCH 09/33] contracts: add cancel_order tests --- .../tests/integration/cancel_order.cairo | 283 +++++++++++++++++- 1 file changed, 270 insertions(+), 13 deletions(-) diff --git a/contracts/ark_starknet/tests/integration/cancel_order.cairo b/contracts/ark_starknet/tests/integration/cancel_order.cairo index fa889f512..88933b5e0 100644 --- a/contracts/ark_starknet/tests/integration/cancel_order.cairo +++ b/contracts/ark_starknet/tests/integration/cancel_order.cairo @@ -1,4 +1,9 @@ -use ark_common::protocol::order_types::CancelInfo; +use ark_common::protocol::order_types::{CancelInfo, OrderStatus, OrderType}; + +use ark_component::orderbook::OrderbookComponent; +use ark_component::orderbook::interface::{IOrderbookDispatcher, IOrderbookDispatcherTrait,}; + +use ark_starknet::executor::executor; use ark_starknet::interfaces::{ IExecutorDispatcher, IExecutorDispatcherTrait, IMaintenanceDispatcher, @@ -18,8 +23,214 @@ use super::super::common::setup::{ fn test_cancel_offer_order() { let (executor_address, erc20_address, nft_address) = setup(); let token_id = 10; + let (order_hash, offerer, _) = create_offer_order( + executor_address, erc20_address, nft_address, token_id + ); + + let cancel_info = CancelInfo { + order_hash, + canceller: offerer, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::Some(token_id), + }; + + let mut spy = spy_events(); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderCancelled( + OrderbookComponent::OrderCancelled { + order_hash, + reason: OrderStatus::CancelledUser.into(), + order_type: OrderType::Offer, + version: OrderbookComponent::ORDER_CANCELLED_EVENT_VERSION, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::Offer, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::CancelledUser, + "Wrong order status" + ); +} + +#[test] +fn test_cancel_listing_order() { + let (executor_address, erc20_address, nft_address) = setup(); + let start_amount = 10_000_000; + + let (order_hash, offerer, token_id) = create_listing_order( + executor_address, erc20_address, nft_address, start_amount + ); + + let cancel_info = CancelInfo { + order_hash, + canceller: offerer, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::Some(token_id), + }; + + let mut spy = spy_events(); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderCancelled( + OrderbookComponent::OrderCancelled { + order_hash, + reason: OrderStatus::CancelledUser.into(), + order_type: OrderType::Listing, + version: OrderbookComponent::ORDER_CANCELLED_EVENT_VERSION, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::Listing, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::CancelledUser, + "Wrong order status" + ); +} + +#[test] +fn test_cancel_auction_order() { + let (executor_address, erc20_address, nft_address) = setup(); + let start_amount = 10_000_000; + let end_amount = 20_000_000; + + let (order_hash, offerer, token_id) = create_auction_order( + executor_address, erc20_address, nft_address, start_amount, end_amount + ); + + let cancel_info = CancelInfo { + order_hash, + canceller: offerer, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::Some(token_id), + }; + + let mut spy = spy_events(); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderCancelled( + OrderbookComponent::OrderCancelled { + order_hash, + reason: OrderStatus::CancelledUser.into(), + order_type: OrderType::Auction, + version: OrderbookComponent::ORDER_CANCELLED_EVENT_VERSION, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::Auction, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::CancelledUser, + "Wrong order status" + ); +} + +#[test] +fn test_cancel_collection_offer_order() { + let (executor_address, erc20_address, nft_address) = setup(); + let (order_hash, offerer, _) = create_collection_offer_order( + executor_address, erc20_address, nft_address + ); + + let cancel_info = CancelInfo { + order_hash, + canceller: offerer, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::None + }; + + let mut spy = spy_events(); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); + + spy + .assert_emitted( + @array![ + ( + executor_address, + executor::Event::OrderbookEvent( + OrderbookComponent::Event::OrderCancelled( + OrderbookComponent::OrderCancelled { + order_hash, + reason: OrderStatus::CancelledUser.into(), + order_type: OrderType::CollectionOffer, + version: OrderbookComponent::ORDER_CANCELLED_EVENT_VERSION, + } + ) + ) + ) + ] + ); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_type(order_hash), + OrderType::CollectionOffer, + "Wrong order type" + ); + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::CancelledUser, + "Wrong order status" + ); +} - let (order_hash, offerer, start_amount) = create_offer_order( +#[test] +// #[should_panic] +fn test_cancel_offer_order_already_cancelled() { + let (executor_address, erc20_address, nft_address) = setup(); + let token_id = 10; + let (order_hash, offerer, _) = create_offer_order( executor_address, erc20_address, nft_address, token_id ); @@ -33,25 +244,47 @@ fn test_cancel_offer_order() { cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); + + assert_eq!( + IOrderbookDispatcher { contract_address: executor_address }.get_order_status(order_hash), + OrderStatus::CancelledUser, + "Wrong order status" + ); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); +} + +#[test] +#[should_panic(expected: "Order not found")] +fn test_cancel_offer_order_bad_order_hash() { + let (executor_address, erc20_address, nft_address) = setup(); + let token_id = 10; + let (order_hash, offerer, _) = create_offer_order( + executor_address, erc20_address, nft_address, token_id + ); + + let cancel_info = CancelInfo { + order_hash: order_hash + 1, + canceller: offerer, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::Some(token_id), + }; + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); } -// #[test] -// fn test_cancel_listing_order() {} -// -// #[test] -// fn test_cancel_auction_order() {} -// -// #[test] -// fn test_cancel_collection_offer_order() {} #[test] -#[should_panic] -fn test_cancel_offer_order_only_offerer() { +#[should_panic(expected: "Caller is not the canceller")] +fn test_cancel_offer_order_caller_is_not_offerer() { let (executor_address, erc20_address, nft_address) = setup(); let token_id = 10; let other = contract_address_const::<'other'>(); - let (order_hash, offerer, start_amount) = create_offer_order( + let (order_hash, offerer, _) = create_offer_order( executor_address, erc20_address, nft_address, token_id ); @@ -66,3 +299,27 @@ fn test_cancel_offer_order_only_offerer() { cheat_caller_address(executor_address, other, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); } + + +#[test] +#[should_panic(expected: "Canceller is not the offerer")] +fn test_cancel_offer_order_offerer_is_not_the_canceller() { + let (executor_address, erc20_address, nft_address) = setup(); + let token_id = 10; + let other = contract_address_const::<'other'>(); + + let (order_hash, _offerer, _start_amount) = create_offer_order( + executor_address, erc20_address, nft_address, token_id + ); + + let cancel_info = CancelInfo { + order_hash, + canceller: other, + token_chain_id: 'SN_MAIN', + token_address: nft_address, + token_id: Option::Some(token_id), + }; + + cheat_caller_address(executor_address, other, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.cancel_order(cancel_info); +} From 6e5a00850a50f6899cc754d3c2885a028599805b Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Thu, 12 Sep 2024 11:56:44 +0200 Subject: [PATCH 10/33] fix(contracts): ensure an order with same hash can't be created twice --- .../src/orderbook/orderbook.cairo | 13 +--- .../tests/integration/create_order.cairo | 71 ++++++++++++++++++- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/contracts/ark_component/src/orderbook/orderbook.cairo b/contracts/ark_component/src/orderbook/orderbook.cairo index 2b23d2604..6e265aee2 100644 --- a/contracts/ark_component/src/orderbook/orderbook.cairo +++ b/contracts/ark_component/src/orderbook/orderbook.cairo @@ -265,21 +265,12 @@ pub mod OrderbookComponent { .validate_order_type() .expect(orderbook_errors::ORDER_INVALID_DATA); let order_hash = order.compute_order_hash(); + assert(order_status_read(order_hash).is_none(), orderbook_errors::ORDER_ALREADY_EXISTS); match order_type { OrderType::Listing => { - assert( - order_status_read(order_hash).is_none(), - orderbook_errors::ORDER_ALREADY_EXISTS - ); let _ = self._create_listing_order(order, order_type, order_hash); }, - OrderType::Auction => { - assert( - order_status_read(order_hash).is_none(), - orderbook_errors::ORDER_ALREADY_EXISTS - ); - self._create_auction(order, order_type, order_hash); - }, + OrderType::Auction => { self._create_auction(order, order_type, order_hash); }, OrderType::Offer => { self._create_offer(order, order_type, order_hash); }, OrderType::CollectionOffer => { self._create_collection_offer(order, order_type, order_hash); diff --git a/contracts/ark_starknet/tests/integration/create_order.cairo b/contracts/ark_starknet/tests/integration/create_order.cairo index 75c408ae0..02676d729 100644 --- a/contracts/ark_starknet/tests/integration/create_order.cairo +++ b/contracts/ark_starknet/tests/integration/create_order.cairo @@ -183,7 +183,6 @@ fn test_create_collection_offer_order_ok() { let (executor_address, erc20_address, nft_address) = setup(); let offerer = contract_address_const::<'offerer'>(); let start_amount = 10_000_000; - let token_id = 10_u256; Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); let order = setup_collection_offer_order(erc20_address, nft_address, offerer, start_amount); @@ -320,3 +319,73 @@ fn test_create_listing_order_disabled() { cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); IExecutorDispatcher { contract_address: executor_address }.create_order(order); } + +#[test] +#[should_panic(expected: 'OB: order already exists')] +fn test_create_offer_order_twice() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let token_id = 10_u256; + Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); + + let order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(2)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); +} + +#[test] +#[should_panic(expected: 'OB: order already exists')] +fn test_create_listing_order_twice() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } + .get_current_token_id() + .into(); + Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); + + let order = setup_listing_order(erc20_address, nft_address, offerer, token_id, start_amount); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(2)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); +} + +#[test] +#[should_panic(expected: 'OB: order already exists')] +fn test_create_auction_order_twice() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let end_amount = start_amount * 2; + let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } + .get_current_token_id() + .into(); + Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); + + let order = setup_auction_order( + erc20_address, nft_address, offerer, token_id, start_amount, end_amount + ); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(2)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); +} + +#[test] +#[should_panic(expected: 'OB: order already exists')] +fn test_create_collection_offer_order_twice() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); + + let order = setup_collection_offer_order(erc20_address, nft_address, offerer, start_amount); + + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(2)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); +} From 3045d3e448ddf14698503577e1717a1979b2efbe Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Thu, 12 Sep 2024 17:08:20 +0200 Subject: [PATCH 11/33] contracts: add test case for expired orders creation --- .../tests/integration/create_order.cairo | 85 ++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/contracts/ark_starknet/tests/integration/create_order.cairo b/contracts/ark_starknet/tests/integration/create_order.cairo index 02676d729..d3f421788 100644 --- a/contracts/ark_starknet/tests/integration/create_order.cairo +++ b/contracts/ark_starknet/tests/integration/create_order.cairo @@ -16,7 +16,10 @@ use ark_tokens::erc20::IFreeMintDispatcherTrait as Erc20DispatcherTrait; use ark_tokens::erc721::IFreeMintDispatcher as Erc721Dispatcher; use ark_tokens::erc721::IFreeMintDispatcherTrait as Erc721DispatcherTrait; -use snforge_std::{cheat_caller_address, CheatSpan, spy_events, EventSpyAssertionsTrait,}; +use snforge_std::{ + cheat_caller_address, CheatSpan, spy_events, EventSpyAssertionsTrait, + start_cheat_block_timestamp_global, stop_cheat_block_timestamp_global +}; use starknet::{ContractAddress, contract_address_const}; use super::super::common::setup::{ @@ -389,3 +392,83 @@ fn test_create_collection_offer_order_twice() { IExecutorDispatcher { contract_address: executor_address }.create_order(order); IExecutorDispatcher { contract_address: executor_address }.create_order(order); } + +#[test] +#[should_panic(expected: 'END_DATE_IN_THE_PAST')] +fn test_create_offer_order_expired() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let token_id = 10_u256; + Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); + + let mut order = setup_offer_order(erc20_address, nft_address, offerer, token_id, start_amount); + let current = starknet::get_block_timestamp(); + order.end_date = current + 10; + start_cheat_block_timestamp_global(current + 30); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + stop_cheat_block_timestamp_global(); +} + +#[test] +#[should_panic(expected: 'END_DATE_IN_THE_PAST')] +fn test_create_listing_order_expired() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } + .get_current_token_id() + .into(); + Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); + + let mut order = setup_listing_order( + erc20_address, nft_address, offerer, token_id, start_amount + ); + let current = starknet::get_block_timestamp(); + order.end_date = current + 10; + start_cheat_block_timestamp_global(current + 30); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + stop_cheat_block_timestamp_global(); +} + +#[test] +#[should_panic(expected: 'END_DATE_IN_THE_PAST')] +fn test_create_auction_order_expired() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + let end_amount = start_amount * 2; + let token_id: u256 = Erc721Dispatcher { contract_address: nft_address } + .get_current_token_id() + .into(); + Erc721Dispatcher { contract_address: nft_address }.mint(offerer, 'base_uri'); + + let mut order = setup_auction_order( + erc20_address, nft_address, offerer, token_id, start_amount, end_amount + ); + let current = starknet::get_block_timestamp(); + order.end_date = current + 10; + start_cheat_block_timestamp_global(current + 30); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + stop_cheat_block_timestamp_global(); +} + +#[test] +#[should_panic(expected: 'END_DATE_IN_THE_PAST')] +fn test_create_collection_offer_order_expired() { + let (executor_address, erc20_address, nft_address) = setup(); + let offerer = contract_address_const::<'offerer'>(); + let start_amount = 10_000_000; + Erc20Dispatcher { contract_address: erc20_address }.mint(offerer, start_amount); + + let mut order = setup_collection_offer_order(erc20_address, nft_address, offerer, start_amount); + let current = starknet::get_block_timestamp(); + order.end_date = current + 10; + start_cheat_block_timestamp_global(current + 30); + cheat_caller_address(executor_address, offerer, CheatSpan::TargetCalls(1)); + IExecutorDispatcher { contract_address: executor_address }.create_order(order); + stop_cheat_block_timestamp_global(); +} From d3b6d26c070a8bddc5734fd1bc0cec3edb8da9bb Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Fri, 13 Sep 2024 10:28:25 +0200 Subject: [PATCH 12/33] contracts(starknet): arkchain orderbook is no more used --- contracts/ark_starknet/src/executor.cairo | 19 ------------------- contracts/ark_starknet/src/interfaces.cairo | 3 --- 2 files changed, 22 deletions(-) diff --git a/contracts/ark_starknet/src/executor.cairo b/contracts/ark_starknet/src/executor.cairo index f19719cd3..204bf58d7 100644 --- a/contracts/ark_starknet/src/executor.cairo +++ b/contracts/ark_starknet/src/executor.cairo @@ -96,7 +96,6 @@ mod executor { #[storage] struct Storage { admin_address: ContractAddress, - arkchain_orderbook_address: ContractAddress, eth_contract_address: ContractAddress, chain_id: felt252, broker_fees: Map, @@ -253,30 +252,12 @@ mod executor { } } - fn get_orderbook_address(self: @ContractState) -> ContractAddress { - self.arkchain_orderbook_address.read() - } - - fn update_arkchain_orderbook_address( - ref self: ContractState, orderbook_address: ContractAddress - ) { - _ensure_admin(@self); - - self.arkchain_orderbook_address.write(orderbook_address); - } - fn update_eth_address(ref self: ContractState, eth_address: ContractAddress) { _ensure_admin(@self); self.eth_contract_address.write(eth_address); } - fn update_orderbook_address(ref self: ContractState, orderbook_address: ContractAddress) { - _ensure_admin(@self); - - self.arkchain_orderbook_address.write(orderbook_address); - } - fn update_admin_address(ref self: ContractState, admin_address: ContractAddress) { _ensure_admin(@self); diff --git a/contracts/ark_starknet/src/interfaces.cairo b/contracts/ark_starknet/src/interfaces.cairo index e2b02f514..f283272b5 100644 --- a/contracts/ark_starknet/src/interfaces.cairo +++ b/contracts/ark_starknet/src/interfaces.cairo @@ -20,10 +20,7 @@ trait IExecutor { fn create_order(ref self: T, order: OrderV1); // fn execute_order(ref self: T, execution_info: ExecutionInfo); fn update_admin_address(ref self: T, admin_address: ContractAddress); - fn update_orderbook_address(ref self: T, orderbook_address: ContractAddress); fn update_eth_address(ref self: T, eth_address: ContractAddress); - fn get_orderbook_address(self: @T) -> ContractAddress; - fn update_arkchain_orderbook_address(ref self: T, orderbook_address: ContractAddress); fn set_broker_fees(ref self: T, fees_ratio: FeesRatio); fn get_broker_fees(self: @T, broker_address: ContractAddress) -> FeesRatio; fn set_ark_fees(ref self: T, fees_ratio: FeesRatio); From 5efaf0277d2148c92aec4df259895def1b94b162 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Sat, 14 Sep 2024 21:46:25 +0200 Subject: [PATCH 13/33] CI: run SDK test with devnet --- .env.devnet | 44 ++ .github/actions/install-snforge/action.yml | 34 ++ .github/workflows/arkproject-contracts.yml | 75 ++-- pnpm-lock.yaml | 466 ++++++++++++++++----- 4 files changed, 495 insertions(+), 124 deletions(-) create mode 100644 .env.devnet create mode 100644 .github/actions/install-snforge/action.yml diff --git a/.env.devnet b/.env.devnet new file mode 100644 index 000000000..e80c1d960 --- /dev/null +++ b/.env.devnet @@ -0,0 +1,44 @@ +# Starknet RPC URL +STARKNET_RPC_URL=http://0.0.0.0:5050 + +## starknet-devnet-rs 0.2.0 account --seed 0 +# Starknet accounts +STARKNET_ADMIN_ADDRESS_DEV=0x64b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691 +STARKNET_ADMIN_PRIVATE_KEY_DEV=0x0000000000000000000000000000000071d7bb07b9a64f6f78ac4c816aff4da9 + +STARKNET_ACCOUNT1_ADDRESS=0x78662e7352d062084b0010068b99288486c2d8b914f6e2a55ce945f8792c8b1 +STARKNET_ACCOUNT1_PRIVATE_KEY=0x000000000000000000000000000000000e1406455b7d66b1690803be066cbe5e +STARKNET_ACCOUNT1_PUBLIC_KEY=0x007a1bb2744a7dd29bffd44341dbd78008adb4bc11733601e7eddff322ada9cb + +STARKNET_ACCOUNT2_ADDRESS=0x49dfb8ce986e21d354ac93ea65e6a11f639c1934ea253e5ff14ca62eca0f38e +STARKNET_ACCOUNT2_PRIVATE_KEY=0x00000000000000000000000000000000a20a02f0ac53692d144b20cb371a60d7 +STARKNET_ACCOUNT2_PUBLIC_KEY=0x00b8fd4ddd415902d96f61b7ad201022d495997c2dff8eb9e0eb86253e30fabc + +STARKNET_ARK_RECEIVER_ADDRESS=0x4f348398f859a55a0c80b1446c5fdc37edb3a8478a32f10764659fc241027d3 +STARKNET_ARK_RECEIVER_PRIVATE_KEY=0x00000000000000000000000000000000a641611c17d4d92bd0790074e34beeb7 + +STARKNET_ARK_COLLECTION_RECEIVER_ADDRESS=0xd513de92c16aa42418cf7e5b60f8022dbee1b4dfd81bcf03ebee079cfb5cb5 +STARKNET_ARK_COLLECTION_RECEIVER_PRIVATE_KEY=0x000000000000000000000000000000005b4ac23628a5749277bcabbf4726b025 + +STARKNET_ARK_COLLECTION_2981_RECEIVER_ADDRESS=0x1e8c6c17efa3a047506c0b1610bd188aa3e3dd6c5d9227549b65428de24de78 +STARKNET_ARK_COLLECTION_2981_RECEIVER_PRIVATE_KEY=0x00000000000000000000000000000000836203aceb0e9b0066138c321dda5ae6 + +STARKNET_LISTING_BROKER_ACCOUNT_ADDRESS=0x557ba9ef60b52dad611d79b60563901458f2476a5c1002a8b4869fcb6654c7e +STARKNET_LISTING_BROKER_ACCOUNT_PRIVATE_KEY=0x0000000000000000000000000000000015b5e3013d752c909988204714f1ff35 + +STARKNET_SALE_BROKER_ACCOUNT_ADDRESS=0x3736286f1050d4ba816b4d56d15d80ca74c1752c4e847243f1da726c36e06f +STARKNET_SALE_BROKER_ACCOUNT_PRIVATE_KEY=0x00000000000000000000000000000000a56597ba3378fa9e6440ea9ae0cf2865 + +SOLIS_ADMIN_ADDRESS_DEV=0xb3ff441a68610b30fd5e2abbf3a1548eb6ba6f3559f2862bf2dc757e5828ca +SOLIS_ADMIN_PRIVATE_KEY_DEV=0x2bbf4f9fd0bbb2e60b0316c1fe0b76cf7a4d0198bd493ced9b8df2a3a24d68a +SOLIS_ADMIN_PUBLIC_KEY_DEV=0x640466ebd2ce505209d3e5c4494b4276ed8f1cde764d757eb48831961f7cdea + +SOLIS_ADMIN_ADDRESS=0x6b86e40118f29ebe393a75469b4d926c7a44c2e2681b6d319520b7c1156d114 +SOLIS_ADMIN_PRIVATE_KEY=0x1c9053c053edf324aec366a34c6901b1095b07af69495bffec7d7fe21effb1b + +# Starknet network +STARKNET_NETWORK_ID=dev +# Solis network +SOLIS_NETWORK_ID=dev + +BROKER_ID= diff --git a/.github/actions/install-snforge/action.yml b/.github/actions/install-snforge/action.yml new file mode 100644 index 000000000..3de238ac2 --- /dev/null +++ b/.github/actions/install-snforge/action.yml @@ -0,0 +1,34 @@ +name: "Install contract dependencies" +description: "Install dependencies for smart contract" + +env: + SCARB_VERSION: 2.7.1 + STARKNET_FOUNDRY_VERSION: 0.30.0 + +runs: + using: "composite" + steps: + - name: Install universal sierra compiler + run: | + curl -L https://raw.githubusercontent.com/software-mansion/universal-sierra-compiler/master/scripts/install.sh | sh + echo "/root/.local/bin" >> ${GITHUB_PATH} + + - name: Check universal sierra compiler version + run: universal-sierra-compiler --version + + - name: Setup Scarb + uses: software-mansion/setup-scarb@v1 + with: + scarb-version: ${{ env.SCARB_VERSION }} + + - name: Setup Starknet Foundry + uses: foundry-rs/setup-snfoundry@v3 + with: + starknet-foundry-version: ${{ env.STARKNET_FOUNDRY_VERSION }} + + - name: Set Up Stable Rust Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + diff --git a/.github/workflows/arkproject-contracts.yml b/.github/workflows/arkproject-contracts.yml index 499894f3c..979857317 100644 --- a/.github/workflows/arkproject-contracts.yml +++ b/.github/workflows/arkproject-contracts.yml @@ -10,47 +10,74 @@ on: paths: - "contracts/**" +env: + SCARB_VERSION: 2.7.1 + STARKNET_DEVNET_VERSION: 0.2.0-rc3 + DEVNET_DUMP_PATH: /devnet-dump.json jobs: fmt: runs-on: ubuntu-latest name: Cairo formatting steps: - name: Checkout Repository - uses: actions/checkout@v3 - - name: Install universal sierra compiler - run: curl -L https://raw.githubusercontent.com/software-mansion/universal-sierra-compiler/master/scripts/install.sh | sh + uses: actions/checkout@v4 + - name: Setup Scarb uses: software-mansion/setup-scarb@v1 with: - scarb-version: 2.7.1 + scarb-version: ${{ env.SCARB_VERSION }} + - name: Check Scarb Formatting run: cd contracts && scarb fmt --check - test: + + forge-test: runs-on: ubuntu-latest name: Cairo starknet foundry tests steps: - name: Checkout Repository - uses: actions/checkout@v3 - - name: Install universal sierra compiler - run: curl -L https://raw.githubusercontent.com/software-mansion/universal-sierra-compiler/master/scripts/install.sh | sh - - name: Setup Scarb - uses: software-mansion/setup-scarb@v1 - with: - scarb-version: 2.7.1 + uses: actions/checkout@v4 - - name: Setup Starknet Foundry - uses: foundry-rs/setup-snfoundry@v2 - with: - starknet-foundry-version: 0.28.0 + - name: Install starknet foundry & dependencies + uses: ./.github/actions/install-snforge + + - name: Test contracts + run: cd contracts && snforge test + + devnet-test: + runs-on: ubuntu-latest + name: Running SDK test with starknet-devnet + # needs: forge-test + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install starknet foundry & dependencies + uses: ./.github/actions/install-snforge + + - name: Build smart contracts + run: cd contracts && scarb build --workspace + + - name: Run starknet-devnet as a background process + run: | + docker run -d --rm --name starknet-devnet \ + -p 5050:5050 \ + ptisserand/starknet-devnet-rs:${STARKNET_DEVNET_VERSION} \ + --seed 0 --dump-path $DEVNET_DUMP_PATH --state-archive-capacity full + sleep 3 # Wait for 3 seconds for the Docker container to initialize - - name: Test ark_common contracts - run: cd contracts/ark_common && snforge test + - name: Install SDK dependencies + uses: ./.github/actions/install-dependencies + + - name: Deploy smart contract + run: pnpm deploy:starknet:local + + - name: Run SDK test + run: | + cp .env.devnet .env + pnpm test - - name: Test ark_orderbook contracts - run: cd contracts/ark_orderbook && snforge test + - name: Stop starknet-devnet container + if: always() + run: docker stop starknet-devnet - - name: Test ark_starknet contracts - run: cd contracts/ark_starknet && snforge test - - name: Test ark_tokens contracts - run: cd contracts/ark_tokens && snforge test diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffef88768..fd297e36c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,7 +58,7 @@ importers: version: 6.11.0 ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@22.5.5)(typescript@5.6.2) + version: 10.9.2(@types/node@22.5.5)(typescript@5.5.4) typescript: specifier: ^5.0.0 version: 5.6.2 @@ -247,6 +247,9 @@ importers: dotenv: specifier: ^16.4.5 version: 16.4.5 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.5.5) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -256,66 +259,15 @@ importers: react-test-renderer: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + ts-jest: + specifier: ^29.1.1 + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.5))(typescript@5.5.4) typescript: specifier: ^5.3.3 version: 5.6.2 vitest: specifier: ^2.0.5 - version: 2.1.1(@types/node@22.5.5)(jsdom@20.0.3) - - packages/test: - devDependencies: - '@ark-project/eslint-config': - specifier: workspace:* - version: link:../eslint-config - '@ark-project/typescript-config': - specifier: workspace:* - version: link:../typescript-config - '@starknet-react/chains': - specifier: ^0.1.7 - version: 0.1.7 - '@starknet-react/core': - specifier: ^2.8.1 - version: 2.9.0(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.11.0) - '@tanstack/react-query': - specifier: ^5.55.4 - version: 5.56.2(react@18.3.1) - '@testing-library/dom': - specifier: ^10.4.0 - version: 10.4.0 - '@testing-library/jest-dom': - specifier: ^6.5.0 - version: 6.5.0 - '@testing-library/react': - specifier: ^16.0.1 - version: 16.0.1(@testing-library/dom@10.4.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@testing-library/react-hooks': - specifier: ^8.0.1 - version: 8.0.1(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react-test-renderer@18.3.1(react@18.3.1))(react@18.3.1) - '@types/react': - specifier: ^18 - version: 18.3.7 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 - react: - specifier: ^18 - version: 18.3.1 - react-dom: - specifier: ^18 - version: 18.3.1(react@18.3.1) - react-test-renderer: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - starknet: - specifier: ^6.9.0 - version: 6.11.0 - typescript: - specifier: ^5.3.3 - version: 5.6.2 + version: 2.0.5(@types/node@22.5.5)(jsdom@20.0.3) packages/typescript-config: {} @@ -1321,6 +1273,12 @@ packages: '@types/node@22.5.5': resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + + '@types/node@22.5.5': + resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -5100,6 +5058,10 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@22.5.5': + dependencies: + undici-types: 6.19.8 + '@types/normalize-package-data@2.4.4': {} '@types/prop-types@15.7.13': {} @@ -5119,7 +5081,7 @@ snapshots: '@types/ws@8.5.12': dependencies: - '@types/node': 20.12.14 + '@types/node': 20.16.1 '@types/yargs-parser@21.0.3': {} @@ -5261,19 +5223,19 @@ snapshots: '@babel/core': 7.25.2 '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.1) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) - eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)) - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1) - eslint-plugin-react: 7.36.1(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - eslint-plugin-testing-library: 6.3.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0)(typescript@5.5.4) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0)(typescript@5.5.4))(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + eslint-plugin-testing-library: 6.3.0(eslint@8.57.0)(typescript@5.5.4) eslint-plugin-tsdoc: 0.2.17 eslint-plugin-unicorn: 48.0.1(eslint@8.57.1) prettier-plugin-packagejson: 2.5.2(prettier@3.3.3) @@ -5686,6 +5648,21 @@ snapshots: convert-source-map@2.0.0: {} + create-jest@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-require@1.1.1: {} cross-spawn@5.1.0: @@ -6078,7 +6055,7 @@ snapshots: eslint: 8.57.1 eslint-plugin-turbo: 2.1.2(eslint@8.57.1) - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)): dependencies: eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) @@ -6159,7 +6136,8 @@ snapshots: '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + jest: 29.7.0 transitivePeerDependencies: - supports-color - typescript @@ -6852,6 +6830,183 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.16.1 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0: + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + optional: true + + jest-cli@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@22.5.5): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.5.5) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.5.5) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.16.1 + ts-node: 10.9.2(@types/node@20.16.1)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.5.5): + dependencies: + '@babel/core': 7.25.2 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.5.5 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + jest-environment-jsdom@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -6894,6 +7049,70 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.16.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.16.1 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0: + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + optional: true + + jest@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@22.5.5): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.5.5) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jju@1.4.0: {} joycon@3.1.1: {} @@ -7915,9 +8134,36 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + esbuild: 0.20.2 + + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.5))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@22.5.5) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-mixer@6.0.4: {} ts-node@10.9.2(@types/node@22.5.5)(typescript@5.6.2): dependencies: @@ -7937,6 +8183,42 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.5.5 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.5.5 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -8123,29 +8405,13 @@ snapshots: - utf-8-validate - zod - vite-node@2.1.1(@types/node@20.16.5): + vite-node@2.0.5(@types/node@22.5.5): dependencies: cac: 6.7.14 debug: 4.3.7(supports-color@5.5.0) pathe: 1.1.2 - vite: 5.4.6(@types/node@20.16.5) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite-node@2.1.1(@types/node@22.5.5): - dependencies: - cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) - pathe: 1.1.2 - vite: 5.4.6(@types/node@22.5.5) + tinyrainbow: 1.2.0 + vite: 5.4.3(@types/node@22.5.5) transitivePeerDependencies: - '@types/node' - less @@ -8157,16 +8423,16 @@ snapshots: - supports-color - terser - vite@5.4.6(@types/node@20.16.5): + vite@5.4.3(@types/node@20.16.1): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.21.3 optionalDependencies: - '@types/node': 20.16.5 + '@types/node': 20.16.1 fsevents: 2.3.3 - vite@5.4.6(@types/node@22.5.5): + vitest@2.0.5(@types/node@22.5.5)(jsdom@20.0.3): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -8193,11 +8459,11 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@20.16.5) - vite-node: 2.1.1(@types/node@20.16.5) + vite: 5.4.3(@types/node@22.5.5) + vite-node: 2.0.5(@types/node@22.5.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.16.5 + '@types/node': 22.5.5 jsdom: 20.0.3 transitivePeerDependencies: - less From 2f9b03095665afeab634f8792bbd4a7624c99be1 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Sat, 14 Sep 2024 21:53:25 +0200 Subject: [PATCH 14/33] fix(CI): add missing shell property for action --- .github/actions/install-snforge/action.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/actions/install-snforge/action.yml b/.github/actions/install-snforge/action.yml index 3de238ac2..eebf800ea 100644 --- a/.github/actions/install-snforge/action.yml +++ b/.github/actions/install-snforge/action.yml @@ -9,11 +9,13 @@ runs: using: "composite" steps: - name: Install universal sierra compiler + shell: bash run: | curl -L https://raw.githubusercontent.com/software-mansion/universal-sierra-compiler/master/scripts/install.sh | sh echo "/root/.local/bin" >> ${GITHUB_PATH} - name: Check universal sierra compiler version + shell: bash run: universal-sierra-compiler --version - name: Setup Scarb From 55b36cbc3580f11af6786add3e32b0174b597c4b Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Sat, 14 Sep 2024 22:01:02 +0200 Subject: [PATCH 15/33] turbo: ARKCHAIN_RPC_URL is no more needed --- turbo.json | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/turbo.json b/turbo.json index 822314520..9dafe42a7 100644 --- a/turbo.json +++ b/turbo.json @@ -1,9 +1,16 @@ { "$schema": "https://turbo.build/schema.json", - "globalDependencies": ["**/.env.*local"], - "tasks": { + "globalDependencies": [ + "**/.env.*local" + ], + "globalDotEnv": [ + ".env" + ], + "pipeline": { "build:packages": { - "dependsOn": ["^build"], + "dependsOn": [ + "^build" + ], "outputs": [ ".next/**", "!.next/cache/**", @@ -13,7 +20,9 @@ }, "build": { "cache": false, - "dependsOn": ["^build"], + "dependsOn": [ + "^build" + ], "outputs": [ ".next/**", "!.next/cache/**", @@ -22,26 +31,42 @@ ] }, "@ark-project/demo#build": { - "dependsOn": ["^build"], + "dependsOn": [ + "^build" + ], "env": [ "NEXT_PUBLIC_NFT_API_KEY", "NEXT_PUBLIC_ORDERBOOK_API_URL", "NEXT_PUBLIC_NFT_API_URL" ], - "outputs": [".next/**", "!.next/cache/**", ".vercel/output/**"] + "outputs": [ + ".next/**", + "!.next/cache/**", + ".vercel/output/**" + ] }, "dev": { - "dependsOn": ["^dev"], - "outputs": [".dist/**"] + "dependsOn": [ + "^dev" + ], + "outputs": [ + ".dist/**" + ] }, "lint": { - "dependsOn": ["^lint"] + "dependsOn": [ + "^lint" + ] }, "test": { - "dependsOn": ["^test"] + "dependsOn": [ + "^test" + ] }, "lint:fix": { - "dependsOn": ["^lint:fix"] + "dependsOn": [ + "^lint:fix" + ] }, "clean": { "cache": false @@ -77,6 +102,7 @@ }, "globalEnv": [ "ACCOUNT_CLASS_HASH", + "BROKER_ID", "CI", "SOLIS_ACCOUNT_CLASS_HASH", "SOLIS_ADMIN_ADDRESS", @@ -98,4 +124,4 @@ "STARKNET_ADMIN_PRIVATE_KEY", "STARKNET_ADMIN_ADDRESS" ] -} +} \ No newline at end of file From 8ef8bbee1ba4654cefa662e65fe78e2680a655d5 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Sat, 14 Sep 2024 22:07:10 +0200 Subject: [PATCH 16/33] fix(CI): add missing step for devnet environment --- .github/workflows/arkproject-contracts.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/arkproject-contracts.yml b/.github/workflows/arkproject-contracts.yml index 979857317..77e18a5a9 100644 --- a/.github/workflows/arkproject-contracts.yml +++ b/.github/workflows/arkproject-contracts.yml @@ -68,6 +68,9 @@ jobs: - name: Install SDK dependencies uses: ./.github/actions/install-dependencies + - name: Setup environment for devnet + run: cp .env.devnet .env + - name: Deploy smart contract run: pnpm deploy:starknet:local From e23409754fa3c68eaafec11ea38a7fca5f93ba30 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Thu, 19 Sep 2024 18:52:07 +0200 Subject: [PATCH 17/33] CI: starknet-devnet-rs 0.2.0 have been released --- .github/workflows/arkproject-contracts.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/arkproject-contracts.yml b/.github/workflows/arkproject-contracts.yml index 77e18a5a9..9b42a6b0a 100644 --- a/.github/workflows/arkproject-contracts.yml +++ b/.github/workflows/arkproject-contracts.yml @@ -12,7 +12,7 @@ on: env: SCARB_VERSION: 2.7.1 - STARKNET_DEVNET_VERSION: 0.2.0-rc3 + STARKNET_DEVNET_VERSION: 0.2.0 DEVNET_DUMP_PATH: /devnet-dump.json jobs: fmt: @@ -61,7 +61,7 @@ jobs: run: | docker run -d --rm --name starknet-devnet \ -p 5050:5050 \ - ptisserand/starknet-devnet-rs:${STARKNET_DEVNET_VERSION} \ + shardlabs/starknet-devnet-rs:${STARKNET_DEVNET_VERSION} \ --seed 0 --dump-path $DEVNET_DUMP_PATH --state-archive-capacity full sleep 3 # Wait for 3 seconds for the Docker container to initialize From 91454d85302e6835a7e199d48e038e3c7cdfdaf8 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Thu, 19 Sep 2024 19:17:48 +0200 Subject: [PATCH 18/33] feat(diri): update indexer to support new event format. Update cainome to 0.4.0 --- Cargo.lock | 407 +++++++++++++----- crates/diri/Cargo.toml | 17 +- crates/diri/examples/display-events.rs | 198 +++++++++ crates/diri/src/lib.rs | 11 +- crates/diri/src/mod.rs | 1 + crates/diri/src/orderbook.rs | 136 ------ crates/diri/src/orderbook/events/mod.rs | 29 ++ .../src/orderbook/events/order_cancelled.rs | 108 +++++ .../src/orderbook/events/order_executed.rs | 371 ++++++++++++++++ .../src/orderbook/events/order_fulfilled.rs | 113 +++++ .../diri/src/orderbook/events/order_placed.rs | 200 +++++++++ .../src/orderbook/events/rollback_status.rs | 109 +++++ crates/diri/src/orderbook/mod.rs | 45 ++ crates/diri/src/storage/types.rs | 91 ++-- 14 files changed, 1561 insertions(+), 275 deletions(-) create mode 100644 crates/diri/examples/display-events.rs create mode 100644 crates/diri/src/mod.rs delete mode 100644 crates/diri/src/orderbook.rs create mode 100644 crates/diri/src/orderbook/events/mod.rs create mode 100644 crates/diri/src/orderbook/events/order_cancelled.rs create mode 100644 crates/diri/src/orderbook/events/order_executed.rs create mode 100644 crates/diri/src/orderbook/events/order_fulfilled.rs create mode 100644 crates/diri/src/orderbook/events/order_placed.rs create mode 100644 crates/diri/src/orderbook/events/rollback_status.rs create mode 100644 crates/diri/src/orderbook/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 89b54a661..60efb60b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -410,6 +410,12 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -490,31 +496,48 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cainome" -version = "0.1.5" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.8#e79deabeb989f73100c0b2e6a1fe5427858e40a8" +version = "0.2.3" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.0#0d29bb06b3f7cb7fcb8f0749c3b2ad105a5551dd" dependencies = [ + "anyhow", + "async-trait", "cainome-cairo-serde", "cainome-parser", "cainome-rs", + "cainome-rs-macro", + "camino", + "clap", + "clap_complete", + "convert_case 0.6.0", + "serde", + "serde_json", + "starknet 0.11.0", + "starknet-types-core 0.1.5 (git+https://github.com/starknet-io/types-rs?rev=f98f048)", + "thiserror", + "tracing", + "tracing-subscriber", + "url", ] [[package]] name = "cainome-cairo-serde" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.8#e79deabeb989f73100c0b2e6a1fe5427858e40a8" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.0#0d29bb06b3f7cb7fcb8f0749c3b2ad105a5551dd" dependencies = [ - "starknet 0.8.0", + "serde", + "starknet 0.11.0", "thiserror", ] [[package]] name = "cainome-parser" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.8#e79deabeb989f73100c0b2e6a1fe5427858e40a8" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.0#0d29bb06b3f7cb7fcb8f0749c3b2ad105a5551dd" dependencies = [ + "convert_case 0.6.0", "quote", "serde_json", - "starknet 0.8.0", + "starknet 0.11.0", "syn 2.0.64", "thiserror", ] @@ -522,19 +545,48 @@ dependencies = [ [[package]] name = "cainome-rs" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.8#e79deabeb989f73100c0b2e6a1fe5427858e40a8" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.0#0d29bb06b3f7cb7fcb8f0749c3b2ad105a5551dd" dependencies = [ "anyhow", "cainome-cairo-serde", "cainome-parser", + "camino", + "prettyplease", "proc-macro2", "quote", "serde_json", - "starknet 0.8.0", + "starknet 0.11.0", "syn 2.0.64", "thiserror", ] +[[package]] +name = "cainome-rs-macro" +version = "0.1.0" +source = "git+https://github.com/cartridge-gg/cainome?tag=v0.4.0#0d29bb06b3f7cb7fcb8f0749c3b2ad105a5551dd" +dependencies = [ + "anyhow", + "cainome-cairo-serde", + "cainome-parser", + "cainome-rs", + "proc-macro-error", + "proc-macro2", + "quote", + "serde_json", + "starknet 0.11.0", + "syn 2.0.64", + "thiserror", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + [[package]] name = "cc" version = "1.0.83" @@ -597,6 +649,15 @@ dependencies = [ "strsim 0.11.1", ] +[[package]] +name = "clap_complete" +version = "4.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a2d6eec27fce550d708b2be5d798797e5a55b246b323ef36924a0001996352" +dependencies = [ + "clap", +] + [[package]] name = "clap_derive" version = "4.5.4" @@ -646,6 +707,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -823,7 +893,7 @@ version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", @@ -859,10 +929,12 @@ dependencies = [ "regex", "serde", "serde_json", - "starknet 0.8.0", + "starknet 0.11.0", + "starknet-types-core 0.1.5 (git+https://github.com/starknet-io/types-rs?rev=f98f048)", "thiserror", "tokio", "tracing", + "tracing-subscriber", "url", ] @@ -1510,6 +1582,7 @@ checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.3", + "serde", ] [[package]] @@ -1586,6 +1659,28 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "lambdaworks-crypto" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb5d4f22241504f7c7b8d2c3a7d7835d7c07117f10bff2a7d96a9ef6ef217c3" +dependencies = [ + "lambdaworks-math", + "serde", + "sha2", + "sha3", +] + +[[package]] +name = "lambdaworks-math" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "358e172628e713b80a530a59654154bfc45783a6ed70ea284839800cebdf8f97" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1801,6 +1896,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.45" @@ -1824,9 +1925,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -2096,6 +2197,16 @@ dependencies = [ "termtree", ] +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.64", +] + [[package]] name = "primitive-types" version = "0.12.2" @@ -2624,7 +2735,25 @@ dependencies = [ "indexmap 1.9.3", "serde", "serde_json", - "serde_with_macros", + "serde_with_macros 2.3.3", + "time", +] + +[[package]] +name = "serde_with" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros 3.9.0", "time", ] @@ -2640,6 +2769,18 @@ dependencies = [ "syn 2.0.64", ] +[[package]] +name = "serde_with_macros" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.64", +] + [[package]] name = "sha1" version = "0.10.6" @@ -2977,29 +3118,13 @@ dependencies = [ "starknet-accounts 0.6.1", "starknet-contract 0.6.0", "starknet-core 0.7.2", - "starknet-crypto", + "starknet-crypto 0.6.2", "starknet-ff", - "starknet-macros", + "starknet-macros 0.1.7", "starknet-providers 0.7.0", "starknet-signers 0.5.0", ] -[[package]] -name = "starknet" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb139c5e6f6c6da627080e33cc00b3fc1c9733403034ca1ee9c42a95c337c7f" -dependencies = [ - "starknet-accounts 0.7.0", - "starknet-contract 0.7.0", - "starknet-core 0.8.0", - "starknet-crypto", - "starknet-ff", - "starknet-macros", - "starknet-providers 0.8.0", - "starknet-signers 0.6.0", -] - [[package]] name = "starknet" version = "0.10.0" @@ -3009,13 +3134,27 @@ dependencies = [ "starknet-accounts 0.9.0", "starknet-contract 0.9.0", "starknet-core 0.10.0", - "starknet-crypto", + "starknet-crypto 0.6.2", "starknet-ff", - "starknet-macros", + "starknet-macros 0.1.7", "starknet-providers 0.10.0", "starknet-signers 0.8.0", ] +[[package]] +name = "starknet" +version = "0.11.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" +dependencies = [ + "starknet-accounts 0.10.0", + "starknet-contract 0.10.0", + "starknet-core 0.11.1", + "starknet-crypto 0.7.1", + "starknet-macros 0.2.0", + "starknet-providers 0.11.0", + "starknet-signers 0.9.0", +] + [[package]] name = "starknet-accounts" version = "0.6.1" @@ -3032,29 +3171,29 @@ dependencies = [ [[package]] name = "starknet-accounts" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3743932c80ad2a5868c2dd4ef729de4e12060c88e73e4bb678a5f8e51b105e53" +checksum = "2095d7584608ae1707bd1cf2889368ab3734d9f54e4fcef4765cba1f3b3f7618" dependencies = [ "async-trait", "auto_impl", - "starknet-core 0.8.0", - "starknet-providers 0.8.0", - "starknet-signers 0.6.0", + "starknet-core 0.10.0", + "starknet-providers 0.10.0", + "starknet-signers 0.8.0", "thiserror", ] [[package]] name = "starknet-accounts" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2095d7584608ae1707bd1cf2889368ab3734d9f54e4fcef4765cba1f3b3f7618" +version = "0.10.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" dependencies = [ "async-trait", "auto_impl", - "starknet-core 0.10.0", - "starknet-providers 0.10.0", - "starknet-signers 0.8.0", + "starknet-core 0.11.1", + "starknet-crypto 0.7.1", + "starknet-providers 0.11.0", + "starknet-signers 0.9.0", "thiserror", ] @@ -3066,7 +3205,7 @@ checksum = "d858efc93d85de95065a5732cb3e94d0c746674964c0859aab442ffbb9de76b4" dependencies = [ "serde", "serde_json", - "serde_with", + "serde_with 2.3.3", "starknet-accounts 0.6.1", "starknet-core 0.7.2", "starknet-providers 0.7.0", @@ -3075,31 +3214,30 @@ dependencies = [ [[package]] name = "starknet-contract" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e55aac528c5376e1626d5a8d4daaf280bfd08f909dadc729e5b009203d6ec21" +checksum = "cb3b73d437b4d62241612d13fce612602de6684c149cccf696e76a20757e2156" dependencies = [ "serde", "serde_json", - "serde_with", - "starknet-accounts 0.7.0", - "starknet-core 0.8.0", - "starknet-providers 0.8.0", + "serde_with 2.3.3", + "starknet-accounts 0.9.0", + "starknet-core 0.10.0", + "starknet-providers 0.10.0", "thiserror", ] [[package]] name = "starknet-contract" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3b73d437b4d62241612d13fce612602de6684c149cccf696e76a20757e2156" +version = "0.10.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" dependencies = [ "serde", "serde_json", - "serde_with", - "starknet-accounts 0.9.0", - "starknet-core 0.10.0", - "starknet-providers 0.10.0", + "serde_with 3.9.0", + "starknet-accounts 0.10.0", + "starknet-core 0.11.1", + "starknet-providers 0.11.0", "thiserror", ] @@ -3115,17 +3253,17 @@ dependencies = [ "serde", "serde_json", "serde_json_pythonic", - "serde_with", + "serde_with 2.3.3", "sha3", - "starknet-crypto", + "starknet-crypto 0.6.2", "starknet-ff", ] [[package]] name = "starknet-core" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50e281d4fdb97988a3d5c7b7cae22b9d67bb2ef9be2cfafc17a1e35542cb53" +checksum = "5ed286d637e34fb8ae1cd2f9615120ec8ff38d1cffd311ed7fdd497cdd2bd01f" dependencies = [ "base64 0.21.5", "flate2", @@ -3133,28 +3271,28 @@ dependencies = [ "serde", "serde_json", "serde_json_pythonic", - "serde_with", + "serde_with 2.3.3", "sha3", - "starknet-crypto", + "starknet-crypto 0.6.2", "starknet-ff", ] [[package]] name = "starknet-core" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed286d637e34fb8ae1cd2f9615120ec8ff38d1cffd311ed7fdd497cdd2bd01f" +version = "0.11.1" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" dependencies = [ "base64 0.21.5", + "crypto-bigint", "flate2", "hex", "serde", "serde_json", "serde_json_pythonic", - "serde_with", + "serde_with 3.9.0", "sha3", - "starknet-crypto", - "starknet-ff", + "starknet-crypto 0.7.1", + "starknet-types-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3172,18 +3310,36 @@ dependencies = [ "rfc6979", "sha2", "starknet-crypto-codegen", - "starknet-curve", + "starknet-curve 0.4.2", "starknet-ff", "zeroize", ] +[[package]] +name = "starknet-crypto" +version = "0.7.1" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" +dependencies = [ + "crypto-bigint", + "hex", + "hmac", + "num-bigint", + "num-integer", + "num-traits", + "rfc6979", + "sha2", + "starknet-curve 0.5.0", + "starknet-types-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize", +] + [[package]] name = "starknet-crypto-codegen" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" dependencies = [ - "starknet-curve", + "starknet-curve 0.4.2", "starknet-ff", "syn 2.0.64", ] @@ -3197,6 +3353,14 @@ dependencies = [ "starknet-ff", ] +[[package]] +name = "starknet-curve" +version = "0.5.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" +dependencies = [ + "starknet-types-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "starknet-ff" version = "0.3.7" @@ -3222,6 +3386,15 @@ dependencies = [ "syn 2.0.64", ] +[[package]] +name = "starknet-macros" +version = "0.2.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" +dependencies = [ + "starknet-core 0.11.1", + "syn 2.0.64", +] + [[package]] name = "starknet-providers" version = "0.7.0" @@ -3236,7 +3409,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "serde_with", + "serde_with 2.3.3", "starknet-core 0.7.2", "thiserror", "url", @@ -3244,9 +3417,9 @@ dependencies = [ [[package]] name = "starknet-providers" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b08084f36ff7f11743ec71f33f0b11d439cbe0524058def299eb47de1ef1c28" +checksum = "b6abf40ffcbe3b887b4d5cfc8ab73170c816b4aa78d1d4ad59abd3fb3b0f53cd" dependencies = [ "async-trait", "auto_impl", @@ -3256,28 +3429,28 @@ dependencies = [ "reqwest", "serde", "serde_json", - "serde_with", - "starknet-core 0.8.0", + "serde_with 2.3.3", + "starknet-core 0.10.0", "thiserror", "url", ] [[package]] name = "starknet-providers" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6abf40ffcbe3b887b4d5cfc8ab73170c816b4aa78d1d4ad59abd3fb3b0f53cd" +version = "0.11.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" dependencies = [ "async-trait", "auto_impl", "ethereum-types", "flate2", + "getrandom", "log", "reqwest", "serde", "serde_json", - "serde_with", - "starknet-core 0.10.0", + "serde_with 3.9.0", + "starknet-core 0.11.1", "thiserror", "url", ] @@ -3294,42 +3467,69 @@ dependencies = [ "eth-keystore", "rand", "starknet-core 0.7.2", - "starknet-crypto", + "starknet-crypto 0.6.2", "thiserror", ] [[package]] name = "starknet-signers" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91919d8f318f0b5bcc4ff5849fbd3fb46adaaa72e0bf204742bab7c822425ff4" +checksum = "5e9a2bd4fd66090003c3b7f0d76476e5b63cd44f6a49ede2442673f4427d5a40" dependencies = [ "async-trait", "auto_impl", "crypto-bigint", "eth-keystore", "rand", - "starknet-core 0.8.0", - "starknet-crypto", + "starknet-core 0.10.0", + "starknet-crypto 0.6.2", "thiserror", ] [[package]] name = "starknet-signers" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a2bd4fd66090003c3b7f0d76476e5b63cd44f6a49ede2442673f4427d5a40" +version = "0.9.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs?rev=2ddc694#2ddc69479d326ed154df438d22f2d720fbba746e" dependencies = [ "async-trait", "auto_impl", "crypto-bigint", "eth-keystore", + "getrandom", "rand", - "starknet-core 0.10.0", - "starknet-crypto", + "starknet-core 0.11.1", + "starknet-crypto 0.7.1", "thiserror", ] +[[package]] +name = "starknet-types-core" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6bacf0ba19bc721e518bc4bf389ff13daa8a7c5db5fd320600473b8aa9fcbd" +dependencies = [ + "lambdaworks-crypto", + "lambdaworks-math", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "starknet-types-core" +version = "0.1.5" +source = "git+https://github.com/starknet-io/types-rs?rev=f98f048#f98f048efa776f1f8da81a19f337a9b8c2f4b8f7" +dependencies = [ + "lambdaworks-crypto", + "lambdaworks-math", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -3486,12 +3686,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -3506,10 +3707,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] @@ -3690,6 +3892,16 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.18" @@ -3700,12 +3912,15 @@ dependencies = [ "nu-ansi-term", "once_cell", "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log 0.2.0", + "tracing-serde", ] [[package]] diff --git a/crates/diri/Cargo.toml b/crates/diri/Cargo.toml index 093d45848..44c55cd2c 100644 --- a/crates/diri/Cargo.toml +++ b/crates/diri/Cargo.toml @@ -7,6 +7,13 @@ Diri is a library / binary related to the indexation of Solis data (orderbook smart contracts). """ +[lib] +path = "src/lib.rs" + +[[example]] +name = "display-events" +path = "examples/display-events.rs" + [dependencies] futures = "0.3.28" serde = { version = "1.0", features = ["derive"] } @@ -22,15 +29,19 @@ dotenv = "0.15.0" thiserror = "1.0.32" # For now, Diri can't use the ark-starknet due to the dependency # on ArkProjectNFTs for of starknet-rs. -starknet = "0.8.0" +starknet = { git = "https://github.com/xJonathanLEI/starknet-rs", rev = "2ddc694" } +starknet-types-core = { git = "https://github.com/starknet-io/types-rs", rev = "f98f048" } tracing = "0.1" num-bigint = "0.4.4" -num-traits = "0.2.17" +num-traits = "0.2.19" -cainome = { git = "https://github.com/cartridge-gg/cainome", tag = "v0.1.8", features = [ +cainome = { git = "https://github.com/cartridge-gg/cainome", tag = "v0.4.0", features = [ "abigen-rs", ] } anyhow.workspace = true async-trait.workspace = true tokio.workspace = true + +[dev-dependencies] +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/crates/diri/examples/display-events.rs b/crates/diri/examples/display-events.rs new file mode 100644 index 000000000..65ac7c812 --- /dev/null +++ b/crates/diri/examples/display-events.rs @@ -0,0 +1,198 @@ +use anyhow::Result; +use async_trait::async_trait; +use diri::event_handler::EventHandler; +use diri::storage::types::CancelledData; +use diri::storage::types::ExecutedData; +use diri::storage::types::FulfilledData; +use diri::storage::types::PlacedData; +use diri::storage::types::RollbackStatusData; +use diri::storage::Storage; +use diri::storage::StorageResult; +use diri::Diri; +use dotenv::dotenv; +use starknet::core::types::BlockId; +use starknet::providers::jsonrpc::HttpTransport; +use starknet::providers::AnyProvider; +use starknet::providers::JsonRpcClient; +use starknet::providers::Provider; +use url::Url; + +use std::{env, sync::Arc}; + +use tracing::{error, info, trace, warn}; +use tracing_subscriber::fmt; +use tracing_subscriber::EnvFilter; + +#[tokio::main] +async fn main() -> Result<()> { + dotenv().ok(); + + init_logging(); + + info!("Starting.....!"); + + let rpc_url = env::var("STARKNET_RPC").expect("STARKNET_RPC not set"); + let rpc_url_converted = Url::parse(&rpc_url).unwrap(); + + let provider = Arc::new(AnyProvider::JsonRpcHttp(JsonRpcClient::new( + HttpTransport::new(rpc_url_converted.clone()), + ))); + + // Quick launch locally: + // docker-compose up -d arkchain_postgres + // cd ark-sqlx + // sqlx database reset --database-url postgres://postgres:123@localhost:5432/arkchain-marketplace --source marketplace + let storage = FakeStorage {}; + let handler = DefaultEventHandler {}; + + let indexer = Arc::new(Diri::new( + provider.clone(), + Arc::new(storage), + Arc::new(handler), + )); + + let sleep_secs = 1; + let mut from = 0; + let range = 1; + + // Set to None to keep polling the head of chain. + let to = None; + + info!( + "Starting arkchain indexer: from:{} to:{:?} range:{}", + from, to, range, + ); + + loop { + let latest_block = match provider.block_number().await { + Ok(block_number) => block_number, + Err(e) => { + error!("Can't get arkchain block number: {}", e); + tokio::time::sleep(tokio::time::Duration::from_secs(sleep_secs)).await; + continue; + } + }; + + trace!("Latest block {latest_block} (from={from})"); + + let start = from; + let mut end = std::cmp::min(from + range, latest_block); + if let Some(to) = to { + if end > to { + end = to + } + } + + if start > end { + trace!("Nothing to fetch at block {start}"); + tokio::time::sleep(tokio::time::Duration::from_secs(sleep_secs)).await; + continue; + } + + trace!("Fetching blocks {start} - {end}"); + match indexer + .index_block_range(BlockId::Number(start), BlockId::Number(end)) + .await + { + Ok(_) => { + trace!("Blocks successfully indexed"); + + if let Some(to) = to { + if end >= to { + trace!("`to` block was reached, exit."); + return Ok(()); + } + } + + // +1 to not re-index the end block. + from = end + 1; + } + Err(e) => { + error!("Blocks indexing error: {}", e); + + // TODO: for now, any failure on the block range, we skip it. + // Can be changed as needed. + warn!("Skipping blocks range: {} - {}", start, end); + from = end + 1; + } + }; + + tokio::time::sleep(tokio::time::Duration::from_secs(sleep_secs)).await; + } +} + +/// Initializes the logging, ensuring that the `RUST_LOG` environment +/// variable is always considered first. +fn init_logging() { + const DEFAULT_LOG_FILTER: &str = "info,diri=trace"; + + tracing::subscriber::set_global_default( + fmt::Subscriber::builder() + .with_env_filter( + EnvFilter::try_from_default_env() + .or(EnvFilter::try_new(DEFAULT_LOG_FILTER)) + .expect("Invalid RUST_LOG filters"), + ) + .finish(), + ) + .expect("Failed to set the global tracing subscriber"); +} + +struct FakeStorage; + +#[async_trait] +impl Storage for FakeStorage { + async fn register_placed( + &self, + block_id: u64, + block_timestamp: u64, + order: &PlacedData, + ) -> StorageResult<()> { + Ok(()) + } + + async fn register_cancelled( + &self, + block_id: u64, + block_timestamp: u64, + order: &CancelledData, + ) -> StorageResult<()> { + Ok(()) + } + + async fn register_fulfilled( + &self, + block_id: u64, + block_timestamp: u64, + order: &FulfilledData, + ) -> StorageResult<()> { + Ok(()) + } + + async fn register_executed( + &self, + block_id: u64, + block_timestamp: u64, + order: &ExecutedData, + ) -> StorageResult<()> { + Ok(()) + } + + async fn status_back_to_open( + &self, + block_id: u64, + block_timestamp: u64, + order: &RollbackStatusData, + ) -> StorageResult<()> { + Ok(()) + } +} + +struct DefaultEventHandler; + +#[async_trait] +impl EventHandler for DefaultEventHandler { + async fn on_block_processed(&self, block_number: u64) { + info!("event: block processed {:?}", block_number); + } +} diff --git a/crates/diri/src/lib.rs b/crates/diri/src/lib.rs index 661d41420..971ef21c2 100644 --- a/crates/diri/src/lib.rs +++ b/crates/diri/src/lib.rs @@ -7,7 +7,7 @@ use event_handler::EventHandler; mod orderbook; use starknet::core::types::{ - BlockId, EmittedEvent, EventFilter, FieldElement, MaybePendingBlockWithTxHashes, + BlockId, EmittedEvent, EventFilter, Felt, MaybePendingBlockWithTxHashes, }; use starknet::macros::selector; use starknet::providers::{AnyProvider, Provider, ProviderError}; @@ -80,6 +80,7 @@ impl Diri { let block_timestamp = self.block_time(BlockId::Number(block_number)).await?; for any_event in events { + trace!("Event: {:?}", any_event.clone()); let orderbook_event: Event = match any_event.try_into() { Ok(ev) => ev, Err(e) => { @@ -119,7 +120,9 @@ impl Diri { .status_back_to_open(block_number, block_timestamp, &ev.into()) .await?; } - _ => warn!("Orderbook event not handled: {:?}", orderbook_event), + _ => { + warn!("Orderbook event not handled: {:?}", orderbook_event) + } }; } @@ -145,7 +148,7 @@ impl Diri { &self, from_block: BlockId, to_block: BlockId, - keys: Option>>, + keys: Option>>, ) -> Result>, IndexerError> { // TODO: setup key filtering here. @@ -169,7 +172,7 @@ impl Diri { event_page.events.iter().for_each(|e| { events - .entry(e.block_number) + .entry(e.block_number.unwrap()) .and_modify(|v| v.push(e.clone())) .or_insert(vec![e.clone()]); }); diff --git a/crates/diri/src/mod.rs b/crates/diri/src/mod.rs new file mode 100644 index 000000000..959ef2db9 --- /dev/null +++ b/crates/diri/src/mod.rs @@ -0,0 +1 @@ +mod orderbook; diff --git a/crates/diri/src/orderbook.rs b/crates/diri/src/orderbook.rs deleted file mode 100644 index 52d5a302f..000000000 --- a/crates/diri/src/orderbook.rs +++ /dev/null @@ -1,136 +0,0 @@ -use cainome::rs::abigen; -use starknet::{ - core::types::{EmittedEvent, FieldElement}, - macros::selector, -}; - -// TODO: check a way to fix the path... because when compiled from -// ark-services, the path is not valid as it's relative to Cargo manifest file. -abigen!( - Orderbook, - "./artifacts/orderbook.abi.json", - type_aliases { - ark_orderbook::orderbook::orderbook::Event as EventV0; - ark_orderbook::orderbook::orderbook::OrderExecuted as OrderExecutedV0; - } -); - -abigen!( - OrderBook, - r#" - [ - { - "type": "event", - "name": "ark_orderbook::orderbook::orderbook::Event", - "kind": "enum", - "variants": [ - { - "name": "OrderExecuted", - "type": "ark_orderbook::orderbook::orderbook::OrderExecuted", - "kind": "nested" - } - ] - }, - { - "type": "event", - "name": "ark_orderbook::orderbook::orderbook::OrderExecuted", - "kind": "struct", - "members": [ - { - "name": "order_hash", - "type": "core::felt252", - "kind": "key" - }, - { - "name": "order_status", - "type": "ark_common::protocol::order_types::OrderStatus", - "kind": "key" - }, - { - "name": "version", - "type": "core::integer::u8", - "kind": "data" - }, - { - "name": "transaction_hash", - "type": "core::felt252", - "kind": "data" - }, - { - "name": "from", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - }, - { - "name": "to", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - } - ] - } - ] - "# -, type_aliases { - ark_orderbook::orderbook::orderbook::Event as EventV1; - ark_orderbook::orderbook::orderbook::OrderExecuted as OrderExecutedV1; - } -); - -#[derive(Debug)] -pub(crate) enum OrderExecuted { - V0(OrderExecutedV0), - V1(OrderExecutedV1), -} - -#[derive(Debug)] -pub(crate) enum Event { - OrderPlaced(OrderPlaced), - OrderExecuted(OrderExecuted), - OrderCancelled(OrderCancelled), - RollbackStatus(RollbackStatus), - OrderFulfilled(OrderFulfilled), - Upgraded(Upgraded), - Unknown, -} - -impl From for Event { - fn from(ev: EmittedEvent) -> Self { - if ev.keys[0] == selector!("OrderExecuted") { - if ev.data.len() > 0 { - let version = ev.data[0]; - if version == FieldElement::ONE {} - // Version 1 - TryInto::::try_into(ev).unwrap().into() - } else { - // Version 0 - TryInto::::try_into(ev).unwrap().into() - } - } else { - match TryInto::::try_into(ev) { - Ok(ev) => ev.into(), - Err(_) => Event::Unknown, - } - } - } -} - -impl From for Event { - fn from(ev: EventV0) -> Self { - match ev { - EventV0::OrderCancelled(ev) => Event::OrderCancelled(ev), - EventV0::OrderPlaced(ev) => Event::OrderPlaced(ev), - EventV0::OrderFulfilled(ev) => Event::OrderFulfilled(ev), - EventV0::RollbackStatus(ev) => Event::RollbackStatus(ev), - EventV0::Upgraded(ev) => Event::Upgraded(ev), - EventV0::OrderExecuted(ev) => Event::OrderExecuted(OrderExecuted::V0(ev)), - } - } -} - -impl From for Event { - fn from(ev: EventV1) -> Self { - match ev { - EventV1::OrderExecuted(ev) => Event::OrderExecuted(OrderExecuted::V1(ev)), - } - } -} diff --git a/crates/diri/src/orderbook/events/mod.rs b/crates/diri/src/orderbook/events/mod.rs new file mode 100644 index 000000000..27b89813e --- /dev/null +++ b/crates/diri/src/orderbook/events/mod.rs @@ -0,0 +1,29 @@ +pub(crate) mod order_cancelled; +pub(crate) mod order_executed; +pub(crate) mod order_fulfilled; +pub(crate) mod order_placed; +pub(crate) mod rollback_status; + +pub(crate) use order_cancelled::OrderCancelled; +pub(crate) use order_executed::OrderExecuted; +pub(crate) use order_fulfilled::OrderFulfilled; +pub(crate) use order_placed::OrderPlaced; +pub(crate) use rollback_status::RollbackStatus; + +pub(crate) use cainome::cairo_serde::U256; +use starknet::{core::types::Felt, macros::selector}; + +#[derive(Debug)] +pub(crate) enum OrderbookParseError { + Selector, + KeyLength, + DataLength, + UnsupportedVersion, + UnknownError, +} + +pub const ORDER_CANCELLED_SELECTOR: Felt = selector!("OrderCancelled"); +pub const ORDER_EXECUTED_SELECTOR: Felt = selector!("OrderExecuted"); +pub const ORDER_FULFILLED_SELECTOR: Felt = selector!("OrderFulfilled"); +pub const ORDER_PLACED_SELECTOR: Felt = selector!("OrderPlaced"); +pub const ROLLBACK_STATUS_SELECTOR: Felt = selector!("RollbackStatus"); diff --git a/crates/diri/src/orderbook/events/order_cancelled.rs b/crates/diri/src/orderbook/events/order_cancelled.rs new file mode 100644 index 000000000..c26838630 --- /dev/null +++ b/crates/diri/src/orderbook/events/order_cancelled.rs @@ -0,0 +1,108 @@ +use cainome::rs::abigen; +use starknet::core::types::{EmittedEvent, Felt}; + +use super::{OrderbookParseError, ORDER_CANCELLED_SELECTOR}; + +abigen!( + V1, + r#" + [ + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderType", + "variants": [ + { + "name": "Listing", + "type": "()" + }, + { + "name": "Auction", + "type": "()" + }, + { + "name": "Offer", + "type": "()" + }, + { + "name": "CollectionOffer", + "type": "()" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::Event", + "kind": "enum", + "variants": [ + { + "name": "OrderCancelled", + "type": "ark_component::orderbook::orderbook::OrderbookComponent::OrderCancelled", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::OrderCancelled", + "kind": "struct", + "members": [ + { + "name": "order_hash", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "reason", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "order_type", + "type": "ark_common::protocol::order_types::OrderType", + "kind": "key" + }, + { + "name": "version", + "type": "core::integer::u8", + "kind": "data" + } + ] + } + ]"#, + type_aliases { + ark_component::orderbook::orderbook::OrderbookComponent::Event as EventV1; + ark_component::orderbook::orderbook::OrderbookComponent::OrderCancelled as OrderCancelledV1; + }, + derives(Debug), +); + +#[derive(Debug)] +pub(crate) enum OrderCancelled { + V1(OrderCancelledV1), +} + +impl TryFrom for OrderCancelled { + type Error = OrderbookParseError; + + fn try_from(ev: EmittedEvent) -> Result { + if ev.keys[0] == ORDER_CANCELLED_SELECTOR { + if !ev.data.is_empty() { + let version = ev.data[0]; + if version == Felt::ONE { + match TryInto::::try_into(ev) { + Ok(event) => match event { + EventV1::OrderCancelled(ev) => return Ok(OrderCancelled::V1(ev)), + }, + Err(_) => return Err(OrderbookParseError::UnknownError), + } + } + Err(OrderbookParseError::UnsupportedVersion) + } else { + // Old version + Err(OrderbookParseError::UnknownError) + } + } else { + Err(OrderbookParseError::Selector) + } + } +} diff --git a/crates/diri/src/orderbook/events/order_executed.rs b/crates/diri/src/orderbook/events/order_executed.rs new file mode 100644 index 000000000..eca734777 --- /dev/null +++ b/crates/diri/src/orderbook/events/order_executed.rs @@ -0,0 +1,371 @@ +use cainome::rs::abigen; +use starknet::core::types::{EmittedEvent, Felt}; + +use super::{OrderbookParseError, ORDER_EXECUTED_SELECTOR}; + +abigen!( + V0, + r#" + [ + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderStatus", + "variants": [ + { + "name": "Open", + "type": "()" + }, + { + "name": "Fulfilled", + "type": "()" + }, + { + "name": "Executed", + "type": "()" + }, + { + "name": "CancelledUser", + "type": "()" + }, + { + "name": "CancelledByNewOrder", + "type": "()" + }, + { + "name": "CancelledAssetFault", + "type": "()" + }, + { + "name": "CancelledOwnership", + "type": "()" + } + ] + }, + { + "type": "event", + "name": "ark_orderbook::orderbook::orderbook::Event", + "kind": "enum", + "variants": [ + { + "name": "OrderExecuted", + "type": "ark_orderbook::orderbook::orderbook::OrderExecuted", + "kind": "nested" + } + ] +}, + { + "type": "event", + "name": "ark_orderbook::orderbook::orderbook::OrderExecuted", + "kind": "struct", + "members": [ + { + "name": "order_hash", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "order_status", + "type": "ark_common::protocol::order_types::OrderStatus", + "kind": "key" + } + ] + } + ] + "# + , type_aliases { + ark_common::protocol::order_types::OrderStatus as OrderStatusV0; + ark_orderbook::orderbook::orderbook::Event as EventV0; + ark_orderbook::orderbook::orderbook::OrderExecuted as OrderExecutedV0; + }, + derives(Debug) +); + +abigen!( + V1, + r#" + [ + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderStatus", + "variants": [ + { + "name": "Open", + "type": "()" + }, + { + "name": "Fulfilled", + "type": "()" + }, + { + "name": "Executed", + "type": "()" + }, + { + "name": "CancelledUser", + "type": "()" + }, + { + "name": "CancelledByNewOrder", + "type": "()" + }, + { + "name": "CancelledAssetFault", + "type": "()" + }, + { + "name": "CancelledOwnership", + "type": "()" + } + ] +}, + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderType", + "variants": [ + { + "name": "Listing", + "type": "()" + }, + { + "name": "Auction", + "type": "()" + }, + { + "name": "Offer", + "type": "()" + }, + { + "name": "CollectionOffer", + "type": "()" + } + ] +}, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::Event", + "kind": "enum", + "variants": [ + { + "name": "OrderExecuted", + "type": "ark_component::orderbook::orderbook::OrderbookComponent::OrderExecuted", + "kind": "nested" + } + ] +}, +{ + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::OrderExecuted", + "kind": "struct", + "members": [ + { + "name": "order_hash", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "order_status", + "type": "ark_common::protocol::order_types::OrderStatus", + "kind": "key" + }, + { + "name": "version", + "type": "core::integer::u8", + "kind": "data" + }, + { + "name": "transaction_hash", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "from", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "to", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] +} +] +"# +, type_aliases { + ark_common::protocol::order_types::OrderStatus as OrderStatusV1; + ark_component::orderbook::orderbook::OrderbookComponent::Event as EventV1; + ark_component::orderbook::orderbook::OrderbookComponent::OrderExecuted as OrderExecutedV1; +}, +derives(Debug) +); + +abigen!( + V2, + r#" + [ + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderStatus", + "variants": [ + { + "name": "Open", + "type": "()" + }, + { + "name": "Fulfilled", + "type": "()" + }, + { + "name": "Executed", + "type": "()" + }, + { + "name": "CancelledUser", + "type": "()" + }, + { + "name": "CancelledByNewOrder", + "type": "()" + }, + { + "name": "CancelledAssetFault", + "type": "()" + }, + { + "name": "CancelledOwnership", + "type": "()" + } + ] + }, + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderType", + "variants": [ + { + "name": "Listing", + "type": "()" + }, + { + "name": "Auction", + "type": "()" + }, + { + "name": "Offer", + "type": "()" + }, + { + "name": "CollectionOffer", + "type": "()" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::Event", + "kind": "enum", + "variants": [ + { + "name": "OrderExecuted", + "type": "ark_component::orderbook::orderbook::OrderbookComponent::OrderExecuted", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::OrderExecuted", + "kind": "struct", + "members": [ + { + "name": "order_hash", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "order_status", + "type": "ark_common::protocol::order_types::OrderStatus", + "kind": "key" + }, + { + "name": "order_type", + "type": "ark_common::protocol::order_types::OrderType", + "kind": "key" + }, + { + "name": "version", + "type": "core::integer::u8", + "kind": "data" + }, + { + "name": "transaction_hash", + "type": "core::felt252", + "kind": "data" + }, + { + "name": "from", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "to", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + } + ] + "# +, type_aliases { + ark_common::protocol::order_types::OrderStatus as OrderStatusV2; + ark_common::protocol::order_types::OrderType as OrderTypeV2; + ark_component::orderbook::orderbook::OrderbookComponent::Event as EventV2; + ark_component::orderbook::orderbook::OrderbookComponent::OrderExecuted as OrderExecutedV2; + }, + derives(Debug) +); + +#[derive(Debug)] +pub(crate) enum OrderExecuted { + V0(OrderExecutedV0), + V1(OrderExecutedV1), + V2(OrderExecutedV2), +} + +impl TryFrom for OrderExecuted { + type Error = OrderbookParseError; + + fn try_from(ev: EmittedEvent) -> Result { + if ev.keys[0] == ORDER_EXECUTED_SELECTOR { + if !ev.data.is_empty() { + let version = ev.data[0]; + if version == Felt::ONE { + match TryInto::::try_into(ev) { + Ok(event) => match event { + EventV1::OrderExecuted(ev) => Ok(OrderExecuted::V1(ev)), + }, + Err(_) => Err(OrderbookParseError::UnknownError), + } + } else if version == Felt::TWO { + match TryInto::::try_into(ev) { + Ok(event) => match event { + EventV2::OrderExecuted(ev) => Ok(OrderExecuted::V2(ev)), + }, + Err(_) => Err(OrderbookParseError::UnknownError), + } + } else { + Err(OrderbookParseError::UnsupportedVersion) + } + } else { + // version 0 + match TryInto::::try_into(ev) { + Ok(event) => match event { + EventV0::OrderExecuted(ev) => Ok(OrderExecuted::V0(ev)), + }, + Err(_) => Err(OrderbookParseError::UnknownError), + } + } + } else { + Err(OrderbookParseError::Selector) + } + } +} diff --git a/crates/diri/src/orderbook/events/order_fulfilled.rs b/crates/diri/src/orderbook/events/order_fulfilled.rs new file mode 100644 index 000000000..167789c11 --- /dev/null +++ b/crates/diri/src/orderbook/events/order_fulfilled.rs @@ -0,0 +1,113 @@ +use cainome::rs::abigen; +use starknet::core::types::{EmittedEvent, Felt}; + +use super::{OrderbookParseError, ORDER_FULFILLED_SELECTOR}; + +abigen!( + V1, + r#" + [ + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderType", + "variants": [ + { + "name": "Listing", + "type": "()" + }, + { + "name": "Auction", + "type": "()" + }, + { + "name": "Offer", + "type": "()" + }, + { + "name": "CollectionOffer", + "type": "()" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::Event", + "kind": "enum", + "variants": [ + { + "name": "OrderFulfilled", + "type": "ark_component::orderbook::orderbook::OrderbookComponent::OrderFulfilled", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::OrderFulfilled", + "kind": "struct", + "members": [ + { + "name": "order_hash", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "fulfiller", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "key" + }, + { + "name": "related_order_hash", + "type": "core::option::Option::", + "kind": "key" + }, + { + "name": "order_type", + "type": "ark_common::protocol::order_types::OrderType", + "kind": "key" + }, + { + "name": "version", + "type": "core::integer::u8", + "kind": "data" + } + ] + } + ] + "#, + type_aliases { + ark_component::orderbook::orderbook::OrderbookComponent::Event as EventV1; + ark_component::orderbook::orderbook::OrderbookComponent::OrderFulfilled as OrderFulfilledV1; + }, + derives(Debug), +); + +#[derive(Debug)] +pub(crate) enum OrderFulfilled { + V1(OrderFulfilledV1), +} + +impl TryFrom for OrderFulfilled { + type Error = OrderbookParseError; + + fn try_from(ev: EmittedEvent) -> Result { + if ev.keys[0] == ORDER_FULFILLED_SELECTOR { + if !ev.data.is_empty() { + let version = ev.data[0]; + if version == Felt::ONE { + match TryInto::::try_into(ev) { + Ok(event) => match event { + EventV1::OrderFulfilled(ev) => return Ok(OrderFulfilled::V1(ev)), + }, + Err(_) => return Err(OrderbookParseError::UnknownError), + }; + } + Err(OrderbookParseError::UnsupportedVersion) + } else { + Err(OrderbookParseError::UnknownError) + } + } else { + Err(OrderbookParseError::Selector) + } + } +} diff --git a/crates/diri/src/orderbook/events/order_placed.rs b/crates/diri/src/orderbook/events/order_placed.rs new file mode 100644 index 000000000..3c9817245 --- /dev/null +++ b/crates/diri/src/orderbook/events/order_placed.rs @@ -0,0 +1,200 @@ +use cainome::rs::abigen; +use starknet::core::types::{EmittedEvent, Felt}; + +use super::{OrderbookParseError, ORDER_PLACED_SELECTOR}; + +abigen!( + V1, + r#" + [ + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderType", + "variants": [ + { + "name": "Listing", + "type": "()" + }, + { + "name": "Auction", + "type": "()" + }, + { + "name": "Offer", + "type": "()" + }, + { + "name": "CollectionOffer", + "type": "()" + } + ] + }, + { + "type": "enum", + "name": "ark_common::protocol::order_types::RouteType", + "variants": [ + { + "name": "Erc20ToErc721", + "type": "()" + }, + { + "name": "Erc721ToErc20", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "ark_common::protocol::order_v1::OrderV1", + "members": [ + { + "name": "route", + "type": "ark_common::protocol::order_types::RouteType" + }, + { + "name": "currency_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "currency_chain_id", + "type": "core::felt252" + }, + { + "name": "salt", + "type": "core::felt252" + }, + { + "name": "offerer", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token_chain_id", + "type": "core::felt252" + }, + { + "name": "token_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token_id", + "type": "core::option::Option::" + }, + { + "name": "quantity", + "type": "core::integer::u256" + }, + { + "name": "start_amount", + "type": "core::integer::u256" + }, + { + "name": "end_amount", + "type": "core::integer::u256" + }, + { + "name": "start_date", + "type": "core::integer::u64" + }, + { + "name": "end_date", + "type": "core::integer::u64" + }, + { + "name": "broker_id", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "additional_data", + "type": "core::array::Span::" + } + ] + }, + + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::Event", + "kind": "enum", + "variants": [ + { + "name": "OrderPlaced", + "type": "ark_component::orderbook::orderbook::OrderbookComponent::OrderPlaced", + "kind": "nested" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::OrderPlaced", + "kind": "struct", + "members": [ + { + "name": "order_hash", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "order_version", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "order_type", + "type": "ark_common::protocol::order_types::OrderType", + "kind": "key" + }, + { + "name": "version", + "type": "core::integer::u8", + "kind": "data" + }, + { + "name": "cancelled_order_hash", + "type": "core::option::Option::", + "kind": "data" + }, + { + "name": "order", + "type": "ark_common::protocol::order_v1::OrderV1", + "kind": "data" + } + ] + } + ] + "#, + type_aliases { + ark_component::orderbook::orderbook::OrderbookComponent::Event as EventV1; + ark_component::orderbook::orderbook::OrderbookComponent::OrderPlaced as OrderPlacedV1; + }, + derives(Debug), +); + +#[derive(Debug)] +pub(crate) enum OrderPlaced { + V1(OrderPlacedV1), +} + +impl TryFrom for OrderPlaced { + type Error = OrderbookParseError; + + fn try_from(ev: EmittedEvent) -> Result { + if ev.keys[0] == ORDER_PLACED_SELECTOR { + if ev.data.len() > 2 { + let version = ev.data[0]; + if version == Felt::ONE { + match TryInto::::try_into(ev) { + Ok(event) => match event { + EventV1::OrderPlaced(ev) => return Ok(OrderPlaced::V1(ev)), + }, + Err(_) => return Err(OrderbookParseError::UnknownError), + } + } + Err(OrderbookParseError::UnsupportedVersion) + } else { + // Old version + Err(OrderbookParseError::UnknownError) + } + } else { + Err(OrderbookParseError::Selector) + } + } +} diff --git a/crates/diri/src/orderbook/events/rollback_status.rs b/crates/diri/src/orderbook/events/rollback_status.rs new file mode 100644 index 000000000..b66ae599a --- /dev/null +++ b/crates/diri/src/orderbook/events/rollback_status.rs @@ -0,0 +1,109 @@ +use cainome::rs::abigen; +use starknet::core::types::{EmittedEvent, Felt}; + +use super::{OrderbookParseError, ROLLBACK_STATUS_SELECTOR}; + +abigen!( + V1, + r#" + [ + { + "type": "enum", + "name": "ark_common::protocol::order_types::OrderType", + "variants": [ + { + "name": "Listing", + "type": "()" + }, + { + "name": "Auction", + "type": "()" + }, + { + "name": "Offer", + "type": "()" + }, + { + "name": "CollectionOffer", + "type": "()" + } + ] + }, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::Event", + "kind": "enum", + "variants": [ + { + "name": "RollbackStatus", + "type": "ark_component::orderbook::orderbook::OrderbookComponent::RollbackStatus", + "kind": "nested" + } + ] +}, + { + "type": "event", + "name": "ark_component::orderbook::orderbook::OrderbookComponent::RollbackStatus", + "kind": "struct", + "members": [ + { + "name": "order_hash", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "reason", + "type": "core::felt252", + "kind": "key" + }, + { + "name": "order_type", + "type": "ark_common::protocol::order_types::OrderType", + "kind": "key" + }, + { + "name": "version", + "type": "core::integer::u8", + "kind": "data" + } + ] +} + ] + "#, + type_aliases { + ark_component::orderbook::orderbook::OrderbookComponent::Event as EventV1; + ark_component::orderbook::orderbook::OrderbookComponent::RollbackStatus as RollbackStatusV1; + }, + derives(Debug), +); + +#[derive(Debug)] +pub(crate) enum RollbackStatus { + V1(RollbackStatusV1), +} + +impl TryFrom for RollbackStatus { + type Error = OrderbookParseError; + + fn try_from(ev: EmittedEvent) -> Result { + if ev.keys[0] == ROLLBACK_STATUS_SELECTOR { + if ev.data.len() > 2 { + let version = ev.data[0]; + if version == Felt::ONE { + match TryInto::::try_into(ev) { + Ok(event) => match event { + EventV1::RollbackStatus(ev) => return Ok(RollbackStatus::V1(ev)), + }, + Err(_) => return Err(OrderbookParseError::UnknownError), + } + } + Err(OrderbookParseError::UnsupportedVersion) + } else { + // Old version + Err(OrderbookParseError::UnknownError) + } + } else { + Err(OrderbookParseError::Selector) + } + } +} diff --git a/crates/diri/src/orderbook/mod.rs b/crates/diri/src/orderbook/mod.rs new file mode 100644 index 000000000..cf1fbd40b --- /dev/null +++ b/crates/diri/src/orderbook/mod.rs @@ -0,0 +1,45 @@ +use events::{ + OrderCancelled, OrderExecuted, OrderFulfilled, OrderPlaced, RollbackStatus, + ORDER_CANCELLED_SELECTOR, ORDER_EXECUTED_SELECTOR, ORDER_FULFILLED_SELECTOR, + ORDER_PLACED_SELECTOR, +}; +use starknet::core::types::EmittedEvent; + +pub(crate) mod events; + +#[derive(Debug)] +pub(crate) enum Event { + OrderPlaced(OrderPlaced), + OrderExecuted(OrderExecuted), + OrderCancelled(OrderCancelled), + RollbackStatus(RollbackStatus), + OrderFulfilled(OrderFulfilled), + Unknown, +} + +impl From for Event { + fn from(ev: EmittedEvent) -> Self { + match ev.keys[0] { + key if key == ORDER_CANCELLED_SELECTOR => match TryInto::::try_into(ev) + { + Ok(ev) => Event::OrderCancelled(ev), + Err(_) => Event::Unknown, + }, + key if key == ORDER_EXECUTED_SELECTOR => match TryInto::::try_into(ev) { + Ok(ev) => Event::OrderExecuted(ev), + Err(_) => Event::Unknown, + }, + + key if key == ORDER_FULFILLED_SELECTOR => match TryInto::::try_into(ev) + { + Ok(ev) => Event::OrderFulfilled(ev), + Err(_) => Event::Unknown, + }, + key if key == ORDER_PLACED_SELECTOR => match TryInto::::try_into(ev) { + Ok(ev) => Event::OrderPlaced(ev), + Err(_) => Event::Unknown, + }, + _ => Event::Unknown, + } + } +} diff --git a/crates/diri/src/storage/types.rs b/crates/diri/src/storage/types.rs index 030591954..e7797c143 100644 --- a/crates/diri/src/storage/types.rs +++ b/crates/diri/src/storage/types.rs @@ -1,10 +1,10 @@ use num_bigint::BigUint; -use starknet::core::types::FieldElement; +use starknet::core::types::Felt; use starknet::core::utils::parse_cairo_short_string; use std::fmt::LowerHex; -use crate::orderbook::{ +use crate::orderbook::events::{ OrderCancelled, OrderExecuted, OrderFulfilled, OrderPlaced, RollbackStatus, U256, }; @@ -33,25 +33,27 @@ pub struct PlacedData { impl From for PlacedData { fn from(value: OrderPlaced) -> Self { - Self { - order_hash: to_hex_str(&value.order_hash), - order_version: to_hex_str(&value.order_version), - order_type: format!("{:?}", value.order_type), - cancelled_order_hash: to_hex_str_opt(&value.cancelled_order_hash), - route: format!("{:?}", value.order.route), - currency_address: to_hex_str(&FieldElement::from(value.order.currency_address)), - currency_chain_id: to_hex_str(&value.order.currency_chain_id), - salt: to_hex_str(&value.order.salt), - offerer: to_hex_str(&FieldElement::from(value.order.offerer)), - token_chain_id: format!("0x{:x}", value.order.token_chain_id), - token_address: to_hex_str(&FieldElement::from(value.order.token_address)), - token_id: u256_to_hex_opt(&value.order.token_id), - quantity: u256_to_hex(&value.order.quantity), - start_amount: u256_to_hex(&value.order.start_amount), - end_amount: u256_to_hex(&value.order.end_amount), - start_date: value.order.start_date, - end_date: value.order.end_date, - broker_id: to_hex_str(&FieldElement::from(value.order.broker_id)), + match value { + OrderPlaced::V1(value) => Self { + order_hash: to_hex_str(&value.order_hash), + order_version: to_hex_str(&value.order_version), + order_type: format!("{:?}", value.order_type), + cancelled_order_hash: to_hex_str_opt(&value.cancelled_order_hash), + route: format!("{:?}", value.order.route), + currency_address: to_hex_str(&Felt::from(value.order.currency_address)), + currency_chain_id: to_hex_str(&value.order.currency_chain_id), + salt: to_hex_str(&value.order.salt), + offerer: to_hex_str(&Felt::from(value.order.offerer)), + token_chain_id: format!("0x{:x}", value.order.token_chain_id), + token_address: to_hex_str(&Felt::from(value.order.token_address)), + token_id: u256_to_hex_opt(&value.order.token_id), + quantity: u256_to_hex(&value.order.quantity), + start_amount: u256_to_hex(&value.order.start_amount), + end_amount: u256_to_hex(&value.order.end_amount), + start_date: value.order.start_date, + end_date: value.order.end_date, + broker_id: to_hex_str(&Felt::from(value.order.broker_id)), + }, } } } @@ -64,9 +66,12 @@ pub struct CancelledData { impl From for CancelledData { fn from(value: OrderCancelled) -> Self { - Self { - order_hash: to_hex_str(&value.order_hash), - reason: parse_cairo_short_string(&value.reason).unwrap_or(to_hex_str(&value.reason)), + match value { + OrderCancelled::V1(value) => Self { + order_hash: to_hex_str(&value.order_hash), + reason: parse_cairo_short_string(&value.reason) + .unwrap_or(to_hex_str(&value.reason)), + }, } } } @@ -79,9 +84,12 @@ pub struct RollbackStatusData { impl From for RollbackStatusData { fn from(value: RollbackStatus) -> Self { - Self { - order_hash: to_hex_str(&value.order_hash), - reason: parse_cairo_short_string(&value.reason).unwrap_or(to_hex_str(&value.reason)), + match value { + RollbackStatus::V1(value) => Self { + order_hash: to_hex_str(&value.order_hash), + reason: parse_cairo_short_string(&value.reason) + .unwrap_or(to_hex_str(&value.reason)), + }, } } } @@ -95,12 +103,16 @@ pub struct FulfilledData { impl From for FulfilledData { fn from(value: OrderFulfilled) -> Self { - let related_order_hash = value.related_order_hash.map(FieldElement::from); - - Self { - order_hash: to_hex_str(&value.order_hash), - fulfiller: to_hex_str(&FieldElement::from(value.fulfiller)), - related_order_hash: to_hex_str_opt(&related_order_hash), + match value { + OrderFulfilled::V1(value) => { + let related_order_hash = value.related_order_hash.map(Felt::from); + + Self { + order_hash: to_hex_str(&value.order_hash), + fulfiller: to_hex_str(&Felt::from(value.fulfiller)), + related_order_hash: to_hex_str_opt(&related_order_hash), + } + } } } } @@ -127,9 +139,16 @@ impl From for ExecutedData { OrderExecuted::V1(v) => Self { version: 1, order_hash: to_hex_str(&v.order_hash), - transaction_hash: Some(to_hex_str(&FieldElement::from(v.transaction_hash))), - from: Some(to_hex_str(&FieldElement::from(v.from))), - to: Some(to_hex_str(&FieldElement::from(v.to))), + transaction_hash: Some(to_hex_str(&v.transaction_hash)), + from: Some(to_hex_str(&Felt::from(v.from))), + to: Some(to_hex_str(&Felt::from(v.to))), + }, + OrderExecuted::V2(v) => Self { + version: 1, + order_hash: to_hex_str(&v.order_hash), + transaction_hash: Some(to_hex_str(&v.transaction_hash)), + from: Some(to_hex_str(&Felt::from(v.from))), + to: Some(to_hex_str(&Felt::from(v.to))), }, } } From 8a110e0ab3509927e088ff564993a683e80f8c90 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Fri, 23 Aug 2024 09:40:10 +0200 Subject: [PATCH 19/33] fix(diri): ensure events are handled sorted by block number --- crates/diri/src/lib.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/crates/diri/src/lib.rs b/crates/diri/src/lib.rs index 971ef21c2..f215eebda 100644 --- a/crates/diri/src/lib.rs +++ b/crates/diri/src/lib.rs @@ -76,12 +76,15 @@ impl Diri { ) .await?; - for (block_number, events) in blocks_events { - let block_timestamp = self.block_time(BlockId::Number(block_number)).await?; + // Handle events sorted by block number + let mut block_numbers: Vec<&u64> = blocks_events.keys().collect(); + block_numbers.sort(); + for block_number in block_numbers { + let block_timestamp = self.block_time(BlockId::Number(*block_number)).await?; + let events = blocks_events.get(block_number).unwrap(); for any_event in events { - trace!("Event: {:?}", any_event.clone()); - let orderbook_event: Event = match any_event.try_into() { + let orderbook_event: Event = match any_event.clone().try_into() { Ok(ev) => ev, Err(e) => { trace!("Event can't be deserialized: {e}"); @@ -93,31 +96,31 @@ impl Diri { Event::OrderPlaced(ev) => { trace!("OrderPlaced found: {:?}", ev); self.storage - .register_placed(block_number, block_timestamp, &ev.into()) + .register_placed(*block_number, block_timestamp, &ev.into()) .await?; } Event::OrderCancelled(ev) => { trace!("OrderCancelled found: {:?}", ev); self.storage - .register_cancelled(block_number, block_timestamp, &ev.into()) + .register_cancelled(*block_number, block_timestamp, &ev.into()) .await?; } Event::OrderFulfilled(ev) => { trace!("OrderFulfilled found: {:?}", ev); self.storage - .register_fulfilled(block_number, block_timestamp, &ev.into()) + .register_fulfilled(*block_number, block_timestamp, &ev.into()) .await?; } Event::OrderExecuted(ev) => { trace!("OrderExecuted found: {:?}", ev); self.storage - .register_executed(block_number, block_timestamp, &ev.into()) + .register_executed(*block_number, block_timestamp, &ev.into()) .await?; } Event::RollbackStatus(ev) => { trace!("RollbackStatus found: {:?}", ev); self.storage - .status_back_to_open(block_number, block_timestamp, &ev.into()) + .status_back_to_open(*block_number, block_timestamp, &ev.into()) .await?; } _ => { @@ -126,7 +129,7 @@ impl Diri { }; } - self.event_handler.on_block_processed(block_number).await; + self.event_handler.on_block_processed(*block_number).await; } Ok(()) From 3df7dcc8fe91bbb4a45b6d7c0db8bb13b9318093 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Fri, 20 Sep 2024 01:07:59 +0200 Subject: [PATCH 20/33] feat(diri): add BLOCK_START, BLOCK_END, BLOCK_RANGE and SLEEP_PERIOD environment variables support --- crates/diri/examples/display-events.rs | 36 ++++++++++++++++++-------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/crates/diri/examples/display-events.rs b/crates/diri/examples/display-events.rs index 65ac7c812..bb2606a1e 100644 --- a/crates/diri/examples/display-events.rs +++ b/crates/diri/examples/display-events.rs @@ -38,10 +38,6 @@ async fn main() -> Result<()> { HttpTransport::new(rpc_url_converted.clone()), ))); - // Quick launch locally: - // docker-compose up -d arkchain_postgres - // cd ark-sqlx - // sqlx database reset --database-url postgres://postgres:123@localhost:5432/arkchain-marketplace --source marketplace let storage = FakeStorage {}; let handler = DefaultEventHandler {}; @@ -51,12 +47,30 @@ async fn main() -> Result<()> { Arc::new(handler), )); - let sleep_secs = 1; - let mut from = 0; - let range = 1; + let sleep_msecs = match env::var("SLEEP_PERIOD") { + Ok(s) => s + .parse::() + .expect("Failed to parse SLEEP_PERIOD as u64"), + Err(_) => 500, + }; + let mut from = match env::var("BLOCK_START") { + Ok(s) => s + .parse::() + .expect("Failed to parse BLOCK_START as u64"), + Err(_) => 0, + }; + let range = match env::var("BLOCK_RANGE") { + Ok(s) => s + .parse::() + .expect("Failed to parse BLOCK_RANGE as u64"), + Err(_) => 0, + }; // Set to None to keep polling the head of chain. - let to = None; + let to = match env::var("BLOCK_END") { + Ok(s) => Some(s.parse::().expect("Failed to parse BLOCK_END as u64")), + Err(_) => None, + }; info!( "Starting arkchain indexer: from:{} to:{:?} range:{}", @@ -68,7 +82,7 @@ async fn main() -> Result<()> { Ok(block_number) => block_number, Err(e) => { error!("Can't get arkchain block number: {}", e); - tokio::time::sleep(tokio::time::Duration::from_secs(sleep_secs)).await; + tokio::time::sleep(tokio::time::Duration::from_millis(sleep_msecs)).await; continue; } }; @@ -85,7 +99,7 @@ async fn main() -> Result<()> { if start > end { trace!("Nothing to fetch at block {start}"); - tokio::time::sleep(tokio::time::Duration::from_secs(sleep_secs)).await; + tokio::time::sleep(tokio::time::Duration::from_millis(sleep_msecs)).await; continue; } @@ -117,7 +131,7 @@ async fn main() -> Result<()> { } }; - tokio::time::sleep(tokio::time::Duration::from_secs(sleep_secs)).await; + tokio::time::sleep(tokio::time::Duration::from_millis(sleep_msecs)).await; } } From 19d59ca5b2c75c469876a0983debe50357e653ab Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Mon, 23 Sep 2024 15:07:51 +0200 Subject: [PATCH 21/33] feat(diri): use clap to parse display-events arguments --- crates/diri/Cargo.toml | 4 +- crates/diri/examples/display-events.rs | 127 +++++++++++++++++++------ 2 files changed, 101 insertions(+), 30 deletions(-) diff --git a/crates/diri/Cargo.toml b/crates/diri/Cargo.toml index 44c55cd2c..3b4563f83 100644 --- a/crates/diri/Cargo.toml +++ b/crates/diri/Cargo.toml @@ -21,11 +21,9 @@ serde_json = "1.0" # TODO: add more stuff to the workspace after merge. url = "2.3.1" -clap = { version = "4.3.19", features = ["derive", "env", "string"] } regex = "1.9.1" env_logger = "0.10.0" log = "0.4.17" -dotenv = "0.15.0" thiserror = "1.0.32" # For now, Diri can't use the ark-starknet due to the dependency # on ArkProjectNFTs for of starknet-rs. @@ -44,4 +42,6 @@ async-trait.workspace = true tokio.workspace = true [dev-dependencies] +clap = { version = "4.3.19", features = ["derive", "env", "string"] } +dotenv = "0.15.0" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/crates/diri/examples/display-events.rs b/crates/diri/examples/display-events.rs index bb2606a1e..a892cad19 100644 --- a/crates/diri/examples/display-events.rs +++ b/crates/diri/examples/display-events.rs @@ -1,5 +1,6 @@ use anyhow::Result; use async_trait::async_trait; +use clap::Parser; use diri::event_handler::EventHandler; use diri::storage::types::CancelledData; use diri::storage::types::ExecutedData; @@ -23,22 +24,59 @@ use tracing::{error, info, trace, warn}; use tracing_subscriber::fmt; use tracing_subscriber::EnvFilter; +#[derive(Parser, Debug)] +#[clap(about = "display-events")] +struct Args { + #[clap(long, help = "Starknet RPC", env = "STARKNET_RPC")] + rpc: String, + + #[clap(long, help = "Sleep period in milliseconds", default_value = "500")] + sleep_msecs: u64, + + #[clap( + long, + help = "Starting block number", + env = "BLOCK_START", + default_value = "0" + )] + block_start: u64, + + #[clap(long, help = "Ending block number", env = "BLOCK_END")] + block_end: Option, + + #[clap(long, help = "Block range", env = "BLOCK_RANGE", default_value = "0")] + block_range: u64, + + #[clap(long, help = "JSON output", env = "JSON_OUTPUT")] + output: Option, +} + #[tokio::main] async fn main() -> Result<()> { dotenv().ok(); - init_logging(); + let args = Args::parse(); - info!("Starting.....!"); + init_logging(); - let rpc_url = env::var("STARKNET_RPC").expect("STARKNET_RPC not set"); + let rpc_url = args.rpc; let rpc_url_converted = Url::parse(&rpc_url).unwrap(); let provider = Arc::new(AnyProvider::JsonRpcHttp(JsonRpcClient::new( HttpTransport::new(rpc_url_converted.clone()), ))); + let sleep_msecs = args.sleep_msecs; + let mut from = args.block_start; + let range = args.block_range; + + // Set to None to keep polling the head of chain. + let to = args.block_end; + + info!("Starting.....!"); + let storage = FakeStorage {}; + let handler = DefaultEventHandler {}; let indexer = Arc::new(Diri::new( @@ -47,31 +85,6 @@ async fn main() -> Result<()> { Arc::new(handler), )); - let sleep_msecs = match env::var("SLEEP_PERIOD") { - Ok(s) => s - .parse::() - .expect("Failed to parse SLEEP_PERIOD as u64"), - Err(_) => 500, - }; - let mut from = match env::var("BLOCK_START") { - Ok(s) => s - .parse::() - .expect("Failed to parse BLOCK_START as u64"), - Err(_) => 0, - }; - let range = match env::var("BLOCK_RANGE") { - Ok(s) => s - .parse::() - .expect("Failed to parse BLOCK_RANGE as u64"), - Err(_) => 0, - }; - - // Set to None to keep polling the head of chain. - let to = match env::var("BLOCK_END") { - Ok(s) => Some(s.parse::().expect("Failed to parse BLOCK_END as u64")), - Err(_) => None, - }; - info!( "Starting arkchain indexer: from:{} to:{:?} range:{}", from, to, range, @@ -162,6 +175,61 @@ impl Storage for FakeStorage { block_timestamp: u64, order: &PlacedData, ) -> StorageResult<()> { + info!("PLACED {} {:?}", block_id, order); + Ok(()) + } + + async fn register_cancelled( + &self, + block_id: u64, + block_timestamp: u64, + order: &CancelledData, + ) -> StorageResult<()> { + info!("CANCELLED {} {:?}", block_id, order); + Ok(()) + } + + async fn register_fulfilled( + &self, + block_id: u64, + block_timestamp: u64, + order: &FulfilledData, + ) -> StorageResult<()> { + info!("FULFILLED {} {:?}", block_id, order); + Ok(()) + } + + async fn register_executed( + &self, + block_id: u64, + block_timestamp: u64, + order: &ExecutedData, + ) -> StorageResult<()> { + info!("EXECUTED {} {:?}", block_id, order); + Ok(()) + } + + async fn status_back_to_open( + &self, + block_id: u64, + block_timestamp: u64, + order: &RollbackStatusData, + ) -> StorageResult<()> { + Ok(()) + } +} + +struct JSONStorage; + +#[async_trait] +impl Storage for JSONStorage { + async fn register_placed( + &self, + block_id: u64, + block_timestamp: u64, + order: &PlacedData, + ) -> StorageResult<()> { + info!("PLACED {} {:?}", block_id, order); Ok(()) } @@ -171,6 +239,7 @@ impl Storage for FakeStorage { block_timestamp: u64, order: &CancelledData, ) -> StorageResult<()> { + info!("CANCELLED {} {:?}", block_id, order); Ok(()) } @@ -180,6 +249,7 @@ impl Storage for FakeStorage { block_timestamp: u64, order: &FulfilledData, ) -> StorageResult<()> { + info!("FULFILLED {} {:?}", block_id, order); Ok(()) } @@ -189,6 +259,7 @@ impl Storage for FakeStorage { block_timestamp: u64, order: &ExecutedData, ) -> StorageResult<()> { + info!("EXECUTED {} {:?}", block_id, order); Ok(()) } From 1358edaf6a18f1ab691358c0ca53f8ec3092975f Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 02:57:07 +0200 Subject: [PATCH 22/33] feat(diri): add JSON output support in display-events --- crates/diri/Cargo.toml | 2 +- crates/diri/examples/display-events.rs | 251 ++++++++++++++++++++----- 2 files changed, 201 insertions(+), 52 deletions(-) diff --git a/crates/diri/Cargo.toml b/crates/diri/Cargo.toml index 3b4563f83..cff2f1860 100644 --- a/crates/diri/Cargo.toml +++ b/crates/diri/Cargo.toml @@ -16,7 +16,7 @@ path = "examples/display-events.rs" [dependencies] futures = "0.3.28" -serde = { version = "1.0", features = ["derive"] } +serde = { version = "1.0", features = ["derive", "rc"] } serde_json = "1.0" # TODO: add more stuff to the workspace after merge. diff --git a/crates/diri/examples/display-events.rs b/crates/diri/examples/display-events.rs index a892cad19..1e97f48f5 100644 --- a/crates/diri/examples/display-events.rs +++ b/crates/diri/examples/display-events.rs @@ -11,6 +11,8 @@ use diri::storage::Storage; use diri::storage::StorageResult; use diri::Diri; use dotenv::dotenv; +use serde::ser::SerializeStruct; +use serde::Serialize; use starknet::core::types::BlockId; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::AnyProvider; @@ -18,7 +20,9 @@ use starknet::providers::JsonRpcClient; use starknet::providers::Provider; use url::Url; -use std::{env, sync::Arc}; +use std::fs::File; +use std::sync::Arc; +use std::sync::Mutex; use tracing::{error, info, trace, warn}; use tracing_subscriber::fmt; @@ -75,13 +79,13 @@ async fn main() -> Result<()> { info!("Starting.....!"); - let storage = FakeStorage {}; + let storage = Arc::new(JSONStorage::new(args.output, from)); let handler = DefaultEventHandler {}; let indexer = Arc::new(Diri::new( provider.clone(), - Arc::new(storage), + storage.clone(), Arc::new(handler), )); @@ -127,7 +131,7 @@ async fn main() -> Result<()> { if let Some(to) = to { if end >= to { trace!("`to` block was reached, exit."); - return Ok(()); + break; // return Ok(()); } } @@ -146,6 +150,8 @@ async fn main() -> Result<()> { tokio::time::sleep(tokio::time::Duration::from_millis(sleep_msecs)).await; } + storage.write(); + Ok(()) } /// Initializes the logging, ensuring that the `RUST_LOG` environment @@ -165,61 +171,158 @@ fn init_logging() { .expect("Failed to set the global tracing subscriber"); } -struct FakeStorage; +#[derive(Clone, Debug)] +enum OrderbookEventType { + Placed(PlacedData), + Cancelled(CancelledData), + Fulfilled(FulfilledData), + Executed(ExecutedData), + RollbackStatus(RollbackStatusData), +} -#[async_trait] -impl Storage for FakeStorage { - async fn register_placed( - &self, - block_id: u64, - block_timestamp: u64, - order: &PlacedData, - ) -> StorageResult<()> { - info!("PLACED {} {:?}", block_id, order); - Ok(()) +struct SerializablePlacedData(PlacedData); +struct SerializableCancelledData(CancelledData); +struct SerializableFulfilledData(FulfilledData); +struct SerializableExecutedData(ExecutedData); +struct SerializableRollbackStatus(RollbackStatusData); + +impl Serialize for SerializablePlacedData { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let mut state = serializer.serialize_struct("data", 3)?; + state.serialize_field("order_hash", &self.0.order_hash)?; + state.serialize_field("order_type", &self.0.order_type)?; + state.serialize_field("route", &self.0.route)?; + state.end() } +} - async fn register_cancelled( - &self, - block_id: u64, - block_timestamp: u64, - order: &CancelledData, - ) -> StorageResult<()> { - info!("CANCELLED {} {:?}", block_id, order); - Ok(()) +impl Serialize for SerializableCancelledData { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let mut state = serializer.serialize_struct("data", 3)?; + state.serialize_field("order_hash", &self.0.order_hash)?; + state.serialize_field("order_type", &self.0.order_type)?; + state.serialize_field("reason", &self.0.reason)?; + state.end() } +} - async fn register_fulfilled( - &self, - block_id: u64, - block_timestamp: u64, - order: &FulfilledData, - ) -> StorageResult<()> { - info!("FULFILLED {} {:?}", block_id, order); - Ok(()) +impl Serialize for SerializableFulfilledData { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let mut state = serializer.serialize_struct("data", 4)?; + state.serialize_field("order_hash", &self.0.order_hash)?; + state.serialize_field("order_type", &self.0.order_type)?; + state.serialize_field("fulfiller", &self.0.fulfiller)?; + state.serialize_field("related_order_hash", &self.0.related_order_hash)?; + state.end() } +} - async fn register_executed( - &self, - block_id: u64, - block_timestamp: u64, - order: &ExecutedData, - ) -> StorageResult<()> { - info!("EXECUTED {} {:?}", block_id, order); - Ok(()) +impl Serialize for SerializableExecutedData { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let mut state = serializer.serialize_struct("data", 4)?; + state.serialize_field("order_hash", &self.0.order_hash)?; + state.serialize_field("order_type", &self.0.order_type)?; + state.serialize_field("from", &self.0.from)?; + state.serialize_field("to", &self.0.to)?; + state.end() } +} - async fn status_back_to_open( - &self, - block_id: u64, - block_timestamp: u64, - order: &RollbackStatusData, - ) -> StorageResult<()> { - Ok(()) +impl Serialize for SerializableRollbackStatus { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let mut state = serializer.serialize_struct("data", 3)?; + state.serialize_field("order_hash", &self.0.order_hash)?; + state.serialize_field("order_type", &self.0.order_type)?; + state.serialize_field("reason", &self.0.reason)?; + state.end() } } -struct JSONStorage; +impl Serialize for OrderbookEventType { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let type_key = "type"; + let data_key = "data"; + + let mut state = serializer.serialize_struct("event", 2)?; + match self { + OrderbookEventType::Placed(data) => { + state.serialize_field(type_key, "PLACED")?; + state.serialize_field(data_key, &SerializablePlacedData(data.clone()))?; + } + OrderbookEventType::Cancelled(data) => { + state.serialize_field(type_key, "CANCELLED")?; + state.serialize_field(data_key, &SerializableCancelledData(data.clone()))?; + } + OrderbookEventType::Fulfilled(data) => { + state.serialize_field(type_key, "FULFILLED")?; + state.serialize_field(data_key, &SerializableFulfilledData(data.clone()))?; + } + OrderbookEventType::Executed(data) => { + state.serialize_field(type_key, "EXECUTED")?; + state.serialize_field(data_key, &SerializableExecutedData(data.clone()))?; + } + OrderbookEventType::RollbackStatus(data) => { + state.serialize_field(type_key, "ROLLBACK")?; + state.serialize_field(data_key, &SerializableRollbackStatus(data.clone()))?; + } + }; + state.end() + } +} + +#[derive(Clone, Serialize, Debug)] +struct OrderbookEvent { + #[serde(rename = "event")] + event_type: OrderbookEventType, + block_id: u64, + block_timestamp: u64, +} + +#[derive(Serialize, Debug)] +struct JSONStorage { + start: u64, + end: u64, + output: Option, + events: Mutex>, +} + +impl JSONStorage { + fn new(output: Option, start: u64) -> Self { + Self { + output, + start, + end: 0, + events: Mutex::new(Vec::new()), + } + } + + fn write(&self) { + if self.output.is_none() { + println!("{}", serde_json::to_string_pretty(self).unwrap()); + } else { + let mut file = File::create(self.output.clone().unwrap()).unwrap(); + serde_json::to_writer_pretty(&mut file, &self).unwrap(); + } + } +} #[async_trait] impl Storage for JSONStorage { @@ -229,7 +332,16 @@ impl Storage for JSONStorage { block_timestamp: u64, order: &PlacedData, ) -> StorageResult<()> { - info!("PLACED {} {:?}", block_id, order); + trace!("PLACED {} {:?}", block_id, order); + if let Ok(mut events) = self.events.lock() { + events.push(OrderbookEvent { + block_id, + block_timestamp, + event_type: OrderbookEventType::Placed(order.clone()), + }); + } else { + error!("Failed to append Placed event"); + } Ok(()) } @@ -239,7 +351,16 @@ impl Storage for JSONStorage { block_timestamp: u64, order: &CancelledData, ) -> StorageResult<()> { - info!("CANCELLED {} {:?}", block_id, order); + trace!("CANCELLED {} {:?}", block_id, order); + if let Ok(mut events) = self.events.lock() { + events.push(OrderbookEvent { + block_id, + block_timestamp, + event_type: OrderbookEventType::Cancelled(order.clone()), + }); + } else { + error!("Failed to append Cancelled event"); + } Ok(()) } @@ -249,7 +370,16 @@ impl Storage for JSONStorage { block_timestamp: u64, order: &FulfilledData, ) -> StorageResult<()> { - info!("FULFILLED {} {:?}", block_id, order); + trace!("FULFILLED {} {:?}", block_id, order); + if let Ok(mut events) = self.events.lock() { + events.push(OrderbookEvent { + block_id, + block_timestamp, + event_type: OrderbookEventType::Fulfilled(order.clone()), + }); + } else { + error!("Failed to append Fulfilled event"); + } Ok(()) } @@ -259,7 +389,16 @@ impl Storage for JSONStorage { block_timestamp: u64, order: &ExecutedData, ) -> StorageResult<()> { - info!("EXECUTED {} {:?}", block_id, order); + trace!("EXECUTED {} {:?}", block_id, order); + if let Ok(mut events) = self.events.lock() { + events.push(OrderbookEvent { + block_id, + block_timestamp, + event_type: OrderbookEventType::Executed(order.clone()), + }); + } else { + error!("Failed to append Executed event"); + } Ok(()) } @@ -269,6 +408,16 @@ impl Storage for JSONStorage { block_timestamp: u64, order: &RollbackStatusData, ) -> StorageResult<()> { + trace!("ROLLBACK {} {:?}", block_id, order); + if let Ok(mut events) = self.events.lock() { + events.push(OrderbookEvent { + block_id, + block_timestamp, + event_type: OrderbookEventType::RollbackStatus(order.clone()), + }); + } else { + error!("Failed to append Executed event"); + } Ok(()) } } From e00e08705d7c0a2e4cbddad6dc0d62edb38c39cd Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 03:00:18 +0200 Subject: [PATCH 23/33] feat(diri): add `order_type` field --- .../diri/src/orderbook/events/order_placed.rs | 29 +++++++++++++ crates/diri/src/storage/types.rs | 41 ++++++------------- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/crates/diri/src/orderbook/events/order_placed.rs b/crates/diri/src/orderbook/events/order_placed.rs index 3c9817245..0f8e7ccf6 100644 --- a/crates/diri/src/orderbook/events/order_placed.rs +++ b/crates/diri/src/orderbook/events/order_placed.rs @@ -1,6 +1,8 @@ use cainome::rs::abigen; use starknet::core::types::{EmittedEvent, Felt}; +use crate::types::{to_hex_str, to_hex_str_opt, u256_to_hex, u256_to_hex_opt, PlacedData}; + use super::{OrderbookParseError, ORDER_PLACED_SELECTOR}; abigen!( @@ -198,3 +200,30 @@ impl TryFrom for OrderPlaced { } } } + +impl From for PlacedData { + fn from(value: OrderPlaced) -> Self { + match value { + OrderPlaced::V1(value) => Self { + order_hash: to_hex_str(&value.order_hash), + order_version: to_hex_str(&value.order_version), + order_type: format!("{:?}", value.order_type), + cancelled_order_hash: to_hex_str_opt(&value.cancelled_order_hash), + route: format!("{:?}", value.order.route), + currency_address: to_hex_str(&Felt::from(value.order.currency_address)), + currency_chain_id: to_hex_str(&value.order.currency_chain_id), + salt: to_hex_str(&value.order.salt), + offerer: to_hex_str(&Felt::from(value.order.offerer)), + token_chain_id: format!("0x{:x}", value.order.token_chain_id), + token_address: to_hex_str(&Felt::from(value.order.token_address)), + token_id: u256_to_hex_opt(&value.order.token_id), + quantity: u256_to_hex(&value.order.quantity), + start_amount: u256_to_hex(&value.order.start_amount), + end_amount: u256_to_hex(&value.order.end_amount), + start_date: value.order.start_date, + end_date: value.order.end_date, + broker_id: to_hex_str(&Felt::from(value.order.broker_id)), + }, + } + } +} diff --git a/crates/diri/src/storage/types.rs b/crates/diri/src/storage/types.rs index e7797c143..bf0623355 100644 --- a/crates/diri/src/storage/types.rs +++ b/crates/diri/src/storage/types.rs @@ -5,7 +5,7 @@ use starknet::core::utils::parse_cairo_short_string; use std::fmt::LowerHex; use crate::orderbook::events::{ - OrderCancelled, OrderExecuted, OrderFulfilled, OrderPlaced, RollbackStatus, U256, + OrderCancelled, OrderExecuted, OrderFulfilled, RollbackStatus, U256, }; #[derive(Debug, Clone)] @@ -31,36 +31,10 @@ pub struct PlacedData { pub broker_id: String, } -impl From for PlacedData { - fn from(value: OrderPlaced) -> Self { - match value { - OrderPlaced::V1(value) => Self { - order_hash: to_hex_str(&value.order_hash), - order_version: to_hex_str(&value.order_version), - order_type: format!("{:?}", value.order_type), - cancelled_order_hash: to_hex_str_opt(&value.cancelled_order_hash), - route: format!("{:?}", value.order.route), - currency_address: to_hex_str(&Felt::from(value.order.currency_address)), - currency_chain_id: to_hex_str(&value.order.currency_chain_id), - salt: to_hex_str(&value.order.salt), - offerer: to_hex_str(&Felt::from(value.order.offerer)), - token_chain_id: format!("0x{:x}", value.order.token_chain_id), - token_address: to_hex_str(&Felt::from(value.order.token_address)), - token_id: u256_to_hex_opt(&value.order.token_id), - quantity: u256_to_hex(&value.order.quantity), - start_amount: u256_to_hex(&value.order.start_amount), - end_amount: u256_to_hex(&value.order.end_amount), - start_date: value.order.start_date, - end_date: value.order.end_date, - broker_id: to_hex_str(&Felt::from(value.order.broker_id)), - }, - } - } -} - #[derive(Debug, Clone)] pub struct CancelledData { pub order_hash: String, + pub order_type: String, pub reason: String, } @@ -69,6 +43,7 @@ impl From for CancelledData { match value { OrderCancelled::V1(value) => Self { order_hash: to_hex_str(&value.order_hash), + order_type: format!("{:?}", value.order_type), reason: parse_cairo_short_string(&value.reason) .unwrap_or(to_hex_str(&value.reason)), }, @@ -79,6 +54,7 @@ impl From for CancelledData { #[derive(Debug, Clone)] pub struct RollbackStatusData { pub order_hash: String, + pub order_type: String, pub reason: String, } @@ -87,6 +63,7 @@ impl From for RollbackStatusData { match value { RollbackStatus::V1(value) => Self { order_hash: to_hex_str(&value.order_hash), + order_type: format!("{:?}", value.order_type), reason: parse_cairo_short_string(&value.reason) .unwrap_or(to_hex_str(&value.reason)), }, @@ -97,6 +74,7 @@ impl From for RollbackStatusData { #[derive(Debug, Clone)] pub struct FulfilledData { pub order_hash: String, + pub order_type: String, pub fulfiller: String, pub related_order_hash: Option, } @@ -109,6 +87,7 @@ impl From for FulfilledData { Self { order_hash: to_hex_str(&value.order_hash), + order_type: format!("{:?}", value.order_type), fulfiller: to_hex_str(&Felt::from(value.fulfiller)), related_order_hash: to_hex_str_opt(&related_order_hash), } @@ -121,6 +100,7 @@ impl From for FulfilledData { pub struct ExecutedData { pub version: u8, pub order_hash: String, + pub order_type: Option, pub transaction_hash: Option, pub from: Option, pub to: Option, @@ -132,6 +112,7 @@ impl From for ExecutedData { OrderExecuted::V0(v) => Self { version: 0, order_hash: to_hex_str(&v.order_hash), + order_type: None, transaction_hash: None, from: None, to: None, @@ -139,13 +120,15 @@ impl From for ExecutedData { OrderExecuted::V1(v) => Self { version: 1, order_hash: to_hex_str(&v.order_hash), + order_type: None, transaction_hash: Some(to_hex_str(&v.transaction_hash)), from: Some(to_hex_str(&Felt::from(v.from))), to: Some(to_hex_str(&Felt::from(v.to))), }, OrderExecuted::V2(v) => Self { - version: 1, + version: 2, order_hash: to_hex_str(&v.order_hash), + order_type: Some(format!("{:?}", v.order_type)), transaction_hash: Some(to_hex_str(&v.transaction_hash)), from: Some(to_hex_str(&Felt::from(v.from))), to: Some(to_hex_str(&Felt::from(v.to))), From c00fd82f574223011dd06fa0798729691eeb47e5 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 08:56:41 +0200 Subject: [PATCH 24/33] feat(diri): move type conversion to orderbook/events --- crates/diri/src/orderbook/events/common.rs | 34 ++++++ crates/diri/src/orderbook/events/mod.rs | 3 +- .../src/orderbook/events/order_cancelled.rs | 22 +++- .../src/orderbook/events/order_executed.rs | 35 +++++- .../src/orderbook/events/order_fulfilled.rs | 24 +++- .../diri/src/orderbook/events/order_placed.rs | 7 +- .../src/orderbook/events/rollback_status.rs | 22 +++- crates/diri/src/storage/types.rs | 114 ------------------ 8 files changed, 138 insertions(+), 123 deletions(-) create mode 100644 crates/diri/src/orderbook/events/common.rs diff --git a/crates/diri/src/orderbook/events/common.rs b/crates/diri/src/orderbook/events/common.rs new file mode 100644 index 000000000..1e7672b40 --- /dev/null +++ b/crates/diri/src/orderbook/events/common.rs @@ -0,0 +1,34 @@ +use cainome::cairo_serde::U256; +use num_bigint::BigUint; + +use std::fmt::LowerHex; + +/// Returns the padded hex of '0x' prefixed +/// representation of the given felt. +/// TODO: can't use ark_starknet until starknet-rs conflict is resolved. +pub fn to_hex_str(value: &T) -> String { + format!("0x{:064x}", value) +} + +pub fn to_hex_str_opt(value: &Option) -> Option { + value.as_ref().map(|v| format!("0x{:064x}", v)) +} + +pub fn u256_to_biguint(v: &U256) -> BigUint { + let low_bytes = v.low.to_be_bytes(); + let high_bytes = v.high.to_be_bytes(); + + let mut bytes: Vec = Vec::new(); + bytes.extend(high_bytes); + bytes.extend(low_bytes); + + BigUint::from_bytes_be(&bytes[..]) +} + +pub fn u256_to_hex(value: &U256) -> String { + to_hex_str(&u256_to_biguint(value)) +} + +pub fn u256_to_hex_opt(value: &Option) -> Option { + value.as_ref().map(|v| to_hex_str(&u256_to_biguint(v))) +} diff --git a/crates/diri/src/orderbook/events/mod.rs b/crates/diri/src/orderbook/events/mod.rs index 27b89813e..3105839fc 100644 --- a/crates/diri/src/orderbook/events/mod.rs +++ b/crates/diri/src/orderbook/events/mod.rs @@ -1,3 +1,4 @@ +pub(crate) mod common; pub(crate) mod order_cancelled; pub(crate) mod order_executed; pub(crate) mod order_fulfilled; @@ -10,7 +11,7 @@ pub(crate) use order_fulfilled::OrderFulfilled; pub(crate) use order_placed::OrderPlaced; pub(crate) use rollback_status::RollbackStatus; -pub(crate) use cainome::cairo_serde::U256; +// pub(crate) use cainome::cairo_serde::U256; use starknet::{core::types::Felt, macros::selector}; #[derive(Debug)] diff --git a/crates/diri/src/orderbook/events/order_cancelled.rs b/crates/diri/src/orderbook/events/order_cancelled.rs index c26838630..f30087f1e 100644 --- a/crates/diri/src/orderbook/events/order_cancelled.rs +++ b/crates/diri/src/orderbook/events/order_cancelled.rs @@ -1,7 +1,12 @@ use cainome::rs::abigen; -use starknet::core::types::{EmittedEvent, Felt}; +use starknet::core::{ + types::{EmittedEvent, Felt}, + utils::parse_cairo_short_string, +}; -use super::{OrderbookParseError, ORDER_CANCELLED_SELECTOR}; +use crate::types::CancelledData; + +use super::{common::to_hex_str, OrderbookParseError, ORDER_CANCELLED_SELECTOR}; abigen!( V1, @@ -106,3 +111,16 @@ impl TryFrom for OrderCancelled { } } } + +impl From for CancelledData { + fn from(value: OrderCancelled) -> Self { + match value { + OrderCancelled::V1(value) => Self { + order_hash: to_hex_str(&value.order_hash), + order_type: format!("{:?}", value.order_type), + reason: parse_cairo_short_string(&value.reason) + .unwrap_or(to_hex_str(&value.reason)), + }, + } + } +} diff --git a/crates/diri/src/orderbook/events/order_executed.rs b/crates/diri/src/orderbook/events/order_executed.rs index eca734777..f791a3fd2 100644 --- a/crates/diri/src/orderbook/events/order_executed.rs +++ b/crates/diri/src/orderbook/events/order_executed.rs @@ -1,7 +1,9 @@ use cainome::rs::abigen; use starknet::core::types::{EmittedEvent, Felt}; -use super::{OrderbookParseError, ORDER_EXECUTED_SELECTOR}; +use crate::types::ExecutedData; + +use super::{common::to_hex_str, OrderbookParseError, ORDER_EXECUTED_SELECTOR}; abigen!( V0, @@ -369,3 +371,34 @@ impl TryFrom for OrderExecuted { } } } + +impl From for ExecutedData { + fn from(value: OrderExecuted) -> Self { + match value { + OrderExecuted::V0(v) => Self { + version: 0, + order_hash: to_hex_str(&v.order_hash), + order_type: None, + transaction_hash: None, + from: None, + to: None, + }, + OrderExecuted::V1(v) => Self { + version: 1, + order_hash: to_hex_str(&v.order_hash), + order_type: None, + transaction_hash: Some(to_hex_str(&v.transaction_hash)), + from: Some(to_hex_str(&Felt::from(v.from))), + to: Some(to_hex_str(&Felt::from(v.to))), + }, + OrderExecuted::V2(v) => Self { + version: 2, + order_hash: to_hex_str(&v.order_hash), + order_type: Some(format!("{:?}", v.order_type)), + transaction_hash: Some(to_hex_str(&v.transaction_hash)), + from: Some(to_hex_str(&Felt::from(v.from))), + to: Some(to_hex_str(&Felt::from(v.to))), + }, + } + } +} diff --git a/crates/diri/src/orderbook/events/order_fulfilled.rs b/crates/diri/src/orderbook/events/order_fulfilled.rs index 167789c11..fe6869f0a 100644 --- a/crates/diri/src/orderbook/events/order_fulfilled.rs +++ b/crates/diri/src/orderbook/events/order_fulfilled.rs @@ -1,7 +1,12 @@ use cainome::rs::abigen; use starknet::core::types::{EmittedEvent, Felt}; -use super::{OrderbookParseError, ORDER_FULFILLED_SELECTOR}; +use crate::types::FulfilledData; + +use super::{ + common::{to_hex_str, to_hex_str_opt}, + OrderbookParseError, ORDER_FULFILLED_SELECTOR, +}; abigen!( V1, @@ -111,3 +116,20 @@ impl TryFrom for OrderFulfilled { } } } + +impl From for FulfilledData { + fn from(value: OrderFulfilled) -> Self { + match value { + OrderFulfilled::V1(value) => { + let related_order_hash = value.related_order_hash.map(Felt::from); + + Self { + order_hash: to_hex_str(&value.order_hash), + order_type: format!("{:?}", value.order_type), + fulfiller: to_hex_str(&Felt::from(value.fulfiller)), + related_order_hash: to_hex_str_opt(&related_order_hash), + } + } + } + } +} diff --git a/crates/diri/src/orderbook/events/order_placed.rs b/crates/diri/src/orderbook/events/order_placed.rs index 0f8e7ccf6..434cfee2d 100644 --- a/crates/diri/src/orderbook/events/order_placed.rs +++ b/crates/diri/src/orderbook/events/order_placed.rs @@ -1,9 +1,12 @@ use cainome::rs::abigen; use starknet::core::types::{EmittedEvent, Felt}; -use crate::types::{to_hex_str, to_hex_str_opt, u256_to_hex, u256_to_hex_opt, PlacedData}; +use crate::types::PlacedData; -use super::{OrderbookParseError, ORDER_PLACED_SELECTOR}; +use super::{ + common::{to_hex_str, to_hex_str_opt, u256_to_hex, u256_to_hex_opt}, + OrderbookParseError, ORDER_PLACED_SELECTOR, +}; abigen!( V1, diff --git a/crates/diri/src/orderbook/events/rollback_status.rs b/crates/diri/src/orderbook/events/rollback_status.rs index b66ae599a..423b0982b 100644 --- a/crates/diri/src/orderbook/events/rollback_status.rs +++ b/crates/diri/src/orderbook/events/rollback_status.rs @@ -1,7 +1,12 @@ use cainome::rs::abigen; -use starknet::core::types::{EmittedEvent, Felt}; +use starknet::core::{ + types::{EmittedEvent, Felt}, + utils::parse_cairo_short_string, +}; -use super::{OrderbookParseError, ROLLBACK_STATUS_SELECTOR}; +use crate::types::RollbackStatusData; + +use super::{common::to_hex_str, OrderbookParseError, ROLLBACK_STATUS_SELECTOR}; abigen!( V1, @@ -107,3 +112,16 @@ impl TryFrom for RollbackStatus { } } } + +impl From for RollbackStatusData { + fn from(value: RollbackStatus) -> Self { + match value { + RollbackStatus::V1(value) => Self { + order_hash: to_hex_str(&value.order_hash), + order_type: format!("{:?}", value.order_type), + reason: parse_cairo_short_string(&value.reason) + .unwrap_or(to_hex_str(&value.reason)), + }, + } + } +} diff --git a/crates/diri/src/storage/types.rs b/crates/diri/src/storage/types.rs index bf0623355..1a1cf49bb 100644 --- a/crates/diri/src/storage/types.rs +++ b/crates/diri/src/storage/types.rs @@ -1,13 +1,3 @@ -use num_bigint::BigUint; - -use starknet::core::types::Felt; -use starknet::core::utils::parse_cairo_short_string; -use std::fmt::LowerHex; - -use crate::orderbook::events::{ - OrderCancelled, OrderExecuted, OrderFulfilled, RollbackStatus, U256, -}; - #[derive(Debug, Clone)] pub struct PlacedData { pub order_hash: String, @@ -38,19 +28,6 @@ pub struct CancelledData { pub reason: String, } -impl From for CancelledData { - fn from(value: OrderCancelled) -> Self { - match value { - OrderCancelled::V1(value) => Self { - order_hash: to_hex_str(&value.order_hash), - order_type: format!("{:?}", value.order_type), - reason: parse_cairo_short_string(&value.reason) - .unwrap_or(to_hex_str(&value.reason)), - }, - } - } -} - #[derive(Debug, Clone)] pub struct RollbackStatusData { pub order_hash: String, @@ -58,19 +35,6 @@ pub struct RollbackStatusData { pub reason: String, } -impl From for RollbackStatusData { - fn from(value: RollbackStatus) -> Self { - match value { - RollbackStatus::V1(value) => Self { - order_hash: to_hex_str(&value.order_hash), - order_type: format!("{:?}", value.order_type), - reason: parse_cairo_short_string(&value.reason) - .unwrap_or(to_hex_str(&value.reason)), - }, - } - } -} - #[derive(Debug, Clone)] pub struct FulfilledData { pub order_hash: String, @@ -79,23 +43,6 @@ pub struct FulfilledData { pub related_order_hash: Option, } -impl From for FulfilledData { - fn from(value: OrderFulfilled) -> Self { - match value { - OrderFulfilled::V1(value) => { - let related_order_hash = value.related_order_hash.map(Felt::from); - - Self { - order_hash: to_hex_str(&value.order_hash), - order_type: format!("{:?}", value.order_type), - fulfiller: to_hex_str(&Felt::from(value.fulfiller)), - related_order_hash: to_hex_str_opt(&related_order_hash), - } - } - } - } -} - #[derive(Debug, Clone)] pub struct ExecutedData { pub version: u8, @@ -105,64 +52,3 @@ pub struct ExecutedData { pub from: Option, pub to: Option, } - -impl From for ExecutedData { - fn from(value: OrderExecuted) -> Self { - match value { - OrderExecuted::V0(v) => Self { - version: 0, - order_hash: to_hex_str(&v.order_hash), - order_type: None, - transaction_hash: None, - from: None, - to: None, - }, - OrderExecuted::V1(v) => Self { - version: 1, - order_hash: to_hex_str(&v.order_hash), - order_type: None, - transaction_hash: Some(to_hex_str(&v.transaction_hash)), - from: Some(to_hex_str(&Felt::from(v.from))), - to: Some(to_hex_str(&Felt::from(v.to))), - }, - OrderExecuted::V2(v) => Self { - version: 2, - order_hash: to_hex_str(&v.order_hash), - order_type: Some(format!("{:?}", v.order_type)), - transaction_hash: Some(to_hex_str(&v.transaction_hash)), - from: Some(to_hex_str(&Felt::from(v.from))), - to: Some(to_hex_str(&Felt::from(v.to))), - }, - } - } -} - -/// Returns the padded hex of '0x' prefixed -/// representation of the given felt. -/// TODO: can't use ark_starknet until starknet-rs conflict is resolved. -pub fn to_hex_str(value: &T) -> String { - format!("0x{:064x}", value) -} - -pub fn to_hex_str_opt(value: &Option) -> Option { - value.as_ref().map(|v| format!("0x{:064x}", v)) -} - -pub fn u256_to_biguint(v: &U256) -> BigUint { - let low_bytes = v.low.to_be_bytes(); - let high_bytes = v.high.to_be_bytes(); - - let mut bytes: Vec = Vec::new(); - bytes.extend(high_bytes); - bytes.extend(low_bytes); - - BigUint::from_bytes_be(&bytes[..]) -} - -pub fn u256_to_hex(value: &U256) -> String { - to_hex_str(&u256_to_biguint(value)) -} - -pub fn u256_to_hex_opt(value: &Option) -> Option { - value.as_ref().map(|v| to_hex_str(&u256_to_biguint(v))) -} From 82a3fbe8a1f150191f6075853cc0d3c4559998ef Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 09:30:48 +0200 Subject: [PATCH 25/33] feat(diri): update JSON output and add missing end update --- crates/diri/examples/display-events.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/crates/diri/examples/display-events.rs b/crates/diri/examples/display-events.rs index 1e97f48f5..4efcaacfe 100644 --- a/crates/diri/examples/display-events.rs +++ b/crates/diri/examples/display-events.rs @@ -21,6 +21,8 @@ use starknet::providers::Provider; use url::Url; use std::fs::File; +use std::sync::atomic::AtomicU64; +use std::sync::atomic::Ordering; use std::sync::Arc; use std::sync::Mutex; @@ -131,6 +133,7 @@ async fn main() -> Result<()> { if let Some(to) = to { if end >= to { trace!("`to` block was reached, exit."); + storage.end.store(end, Ordering::SeqCst); break; // return Ok(()); } } @@ -191,10 +194,16 @@ impl Serialize for SerializablePlacedData { where S: serde::Serializer, { - let mut state = serializer.serialize_struct("data", 3)?; + let mut state = serializer.serialize_struct("data", 9)?; state.serialize_field("order_hash", &self.0.order_hash)?; state.serialize_field("order_type", &self.0.order_type)?; - state.serialize_field("route", &self.0.route)?; + state.serialize_field("broker_id", &self.0.broker_id)?; + state.serialize_field("offerer", &self.0.offerer)?; + state.serialize_field("token_address", &self.0.token_address)?; + state.serialize_field("token_id", &self.0.token_id)?; + state.serialize_field("quantity", &self.0.quantity)?; + state.serialize_field("start_amount", &self.0.start_amount)?; + state.serialize_field("end_amount", &self.0.end_amount)?; state.end() } } @@ -299,7 +308,8 @@ struct OrderbookEvent { #[derive(Serialize, Debug)] struct JSONStorage { start: u64, - end: u64, + end: AtomicU64, + #[serde(skip)] output: Option, events: Mutex>, } @@ -309,7 +319,7 @@ impl JSONStorage { Self { output, start, - end: 0, + end: AtomicU64::new(0), events: Mutex::new(Vec::new()), } } From df3b518d263f42a6a37c4b2cd2818f61111696cc Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 11:18:22 +0200 Subject: [PATCH 26/33] CI: add step to dump devnet state after contract deployment --- .github/workflows/arkproject-contracts.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/arkproject-contracts.yml b/.github/workflows/arkproject-contracts.yml index 9b42a6b0a..2bc38dab2 100644 --- a/.github/workflows/arkproject-contracts.yml +++ b/.github/workflows/arkproject-contracts.yml @@ -14,6 +14,7 @@ env: SCARB_VERSION: 2.7.1 STARKNET_DEVNET_VERSION: 0.2.0 DEVNET_DUMP_PATH: /devnet-dump.json + DEVNET_DEPLOYMENT_DUMP_PATH: /tmp/devnet-deployment-dump.json jobs: fmt: runs-on: ubuntu-latest @@ -62,7 +63,7 @@ jobs: docker run -d --rm --name starknet-devnet \ -p 5050:5050 \ shardlabs/starknet-devnet-rs:${STARKNET_DEVNET_VERSION} \ - --seed 0 --dump-path $DEVNET_DUMP_PATH --state-archive-capacity full + --seed 0 --dump-path $DEVNET_DUMP_PATH --dump-on exit --state-archive-capacity full sleep 3 # Wait for 3 seconds for the Docker container to initialize - name: Install SDK dependencies @@ -74,6 +75,12 @@ jobs: - name: Deploy smart contract run: pnpm deploy:starknet:local + - name: Store devnet state after contract deployment + run: | + curl -H "Content-type: application/json" \ + -X POST http://localhost:5050/dump \ + -d '{"path": "$DEVNET_DEPLOYMENT_DUMP_PATH"}' + - name: Run SDK test run: | cp .env.devnet .env From a5bcdb0270fe55087ab1140ab3063f90851cdf2a Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 13:37:07 +0200 Subject: [PATCH 27/33] restore turbo.json & pnpm-lock --- pnpm-lock.yaml | 2989 +++++++++++++++++++++++++++++++++--------------- turbo.json | 50 +- 2 files changed, 2064 insertions(+), 975 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd297e36c..d297d2eff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,16 +16,16 @@ importers: version: link:packages/typescript-config '@changesets/cli': specifier: ^2.27.1 - version: 2.27.8 + version: 2.27.7 '@ianvs/prettier-plugin-sort-imports': specifier: ^4.1.1 version: 4.3.1(prettier@3.3.3) bun: specifier: ^1.0.26 - version: 1.1.28 + version: 1.1.25 bun-types: specifier: ^1.0.26 - version: 1.1.28 + version: 1.1.25 dotenv-cli: specifier: ^7.3.0 version: 7.4.2 @@ -37,13 +37,13 @@ importers: version: 3.3.3 prettier-plugin-sort-imports: specifier: ^1.8.1 - version: 1.8.6(typescript@5.6.2) + version: 1.8.6(typescript@5.5.4) turbo: specifier: ^2.1.2 version: 2.1.2 typescript: specifier: ^5.0.0 - version: 5.6.2 + version: 5.5.4 examples/core: dependencies: @@ -61,14 +61,14 @@ importers: version: 10.9.2(@types/node@22.5.5)(typescript@5.5.4) typescript: specifier: ^5.0.0 - version: 5.6.2 + version: 5.5.4 winston: specifier: ^3.13.1 version: 3.14.2 devDependencies: '@types/bun': specifier: latest - version: 1.1.9 + version: 1.1.8 packages/core: dependencies: @@ -80,7 +80,7 @@ importers: version: 6.11.0 viem: specifier: '>=0.3.35' - version: 2.21.9(typescript@5.6.2)(zod@3.23.8) + version: 2.20.0(typescript@5.5.4)(zod@3.23.8) devDependencies: '@ark-project/eslint-config': specifier: workspace:* @@ -93,7 +93,7 @@ importers: version: link:../typescript-config '@types/node': specifier: ^20.10.7 - version: 20.16.5 + version: 20.16.1 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -102,31 +102,31 @@ importers: version: 0.20.2 eslint: specifier: ^8.48.0 - version: 8.57.1 + version: 8.57.0 eslint-plugin-mocha: specifier: ^10.2.0 - version: 10.5.0(eslint@8.57.1) + version: 10.5.0(eslint@8.57.0) mocha: specifier: ^10.3.0 version: 10.7.3 nodemon: specifier: ^3.0.2 - version: 3.1.5 + version: 3.1.4 ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@20.16.5)(typescript@5.6.2) + version: 10.9.2(@types/node@20.16.1)(typescript@5.5.4) tsup: specifier: ^8.0.1 - version: 8.3.0(postcss@8.4.47)(tsx@4.19.1)(typescript@5.6.2) + version: 8.2.4(postcss@8.4.45)(tsx@4.17.0)(typescript@5.5.4) tsx: specifier: ^4.11.0 - version: 4.19.1 + version: 4.17.0 typescript: specifier: ^5.2.2 - version: 5.6.2 + version: 5.5.4 vitest: specifier: ^2.0.5 - version: 2.1.1(@types/node@20.16.5)(jsdom@20.0.3) + version: 2.0.5(@types/node@20.16.1)(jsdom@20.0.3) packages/deployer: dependencies: @@ -160,38 +160,38 @@ importers: version: 22.5.5 tsx: specifier: ^4.11.0 - version: 4.19.1 + version: 4.17.0 typescript: specifier: ^5.3.3 - version: 5.6.2 + version: 5.5.4 packages/eslint-config: dependencies: eslint-plugin-unused-imports: specifier: ^3.0.0 - version: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1) + version: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0) devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^6.11.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^6.11.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.6.2) + version: 6.21.0(eslint@8.57.0)(typescript@5.5.4) '@vercel/style-guide': specifier: ^5.1.0 - version: 5.2.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.2) + version: 5.2.0(eslint@8.57.0)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)))(prettier@3.3.3)(typescript@5.5.4) eslint-config-prettier: specifier: ^9.0.0 - version: 9.1.0(eslint@8.57.1) + version: 9.1.0(eslint@8.57.0) eslint-config-turbo: specifier: ^2.1.2 - version: 2.1.2(eslint@8.57.1) + version: 2.1.2(eslint@8.57.0) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 typescript: specifier: ^5.2.2 - version: 5.6.2 + version: 5.5.4 packages/react: dependencies: @@ -209,7 +209,7 @@ importers: version: 2.9.0(get-starknet-core@3.3.3(starknet@6.11.0))(react@18.3.1)(starknet@6.11.0) '@tanstack/react-query': specifier: ^5.55.4 - version: 5.56.2(react@18.3.1) + version: 5.55.4(react@18.3.1) get-starknet-core: specifier: ^3.3.0 version: 3.3.3(starknet@6.11.0) @@ -237,38 +237,86 @@ importers: version: 6.5.0 '@testing-library/react': specifier: ^16.0.1 - version: 16.0.1(@testing-library/dom@10.4.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/react-hooks': specifier: ^8.0.1 - version: 8.0.1(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react-test-renderer@18.3.1(react@18.3.1))(react@18.3.1) + version: 8.0.1(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react-test-renderer@18.3.1(react@18.3.1))(react@18.3.1) '@types/react': specifier: ^18 - version: 18.3.7 + version: 18.3.4 dotenv: specifier: ^16.4.5 version: 16.4.5 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.5.5) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 nodemon: specifier: ^3.0.2 - version: 3.1.5 + version: 3.1.4 react-test-renderer: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) - ts-jest: - specifier: ^29.1.1 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.5))(typescript@5.5.4) typescript: specifier: ^5.3.3 - version: 5.6.2 + version: 5.5.4 vitest: specifier: ^2.0.5 version: 2.0.5(@types/node@22.5.5)(jsdom@20.0.3) + packages/test: + devDependencies: + '@ark-project/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@ark-project/typescript-config': + specifier: workspace:* + version: link:../typescript-config + '@starknet-react/chains': + specifier: ^0.1.7 + version: 0.1.7 + '@starknet-react/core': + specifier: ^2.8.1 + version: 2.9.0(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.11.0) + '@tanstack/react-query': + specifier: ^5.55.4 + version: 5.55.4(react@18.3.1) + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.0 + '@testing-library/jest-dom': + specifier: ^6.5.0 + version: 6.5.0 + '@testing-library/react': + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.4.0)(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@testing-library/react-hooks': + specifier: ^8.0.1 + version: 8.0.1(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react-test-renderer@18.3.1(react@18.3.1))(react@18.3.1) + '@types/react': + specifier: ^18 + version: 18.3.4 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + jest-environment-jsdom: + specifier: ^29.7.0 + version: 29.7.0 + react: + specifier: ^18 + version: 18.3.1 + react-dom: + specifier: ^18 + version: 18.3.1(react@18.3.1) + react-test-renderer: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + starknet: + specifier: ^6.9.0 + version: 6.11.0 + typescript: + specifier: ^5.3.3 + version: 5.5.4 + packages/typescript-config: {} packages: @@ -302,8 +350,8 @@ packages: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + '@babel/generator@7.25.5': + resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.2': @@ -320,6 +368,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} @@ -336,80 +388,174 @@ packages: resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.6': - resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + '@babel/parser@7.25.4': + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.25.6': - resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.4': + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.25.4': + resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==} engines: {node: '>=6.9.0'} '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + '@babel/traverse@7.25.4': + resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + '@babel/types@7.25.4': + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} - '@changesets/apply-release-plan@7.0.5': - resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@changesets/apply-release-plan@7.0.4': + resolution: {integrity: sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==} - '@changesets/assemble-release-plan@6.0.4': - resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + '@changesets/assemble-release-plan@6.0.3': + resolution: {integrity: sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==} '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - '@changesets/cli@2.27.8': - resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + '@changesets/cli@2.27.7': + resolution: {integrity: sha512-6lr8JltiiXPIjDeYg4iM2MeePP6VN/JkmqBsVA5XRiy01hGS3y629LtSDvKcycj/w/5Eur1rEwby/MjcYS+e2A==} hasBin: true - '@changesets/config@3.0.3': - resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + '@changesets/config@3.0.2': + resolution: {integrity: sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.2': - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + '@changesets/get-dependents-graph@2.1.1': + resolution: {integrity: sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==} - '@changesets/get-release-plan@4.0.4': - resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + '@changesets/get-release-plan@4.0.3': + resolution: {integrity: sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.1': - resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + '@changesets/git@3.0.0': + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + '@changesets/logger@0.1.0': + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} '@changesets/parse@0.4.0': resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - '@changesets/pre@2.0.1': - resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + '@changesets/pre@2.0.0': + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - '@changesets/read@0.6.1': - resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + '@changesets/read@0.6.0': + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - '@changesets/should-skip-package@0.1.1': - resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + '@changesets/should-skip-package@0.1.0': + resolution: {integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} @@ -417,8 +563,8 @@ packages: '@changesets/types@6.0.0': resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - '@changesets/write@0.3.2': - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@changesets/write@0.3.1': + resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} @@ -857,20 +1003,20 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead @@ -895,18 +1041,76 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/environment@29.7.0': resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@29.7.0': resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -977,10 +1181,6 @@ packages: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} - '@noble/hashes@1.5.0': - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} - engines: {node: ^14.21.3 || >=16} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -993,47 +1193,43 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - - '@oven/bun-darwin-aarch64@1.1.28': - resolution: {integrity: sha512-nshua/2v/9g5wOn0pDexSbhFuLZihklKKIZmtV7PicX1ARluv0h+5LJd8w7u2IfYRxJF34xh/1BAb+QF6npPvw==} + '@oven/bun-darwin-aarch64@1.1.25': + resolution: {integrity: sha512-E7/y3K+8IcH+/i0OBPtVUmA6WfPaixR3SCm04QPCkSiekrNVftVOzkQaShmz40QsdvsFjK/5oVwCg39wCuo+7A==} cpu: [arm64] os: [darwin] - '@oven/bun-darwin-x64-baseline@1.1.28': - resolution: {integrity: sha512-2LWuwaV8ydhaxJQQNmfNVTyltbYUkguNLzl13yR6rDFv3PajcVnvLQFczJdIvrUXjQy+qZyA1hn0dJABbyo2UA==} + '@oven/bun-darwin-x64-baseline@1.1.25': + resolution: {integrity: sha512-JbUSBI+CJjsAvkIeE7O9z7FEH1qjcsssn7iI4KmYoZEJK66/gnkVRhqfLNSUKEPdaEK3PyDB7UE4EAJlrcNj9g==} cpu: [x64] os: [darwin] - '@oven/bun-darwin-x64@1.1.28': - resolution: {integrity: sha512-sQ5YSnPhBNvyPJ3I+McvaUWB6TEsAVg+x2z7ddVZV/jmeeQYwcakYUAxIHYH7nW+SLfJ0CQZO2BmTjXgt3sISA==} + '@oven/bun-darwin-x64@1.1.25': + resolution: {integrity: sha512-xL4P+TJk7acIz4x6CKIF6BH97mjdRvwh3a3S5EsaxsNXnFFvBNPFpwEGhITCtHPSURj4x34mZq4v63znZcseNQ==} cpu: [x64] os: [darwin] - '@oven/bun-linux-aarch64@1.1.28': - resolution: {integrity: sha512-FPtMJ3KoWz+D5BsIo5o/eT4a0usFFAkHGJzZUHY9LUc9AfuI9fpM34Pg1OI6tjy11TVhMTgi/rGGqChwVGfHFg==} + '@oven/bun-linux-aarch64@1.1.25': + resolution: {integrity: sha512-vZzqRb+LRiQd5SRvRde0ZsFFh1vZIy2tH3KNOxuQp/QmXLNNibmA+vNdCszeRlm3a2QKaioVLhHmuh6kpL5zhw==} cpu: [arm64] os: [linux] - '@oven/bun-linux-x64-baseline@1.1.28': - resolution: {integrity: sha512-A6sI60sT3VeP8vSIKt7rdcUm0L6OHLx9e+fIJDymDLFMqGPRBQEiZNFJ6B4aUIrjJkjxzlXaxc51upTkQbOGsw==} + '@oven/bun-linux-x64-baseline@1.1.25': + resolution: {integrity: sha512-9Kv1Yte/UxBdFODLXttxHBvy/k/DlzyOt4GZkYsL0h9G0ZrOucTfTpotKR2ElDszzUtQbNYOw9UYJ7OUnDkdZA==} cpu: [x64] os: [linux] - '@oven/bun-linux-x64@1.1.28': - resolution: {integrity: sha512-tufL1ueIIfkjve16eZyK6BzLcWsCdAb1x9gvusBsOCNUx+L8I910hqF5HyCDCJMAuK6kaF1r+/KHmWQdBbOV9g==} + '@oven/bun-linux-x64@1.1.25': + resolution: {integrity: sha512-err75vLLEXW00BvZU37mYzxzzkP0+XWZlRYS0bqVrLQeQFAuXPohuOUFKLD0UXSTtqiwSnedZQkBHFWxp3O7Sg==} cpu: [x64] os: [linux] - '@oven/bun-windows-x64-baseline@1.1.28': - resolution: {integrity: sha512-pwMweAWxbi2ZQ61YvOLmvh52FGflQt24lJU4/brwGF+5bqhgcLiubtnwDIBFek2srp2nDsrsXhpZzkA0TheVsg==} + '@oven/bun-windows-x64-baseline@1.1.25': + resolution: {integrity: sha512-hNYQFYSRx/JdMZDfqFLCQSm/nS9/JPpz7aBGuL6C1HpT0cvuPuxxpK7KnaWfrj+ws0BX2Id/s4hrdUNfbovR5Q==} cpu: [x64] os: [win32] - '@oven/bun-windows-x64@1.1.28': - resolution: {integrity: sha512-BAfoHDYPDtt9qKtPX5Xv7TZOKND5WbXk/LVnC3cGEEmo9Gym/vIwfVG9xMoy1mVdRkmayY0eFCmW2VBlsmnU8g==} + '@oven/bun-windows-x64@1.1.25': + resolution: {integrity: sha512-Gfrnwn8s+juDiLa0pdq2RnKsAZY4oSxNrQmopZu044V0EmpLKJJWE9llHki/33ezVFXamiyJ0MJIfFeLflC0Kg==} cpu: [x64] os: [win32] @@ -1045,100 +1241,97 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rollup/rollup-android-arm-eabi@4.21.3': - resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} + '@rollup/rollup-android-arm-eabi@4.21.0': + resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.21.3': - resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + '@rollup/rollup-android-arm64@4.21.0': + resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.21.3': - resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + '@rollup/rollup-darwin-arm64@4.21.0': + resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.21.3': - resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + '@rollup/rollup-darwin-x64@4.21.0': + resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.21.3': - resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.21.3': - resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + '@rollup/rollup-linux-arm-musleabihf@4.21.0': + resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.21.3': - resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + '@rollup/rollup-linux-arm64-gnu@4.21.0': + resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.21.3': - resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + '@rollup/rollup-linux-arm64-musl@4.21.0': + resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': - resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.21.3': - resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + '@rollup/rollup-linux-riscv64-gnu@4.21.0': + resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.21.3': - resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + '@rollup/rollup-linux-s390x-gnu@4.21.0': + resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.21.3': - resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + '@rollup/rollup-linux-x64-gnu@4.21.0': + resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.21.3': - resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + '@rollup/rollup-linux-x64-musl@4.21.0': + resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.21.3': - resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + '@rollup/rollup-win32-arm64-msvc@4.21.0': + resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.21.3': - resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + '@rollup/rollup-win32-ia32-msvc@4.21.0': + resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.21.3': - resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + '@rollup/rollup-win32-x64-msvc@4.21.0': + resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - '@scure/base@1.1.9': - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + '@scure/base@1.1.7': + resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - '@scure/bip39@1.4.0': - resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} '@scure/starknet@0.3.0': resolution: {integrity: sha512-Ma66yZlwa5z00qI5alSxdWtIpky5LBhy22acVFdoC5kwwbd9uDyMWEYzWHdNyKmQg9t5Y2UOXzINMeb3yez+Gw==} @@ -1168,11 +1361,11 @@ packages: react: ^18.0 starknet: ^5.25.0 - '@tanstack/query-core@5.56.2': - resolution: {integrity: sha512-gor0RI3/R5rVV3gXfddh1MM+hgl0Z4G7tj6Xxpq6p2I03NGPaJ8dITY9Gz05zYYb/EJq9vPas/T4wn9EaDPd4Q==} + '@tanstack/query-core@5.55.4': + resolution: {integrity: sha512-uoRqNnRfzOH4OMIoxj8E2+Us89UIGXfau981qYJWsNMkFS1GXR4UIyzUTVGq4N7SDLHgFPpo6IOazqUV5gkMZA==} - '@tanstack/react-query@5.56.2': - resolution: {integrity: sha512-SR0GzHVo6yzhN72pnRhkEFRAHMsUo5ZPzAxfTMvUxFIDVS6W9LYUp6nXW3fcHVdg0ZJl8opSH85jqahvm6DSVg==} + '@tanstack/react-query@5.55.4': + resolution: {integrity: sha512-e3uX5XkLD9oTV66/VsVpkYz3Ds/ps/Yk+V5d89xthAbtNIKKBEm4FdNb9yISFzGEGezUzVO68qmfmiSrtScvsg==} peerDependencies: react: ^18 || ^19 @@ -1234,14 +1427,26 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/bun@1.1.9': - resolution: {integrity: sha512-SXJRejXpmAc3qxyN/YS4/JGWEzLf4dDBa5fLtRDipQXHqNccuMU4EUYCooXNTsylG0DmwFQsGgEDHxZF+3DqRw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/bun@1.1.8': + resolution: {integrity: sha512-PIwVFQKPviksiibobyvcWtMvMFMTj91T8dQEh9l1P3Ypr3ZuVn9w7HSr+5mTNrPqD1xpdDLEErzZPU8gqHBu6g==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -1267,14 +1472,8 @@ packages: '@types/node@20.12.14': resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} - '@types/node@20.16.5': - resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} - - '@types/node@22.5.5': - resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} - - '@types/node@22.5.5': - resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + '@types/node@20.16.1': + resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==} '@types/node@22.5.5': resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} @@ -1282,11 +1481,11 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/prop-types@15.7.13': - resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - '@types/react@18.3.7': - resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==} + '@types/react@18.3.4': + resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1415,35 +1614,23 @@ packages: typescript: optional: true - '@vitest/expect@2.1.1': - resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - - '@vitest/mocker@2.1.1': - resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} - peerDependencies: - '@vitest/spy': 2.1.1 - msw: ^2.3.5 - vite: ^5.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/pretty-format@2.1.1': - resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - '@vitest/runner@2.1.1': - resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} - '@vitest/snapshot@2.1.1': - resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} - '@vitest/spy@2.1.1': - resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/utils@2.1.1': - resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} @@ -1472,8 +1659,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} acorn@8.12.1: @@ -1492,12 +1679,16 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -1541,10 +1732,6 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - aria-query@5.3.1: - resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} - engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -1602,9 +1789,33 @@ packages: resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} engines: {node: '>=4'} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1635,19 +1846,24 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - bun-types@1.1.27: - resolution: {integrity: sha512-rHXAiIDefeMS/fleNM1rRDYqolJGNRdch3+AuCRwcZWaqTa1vjGBNsahH/HVV7Y82frllYhJomCVSEiHzLzkgg==} + bun-types@1.1.25: + resolution: {integrity: sha512-WpRb8/N3S5IE8UYdIn39+0Is1XzxsC78+MCe5cIdaer0lfFs6+DREtQH9TM6KJNKTxBYDvbx81RwbvxS5+CkVQ==} - bun-types@1.1.28: - resolution: {integrity: sha512-XiWHzHZIxkgssHSUwJVrkUDHvwhHzE9mrFUMXZ3BKqNiGzL0n/fB/XUQZibcHjg0SvW/Tt5WUNeKmiM9njuy/w==} + bun-types@1.1.26: + resolution: {integrity: sha512-n7jDe62LsB2+WE8Q8/mT3azkPaatKlj/2MyP6hi3mKvPz9oPpB6JW/Ll6JHtNLudasFFuvfgklYSE+rreGvBjw==} - bun@1.1.28: - resolution: {integrity: sha512-grJam/0GtwFqI+d4gRshk0CNSLwv5H0cRmdtFVjxrC3FlzMD6XBQ5/k9i23byQzlxnqZhn99dzShN9pwG+zC+g==} - cpu: [arm64, x64] + bun@1.1.25: + resolution: {integrity: sha512-N+KvGq6jcA88QgFVoOMSr2s4sZ9u+R7Tn6Hci25mdygZxa3jgaS91PMNxpEJKkyTBLOhH5E8erx+tqtRLyFbJA==} os: [darwin, linux, win32] hasBin: true @@ -1669,12 +1885,16 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001660: - resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -1696,6 +1916,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -1711,6 +1935,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -1722,6 +1949,13 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1770,6 +2004,11 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -1827,8 +2066,8 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1843,6 +2082,14 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -1854,6 +2101,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -1878,10 +2129,18 @@ packages: resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} engines: {node: '>=12.20'} + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + detect-newline@4.0.1: resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -1932,8 +2191,12 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.25: - resolution: {integrity: sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==} + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2008,8 +2271,8 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -2049,21 +2312,15 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.6.3: - resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - eslint-module-utils@2.11.0: - resolution: {integrity: sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==} + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2089,8 +2346,8 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import@2.30.0: - resolution: {integrity: sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==} + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2112,11 +2369,11 @@ packages: jest: optional: true - eslint-plugin-jsx-a11y@6.10.0: - resolution: {integrity: sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==} + eslint-plugin-jsx-a11y@6.9.0: + resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} engines: {node: '>=4.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 eslint-plugin-mocha@10.5.0: resolution: {integrity: sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==} @@ -2143,8 +2400,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.36.1: - resolution: {integrity: sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==} + eslint-plugin-react@7.35.0: + resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -2205,8 +2462,8 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -2249,6 +2506,18 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2272,13 +2541,8 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.3.0: - resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -2306,6 +2570,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2380,6 +2647,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-starknet-core@3.3.3: resolution: {integrity: sha512-IscL4lAigJpc/9Idkg07sdyUOXkB+/goTDQm8EhMGn/nIAW4rn04d+D47ils75drNQIfZZKDIIZrWrbIKvjoWA==} peerDependencies: @@ -2396,12 +2667,16 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} @@ -2497,6 +2772,9 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -2512,6 +2790,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -2534,6 +2816,11 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2586,9 +2873,6 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} - is-bun-module@1.2.1: - resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -2616,6 +2900,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -2671,6 +2959,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -2720,12 +3012,78 @@ packages: peerDependencies: ws: '*' + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-jsdom@29.7.0: resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2735,18 +3093,93 @@ packages: canvas: optional: true - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -2822,6 +3255,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -2832,6 +3269,10 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2847,6 +3288,10 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + loading-cli@1.1.2: resolution: {integrity: sha512-M1ntfXHpdGoQxfaqKBOQPwSrTr9EIoTgj664Q9UVSbSnJvAFdribo+Ij//1jvACgrGHaTvfKoD9PG3NOxGj44g==} @@ -2882,8 +3327,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lossless-json@4.0.2: - resolution: {integrity: sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA==} + lossless-json@4.0.1: + resolution: {integrity: sha512-l0L+ppmgPDnb+JGxNLndPtJZGNf6+ZmVaQzoxQm3u6TXmhdnsA+YtdVR8DjzZd/em58686CQhOFDPewfJ4l7MA==} loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -2904,9 +3349,16 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2930,6 +3382,10 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2965,6 +3421,9 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2996,11 +3455,14 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - nodemon@3.1.5: - resolution: {integrity: sha512-V5UtfYc7hjFD4SI3EzD5TR8ChAHEZ+Ns7Z5fBk8fAbTVAj+q3G+w7sHJrHxXBkVn6ApLVTljau8wfHwqmGUjMw==} + nodemon@3.1.4: + resolution: {integrity: sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==} engines: {node: '>=10'} hasBin: true @@ -3015,6 +3477,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nwsapi@2.2.12: resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} @@ -3064,6 +3530,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3106,9 +3576,6 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - package-manager-detector@0.2.0: - resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} - pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} @@ -3135,6 +3602,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==} @@ -3153,17 +3624,13 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -3172,6 +3639,10 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -3198,10 +3669,14 @@ packages: yaml: optional: true - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} + preferred-pm@3.1.4: + resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} + engines: {node: '>=10'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3237,6 +3712,10 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -3253,6 +3732,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -3352,6 +3834,10 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3363,6 +3849,10 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} @@ -3383,8 +3873,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.21.3: - resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + rollup@4.21.0: + resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3402,8 +3892,8 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} safer-buffer@2.1.2: @@ -3480,6 +3970,9 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3499,6 +3992,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3545,6 +4041,10 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3589,10 +4089,18 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3637,6 +4145,10 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -3653,13 +4165,6 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - - tinyglobby@0.2.6: - resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} - engines: {node: '>=12.0.0'} - tinypool@1.0.1: resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3676,6 +4181,9 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -3745,8 +4253,8 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tsup@8.3.0: - resolution: {integrity: sha512-ALscEeyS03IomcuNdFdc0YWGVIkwH1Ws7nfTbAPuoILvEV2hpGQAY72LIOjglGo4ShWpZfpBqP/jpQVCzqYQag==} + tsup@8.2.4: + resolution: {integrity: sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -3770,8 +4278,8 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tsx@4.19.1: - resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + tsx@4.17.0: + resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} engines: {node: '>=18.0.0'} hasBin: true @@ -3821,6 +4329,10 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -3845,8 +4357,8 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true @@ -3895,24 +4407,28 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - viem@2.21.9: - resolution: {integrity: sha512-fWPDX2ABEo/mLiDN+wsmYJDJk0a/ZCafquxInR2+HZv/7UTgHbLgjZs4SotpEeFAYjgVThJ7A9TPmrRjaaYqvw==} + viem@2.20.0: + resolution: {integrity: sha512-cM4vs81HnSNbfceI1MLkx4pCVzbVjl9xiNSv5SCutYjUyFFOVSPDlEyhpg2iHinxx1NM4Qne3END5eLT8rvUdg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - vite-node@2.1.1: - resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.4.6: - resolution: {integrity: sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==} + vite@5.4.3: + resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3942,15 +4458,15 @@ packages: terser: optional: true - vitest@2.1.1: - resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.1 - '@vitest/ui': 2.1.1 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3971,6 +4487,9 @@ packages: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -4020,6 +4539,10 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-pm@2.2.0: + resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} + engines: {node: '>=8.15'} + which-typed-array@1.1.15: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} @@ -4064,6 +4587,10 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ws@8.17.1: resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} @@ -4076,18 +4603,6 @@ packages: 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 - xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -4150,7 +4665,7 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.1.0 + picocolors: 1.0.1 '@babel/compat-data@7.25.4': {} @@ -4158,33 +4673,33 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 + '@babel/generator': 7.25.5 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.6 - '@babel/parser': 7.25.6 + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.4 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.1)': + '@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.0)': dependencies: '@babel/core': 7.25.2 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.1 + eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/generator@7.25.6': + '@babel/generator@7.25.5': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.25.4 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -4199,8 +4714,8 @@ snapshots: '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 transitivePeerDependencies: - supports-color @@ -4210,14 +4725,17 @@ snapshots: '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/traverse': 7.25.4 transitivePeerDependencies: - supports-color + '@babel/helper-plugin-utils@7.24.8': + optional: true + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 transitivePeerDependencies: - supports-color @@ -4227,56 +4745,162 @@ snapshots: '@babel/helper-validator-option@7.24.8': {} - '@babel/helpers@7.25.6': + '@babel/helpers@7.25.0': dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/types': 7.25.4 '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.1.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.4': + dependencies: + '@babel/types': 7.25.4 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true - '@babel/parser@7.25.6': + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': dependencies: - '@babel/types': 7.25.6 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + optional: true - '@babel/runtime@7.25.6': + '@babel/runtime@7.25.4': dependencies: regenerator-runtime: 0.14.1 '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 - '@babel/traverse@7.25.6': + '@babel/traverse@7.25.4': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 + '@babel/generator': 7.25.5 + '@babel/parser': 7.25.4 '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.3.7(supports-color@5.5.0) + '@babel/types': 7.25.4 + debug: 4.3.6(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.6': + '@babel/types@7.25.4': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@changesets/apply-release-plan@7.0.5': + '@bcoe/v8-coverage@0.2.3': + optional: true + + '@changesets/apply-release-plan@7.0.4': dependencies: - '@changesets/config': 3.0.3 + '@babel/runtime': 7.25.4 + '@changesets/config': 3.0.2 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.1 - '@changesets/should-skip-package': 0.1.1 + '@changesets/git': 3.0.0 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 @@ -4287,11 +4911,12 @@ snapshots: resolve-from: 5.0.0 semver: 7.6.3 - '@changesets/assemble-release-plan@6.0.4': + '@changesets/assemble-release-plan@6.0.3': dependencies: + '@babel/runtime': 7.25.4 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 + '@changesets/get-dependents-graph': 2.1.1 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.6.3 @@ -4300,44 +4925,46 @@ snapshots: dependencies: '@changesets/types': 6.0.0 - '@changesets/cli@2.27.8': + '@changesets/cli@2.27.7': dependencies: - '@changesets/apply-release-plan': 7.0.5 - '@changesets/assemble-release-plan': 6.0.4 + '@babel/runtime': 7.25.4 + '@changesets/apply-release-plan': 7.0.4 + '@changesets/assemble-release-plan': 6.0.3 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.2 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.4 - '@changesets/git': 3.0.1 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 - '@changesets/should-skip-package': 0.1.1 + '@changesets/get-dependents-graph': 2.1.1 + '@changesets/get-release-plan': 4.0.3 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 + '@changesets/write': 0.3.1 '@manypkg/get-packages': 1.1.3 '@types/semver': 7.5.8 ansi-colors: 4.1.3 + chalk: 2.4.2 ci-info: 3.9.0 enquirer: 2.4.1 external-editor: 3.1.0 fs-extra: 7.0.1 + human-id: 1.0.2 mri: 1.2.0 outdent: 0.5.0 p-limit: 2.3.0 - package-manager-detector: 0.2.0 - picocolors: 1.1.0 + preferred-pm: 3.1.4 resolve-from: 5.0.0 semver: 7.6.3 spawndamnit: 2.0.0 term-size: 2.2.1 - '@changesets/config@3.0.3': + '@changesets/config@3.0.2': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/logger': 0.1.1 + '@changesets/get-dependents-graph': 2.1.1 + '@changesets/logger': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 @@ -4347,60 +4974,67 @@ snapshots: dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.2': + '@changesets/get-dependents-graph@2.1.1': dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.0 + chalk: 2.4.2 + fs-extra: 7.0.1 semver: 7.6.3 - '@changesets/get-release-plan@4.0.4': + '@changesets/get-release-plan@4.0.3': dependencies: - '@changesets/assemble-release-plan': 6.0.4 - '@changesets/config': 3.0.3 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@babel/runtime': 7.25.4 + '@changesets/assemble-release-plan': 6.0.3 + '@changesets/config': 3.0.2 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.1': + '@changesets/git@3.0.0': dependencies: + '@babel/runtime': 7.25.4 '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.8 spawndamnit: 2.0.0 - '@changesets/logger@0.1.1': + '@changesets/logger@0.1.0': dependencies: - picocolors: 1.1.0 + chalk: 2.4.2 '@changesets/parse@0.4.0': dependencies: '@changesets/types': 6.0.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.1': + '@changesets/pre@2.0.0': dependencies: + '@babel/runtime': 7.25.4 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.1': + '@changesets/read@0.6.0': dependencies: - '@changesets/git': 3.0.1 - '@changesets/logger': 0.1.1 + '@babel/runtime': 7.25.4 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 + chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - picocolors: 1.1.0 - '@changesets/should-skip-package@0.1.1': + '@changesets/should-skip-package@0.1.0': dependencies: + '@babel/runtime': 7.25.4 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -4408,8 +5042,9 @@ snapshots: '@changesets/types@6.0.0': {} - '@changesets/write@0.3.2': + '@changesets/write@0.3.1': dependencies: + '@babel/runtime': 7.25.4 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 @@ -4637,17 +5272,17 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: - eslint: 8.57.1 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.1': {} + '@eslint-community/regexpp@4.11.0': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -4658,12 +5293,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@8.57.0': {} - '@humanwhocodes/config-array@0.13.0': + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4675,10 +5310,10 @@ snapshots: '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3)': dependencies: '@babel/core': 7.25.2 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/generator': 7.25.5 + '@babel/parser': 7.25.4 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 prettier: 3.3.3 semver: 7.6.3 transitivePeerDependencies: @@ -4693,48 +5328,203 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/environment@29.7.0': + '@istanbuljs/load-nyc-config@1.1.0': dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.5.5 - jest-mock: 29.7.0 + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + optional: true - '@jest/fake-timers@29.7.0': + '@istanbuljs/schema@0.1.3': + optional: true + + '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 '@types/node': 22.5.5 + chalk: 4.1.2 jest-message-util: 29.7.0 - jest-mock: 29.7.0 jest-util: 29.7.0 + slash: 3.0.0 + optional: true - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/types@29.6.3': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4))': dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 '@types/node': 22.5.5 - '@types/yargs': 17.0.33 + ansi-escapes: 4.3.2 chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + optional: true - '@jridgewell/gen-mapping@0.3.5': + '@jest/environment@29.7.0': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.16.1 + jest-mock: 29.7.0 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + optional: true - '@jridgewell/trace-mapping@0.3.25': + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.16.1 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 22.5.5 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + optional: true + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + optional: true + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + optional: true + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.25.2 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + optional: true + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.16.1 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 @@ -4746,14 +5536,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.25.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.25.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -4801,8 +5591,6 @@ snapshots: '@noble/hashes@1.4.0': {} - '@noble/hashes@1.5.0': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4815,30 +5603,28 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nolyfill/is-core-module@1.0.39': {} - - '@oven/bun-darwin-aarch64@1.1.28': + '@oven/bun-darwin-aarch64@1.1.25': optional: true - '@oven/bun-darwin-x64-baseline@1.1.28': + '@oven/bun-darwin-x64-baseline@1.1.25': optional: true - '@oven/bun-darwin-x64@1.1.28': + '@oven/bun-darwin-x64@1.1.25': optional: true - '@oven/bun-linux-aarch64@1.1.28': + '@oven/bun-linux-aarch64@1.1.25': optional: true - '@oven/bun-linux-x64-baseline@1.1.28': + '@oven/bun-linux-x64-baseline@1.1.25': optional: true - '@oven/bun-linux-x64@1.1.28': + '@oven/bun-linux-x64@1.1.25': optional: true - '@oven/bun-windows-x64-baseline@1.1.28': + '@oven/bun-windows-x64-baseline@1.1.25': optional: true - '@oven/bun-windows-x64@1.1.28': + '@oven/bun-windows-x64@1.1.25': optional: true '@pkgjs/parseargs@0.11.0': @@ -4846,70 +5632,68 @@ snapshots: '@pkgr/core@0.1.1': {} - '@rollup/rollup-android-arm-eabi@4.21.3': + '@rollup/rollup-android-arm-eabi@4.21.0': optional: true - '@rollup/rollup-android-arm64@4.21.3': + '@rollup/rollup-android-arm64@4.21.0': optional: true - '@rollup/rollup-darwin-arm64@4.21.3': + '@rollup/rollup-darwin-arm64@4.21.0': optional: true - '@rollup/rollup-darwin-x64@4.21.3': + '@rollup/rollup-darwin-x64@4.21.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.21.3': + '@rollup/rollup-linux-arm-musleabihf@4.21.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.21.3': + '@rollup/rollup-linux-arm64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.21.3': + '@rollup/rollup-linux-arm64-musl@4.21.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.21.3': + '@rollup/rollup-linux-riscv64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.21.3': + '@rollup/rollup-linux-s390x-gnu@4.21.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.21.3': + '@rollup/rollup-linux-x64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-x64-musl@4.21.3': + '@rollup/rollup-linux-x64-musl@4.21.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.21.3': + '@rollup/rollup-win32-arm64-msvc@4.21.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.21.3': + '@rollup/rollup-win32-ia32-msvc@4.21.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.21.3': + '@rollup/rollup-win32-x64-msvc@4.21.0': optional: true - '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.4': {} - '@scure/base@1.1.9': {} + '@scure/base@1.1.7': {} '@scure/bip32@1.4.0': dependencies: '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 - '@scure/base': 1.1.9 + '@scure/base': 1.1.7 - '@scure/bip39@1.4.0': + '@scure/bip39@1.3.0': dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 '@scure/starknet@0.3.0': dependencies: @@ -4938,7 +5722,7 @@ snapshots: '@starknet-react/core@2.9.0(get-starknet-core@3.3.3(starknet@6.11.0))(react@18.3.1)(starknet@6.11.0)': dependencies: '@starknet-react/chains': 0.1.7 - '@tanstack/react-query': 5.56.2(react@18.3.1) + '@tanstack/react-query': 5.55.4(react@18.3.1) eventemitter3: 5.0.1 get-starknet-core: 3.3.3(starknet@6.11.0) immutable: 4.3.7 @@ -4949,7 +5733,7 @@ snapshots: '@starknet-react/core@2.9.0(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.11.0)': dependencies: '@starknet-react/chains': 0.1.7 - '@tanstack/react-query': 5.56.2(react@18.3.1) + '@tanstack/react-query': 5.55.4(react@18.3.1) eventemitter3: 5.0.1 get-starknet-core: 4.0.0 immutable: 4.3.7 @@ -4957,17 +5741,17 @@ snapshots: starknet: 6.11.0 zod: 3.23.8 - '@tanstack/query-core@5.56.2': {} + '@tanstack/query-core@5.55.4': {} - '@tanstack/react-query@5.56.2(react@18.3.1)': + '@tanstack/react-query@5.55.4(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.56.2 + '@tanstack/query-core': 5.55.4 react: 18.3.1 '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.25.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -4978,31 +5762,31 @@ snapshots: '@testing-library/jest-dom@6.5.0': dependencies: '@adobe/css-tools': 4.4.0 - aria-query: 5.3.1 + aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react-hooks@8.0.1(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react-test-renderer@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react-hooks@8.0.1(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react-test-renderer@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.25.4 react: 18.3.1 react-error-boundary: 3.1.4(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.4 react-dom: 18.3.1(react@18.3.1) react-test-renderer: 18.3.1(react@18.3.1) - '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.25.4 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.7 + '@types/react': 18.3.4 '@tootallnate/once@2.0.0': {} @@ -5016,13 +5800,41 @@ snapshots: '@types/aria-query@5.0.4': {} - '@types/bun@1.1.9': + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + optional: true + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.25.4 + optional: true + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + optional: true + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.4 + optional: true + + '@types/bun@1.1.8': dependencies: - bun-types: 1.1.27 + bun-types: 1.1.26 '@types/estree@1.0.5': {} - '@types/estree@1.0.6': {} + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 22.5.5 + optional: true '@types/istanbul-lib-coverage@2.0.6': {} @@ -5036,7 +5848,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.5.5 + '@types/node': 20.16.1 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 @@ -5050,11 +5862,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.16.5': - dependencies: - undici-types: 6.19.8 - - '@types/node@22.5.5': + '@types/node@20.16.1': dependencies: undici-types: 6.19.8 @@ -5064,11 +5872,11 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/prop-types@15.7.13': {} + '@types/prop-types@15.7.12': {} - '@types/react@18.3.7': + '@types/react@18.3.4': dependencies: - '@types/prop-types': 15.7.13 + '@types/prop-types': 15.7.12 csstype: 3.1.3 '@types/semver@7.5.8': {} @@ -5089,36 +5897,36 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@5.5.0) - eslint: 8.57.1 + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@5.5.0) - eslint: 8.57.1 + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -5132,15 +5940,15 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.2) - debug: 4.3.7(supports-color@5.5.0) - eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -5148,59 +5956,59 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) + tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.2) - eslint: 8.57.1 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.2) - eslint: 8.57.1 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + eslint: 8.57.0 semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -5218,83 +6026,67 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vercel/style-guide@5.2.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.2)': + '@vercel/style-guide@5.2.0(eslint@8.57.0)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)))(prettier@3.3.3)(typescript@5.5.4)': dependencies: '@babel/core': 7.25.2 - '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.1) + '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)) eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0)(typescript@5.5.4) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)))(typescript@5.5.4) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0)(typescript@5.5.4))(eslint@8.57.0) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)))(typescript@5.5.4))(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-testing-library: 6.3.0(eslint@8.57.0)(typescript@5.5.4) eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 48.0.1(eslint@8.57.1) + eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) prettier-plugin-packagejson: 2.5.2(prettier@3.3.3) optionalDependencies: - eslint: 8.57.1 + eslint: 8.57.0 prettier: 3.3.3 - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - eslint-import-resolver-node - eslint-import-resolver-webpack - - eslint-plugin-import-x - jest - supports-color - '@vitest/expect@2.1.1': + '@vitest/expect@2.0.5': dependencies: - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.6(@types/node@20.16.5))': - dependencies: - '@vitest/spy': 2.1.1 - estree-walker: 3.0.3 - magic-string: 0.30.11 - optionalDependencies: - vite: 5.4.6(@types/node@20.16.5) - - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.6(@types/node@22.5.5))': - dependencies: - '@vitest/spy': 2.1.1 - estree-walker: 3.0.3 - magic-string: 0.30.11 - optionalDependencies: - vite: 5.4.6(@types/node@22.5.5) - - '@vitest/pretty-format@2.1.1': + '@vitest/pretty-format@2.0.5': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.1': + '@vitest/runner@2.0.5': dependencies: - '@vitest/utils': 2.1.1 + '@vitest/utils': 2.0.5 pathe: 1.1.2 - '@vitest/snapshot@2.1.1': + '@vitest/snapshot@2.0.5': dependencies: - '@vitest/pretty-format': 2.1.1 + '@vitest/pretty-format': 2.0.5 magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/spy@2.1.1': + '@vitest/spy@2.0.5': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.1': + '@vitest/utils@2.0.5': dependencies: - '@vitest/pretty-format': 2.1.1 + '@vitest/pretty-format': 2.0.5 + estree-walker: 3.0.3 loupe: 3.1.1 tinyrainbow: 1.2.0 @@ -5307,21 +6099,21 @@ snapshots: fs-extra: 10.1.0 yargs: 17.7.2 - abitype@1.0.5(typescript@5.6.2)(zod@3.23.8): + abitype@1.0.5(typescript@5.5.4)(zod@3.23.8): optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 zod: 3.23.8 acorn-globals@7.0.1: dependencies: acorn: 8.12.1 - acorn-walk: 8.3.4 + acorn-walk: 8.3.3 acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 - acorn-walk@8.3.4: + acorn-walk@8.3.3: dependencies: acorn: 8.12.1 @@ -5329,7 +6121,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -5342,9 +6134,14 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + optional: true + ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.0.1: {} ansi-styles@3.2.1: dependencies: @@ -5383,8 +6180,6 @@ snapshots: dependencies: dequal: 2.0.3 - aria-query@5.3.1: {} - array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -5466,7 +6261,69 @@ snapshots: axe-core@4.10.0: {} - axobject-query@4.1.0: {} + axobject-query@3.1.1: + dependencies: + deep-equal: 2.2.3 + + babel-jest@29.7.0(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.25.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.24.8 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + optional: true + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + optional: true + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + optional: true + + babel-preset-jest@29.6.3(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + optional: true balanced-match@1.0.2: {} @@ -5493,33 +6350,41 @@ snapshots: browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001660 - electron-to-chromium: 1.5.25 + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.13 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + optional: true + + buffer-from@1.1.2: + optional: true + builtin-modules@3.3.0: {} - bun-types@1.1.27: + bun-types@1.1.25: dependencies: '@types/node': 20.12.14 '@types/ws': 8.5.12 - bun-types@1.1.28: + bun-types@1.1.26: dependencies: '@types/node': 20.12.14 '@types/ws': 8.5.12 - bun@1.1.28: + bun@1.1.25: optionalDependencies: - '@oven/bun-darwin-aarch64': 1.1.28 - '@oven/bun-darwin-x64': 1.1.28 - '@oven/bun-darwin-x64-baseline': 1.1.28 - '@oven/bun-linux-aarch64': 1.1.28 - '@oven/bun-linux-x64': 1.1.28 - '@oven/bun-linux-x64-baseline': 1.1.28 - '@oven/bun-windows-x64': 1.1.28 - '@oven/bun-windows-x64-baseline': 1.1.28 + '@oven/bun-darwin-aarch64': 1.1.25 + '@oven/bun-darwin-x64': 1.1.25 + '@oven/bun-darwin-x64-baseline': 1.1.25 + '@oven/bun-linux-aarch64': 1.1.25 + '@oven/bun-linux-x64': 1.1.25 + '@oven/bun-linux-x64-baseline': 1.1.25 + '@oven/bun-windows-x64': 1.1.25 + '@oven/bun-windows-x64-baseline': 1.1.25 bundle-require@5.0.0(esbuild@0.23.1): dependencies: @@ -5538,9 +6403,12 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: + optional: true + camelcase@6.3.0: {} - caniuse-lite@1.0.30001660: {} + caniuse-lite@1.0.30001651: {} cardinal@2.1.1: dependencies: @@ -5571,6 +6439,9 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + char-regex@1.0.2: + optional: true + chardet@0.7.0: {} check-error@2.1.1: {} @@ -5589,6 +6460,9 @@ snapshots: ci-info@3.9.0: {} + cjs-module-lexer@1.3.1: + optional: true + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -5605,6 +6479,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + co@4.6.0: + optional: true + + collect-v8-coverage@1.0.2: + optional: true + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -5648,13 +6528,13 @@ snapshots: convert-source-map@2.0.0: {} - create-jest@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + create-jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5662,6 +6542,7 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true create-require@1.1.1: {} @@ -5721,15 +6602,15 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7(supports-color@5.5.0): + debug@4.3.6(supports-color@5.5.0): dependencies: - ms: 2.1.3 + ms: 2.1.2 optionalDependencies: supports-color: 5.5.0 - debug@4.3.7(supports-color@8.1.1): + debug@4.3.6(supports-color@8.1.1): dependencies: - ms: 2.1.3 + ms: 2.1.2 optionalDependencies: supports-color: 8.1.1 @@ -5737,6 +6618,9 @@ snapshots: decimal.js@10.4.3: {} + dedent@1.5.3: + optional: true + deep-eql@5.0.2: {} deep-equal@2.2.3: @@ -5762,6 +6646,9 @@ snapshots: deep-is@0.1.4: {} + deepmerge@4.3.1: + optional: true + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 @@ -5782,8 +6669,14 @@ snapshots: detect-indent@7.0.1: {} + detect-newline@3.1.0: + optional: true + detect-newline@4.0.1: {} + diff-sequences@29.6.3: + optional: true + diff@4.0.2: {} diff@5.2.0: {} @@ -5823,7 +6716,10 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.25: {} + electron-to-chromium@1.5.13: {} + + emittery@0.13.1: + optional: true emoji-regex@8.0.0: {} @@ -6030,7 +6926,7 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - escalade@3.2.0: {} + escalade@3.1.2: {} escape-string-regexp@1.0.5: {} @@ -6046,18 +6942,18 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.0(eslint@8.57.1): + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: - eslint: 8.57.1 + eslint: 8.57.0 - eslint-config-turbo@2.1.2(eslint@8.57.1): + eslint-config-turbo@2.1.2(eslint@8.57.0): dependencies: - eslint: 8.57.1 - eslint-plugin-turbo: 2.1.2(eslint@8.57.1) + eslint: 8.57.0 + eslint-plugin-turbo: 2.1.2(eslint@8.57.0) eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)): dependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-import-resolver-node@0.3.9: dependencies: @@ -6067,54 +6963,51 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) enhanced-resolve: 5.17.1 - eslint: 8.57.1 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 + get-tsconfig: 4.7.6 + is-core-module: 2.15.1 is-glob: 4.0.3 - optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): + eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): dependencies: escape-string-regexp: 1.0.5 - eslint: 8.57.1 + eslint: 8.57.0 ignore: 5.3.2 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -6125,35 +7018,35 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2): + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)))(typescript@5.5.4): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - jest: 29.7.0 + jest: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 axe-core: 4.10.0 - axobject-query: 4.1.0 + axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.19 - eslint: 8.57.1 + eslint: 8.57.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -6162,26 +7055,26 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.0 - eslint-plugin-mocha@10.5.0(eslint@8.57.1): + eslint-plugin-mocha@10.5.0(eslint@8.57.0): dependencies: - eslint: 8.57.1 - eslint-utils: 3.0.0(eslint@8.57.1) + eslint: 8.57.0 + eslint-utils: 3.0.0(eslint@8.57.0) globals: 13.24.0 rambda: 7.5.0 eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1): + eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)))(typescript@5.5.4))(eslint@8.57.0): dependencies: - eslint: 8.57.1 + eslint: 8.57.0 optionalDependencies: - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)))(typescript@5.5.4) - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: - eslint: 8.57.1 + eslint: 8.57.0 - eslint-plugin-react@7.36.1(eslint@8.57.1): + eslint-plugin-react@7.35.0(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -6189,7 +7082,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 - eslint: 8.57.1 + eslint: 8.57.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -6203,10 +7096,10 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@6.3.0(eslint@8.57.1)(typescript@5.6.2): + eslint-plugin-testing-library@6.3.0(eslint@8.57.0)(typescript@5.5.4): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript @@ -6216,18 +7109,18 @@ snapshots: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - eslint-plugin-turbo@2.1.2(eslint@8.57.1): + eslint-plugin-turbo@2.1.2(eslint@8.57.0): dependencies: dotenv: 16.0.3 - eslint: 8.57.1 + eslint: 8.57.0 - eslint-plugin-unicorn@48.0.1(eslint@8.57.1): + eslint-plugin-unicorn@48.0.1(eslint@8.57.0): dependencies: '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) ci-info: 3.9.0 clean-regexp: 1.0.0 - eslint: 8.57.1 + eslint: 8.57.0 esquery: 1.6.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -6240,12 +7133,12 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1): + eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0): dependencies: - eslint: 8.57.1 + eslint: 8.57.0 eslint-rule-composer: 0.3.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) eslint-rule-composer@0.3.0: {} @@ -6259,29 +7152,29 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@8.57.1): + eslint-utils@3.0.0(eslint@8.57.0): dependencies: - eslint: 8.57.1 + eslint: 8.57.0 eslint-visitor-keys: 2.1.0 eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -6333,7 +7226,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.5 esutils@2.0.3: {} @@ -6351,6 +7244,30 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + 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 + + exit@0.1.2: + optional: true + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + optional: true + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -6377,9 +7294,10 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.3.0(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + optional: true fecha@4.2.3: {} @@ -6411,6 +7329,11 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-yarn-workspace-root2@1.2.16: + dependencies: + micromatch: 4.0.8 + pkg-dir: 4.2.0 + flat-cache@3.2.0: dependencies: flatted: 3.3.1 @@ -6490,6 +7413,9 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-package-type@0.1.0: + optional: true + get-starknet-core@3.3.3(starknet@6.11.0): dependencies: '@module-federation/runtime': 0.1.21 @@ -6503,13 +7429,15 @@ snapshots: get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.8.1: + get-tsconfig@4.7.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -6615,18 +7543,21 @@ snapshots: dependencies: whatwg-encoding: 2.0.0 + html-escaper@2.0.2: + optional: true + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -6634,6 +7565,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@5.0.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -6653,6 +7586,12 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + optional: true + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -6705,10 +7644,6 @@ snapshots: dependencies: builtin-modules: 3.3.0 - is-bun-module@1.2.1: - dependencies: - semver: 7.6.3 - is-callable@1.2.7: {} is-core-module@2.15.1: @@ -6731,6 +7666,9 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-generator-fn@2.1.0: + optional: true + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 @@ -6770,6 +7708,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -6816,8 +7756,55 @@ snapshots: dependencies: ws: 8.17.1 - iterator.prototype@1.1.2: - dependencies: + istanbul-lib-coverage@3.2.2: + optional: true + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.25.2 + '@babel/parser': 7.25.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + optional: true + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + optional: true + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + optional: true + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + optional: true + + iterator.prototype@1.1.2: + dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 @@ -6830,18 +7817,12 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 + optional: true jest-circus@29.7.0: dependencies: @@ -6849,7 +7830,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.1 + '@types/node': 22.5.5 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -6868,37 +7849,18 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - supports-color - - jest-cli@29.7.0: - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node optional: true - jest-cli@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + jest-cli@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + create-jest: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + jest-config: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6907,58 +7869,9 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true - jest-cli@29.7.0(@types/node@22.5.5): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.5.5) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.5.5) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.16.1 - ts-node: 10.9.2(@types/node@20.16.1)(typescript@5.5.4) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@22.5.5): + jest-config@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -6984,9 +7897,11 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.5.5 + ts-node: 10.9.2(@types/node@22.5.5)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros - supports-color + optional: true jest-diff@29.7.0: dependencies: @@ -6994,10 +7909,12 @@ snapshots: diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 + optional: true jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 + optional: true jest-each@29.7.0: dependencies: @@ -7006,6 +7923,7 @@ snapshots: jest-get-type: 29.6.3 jest-util: 29.7.0 pretty-format: 29.7.0 + optional: true jest-environment-jsdom@29.7.0: dependencies: @@ -7013,7 +7931,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 22.5.5 + '@types/node': 20.16.1 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -7022,6 +7940,50 @@ snapshots: - supports-color - utf-8-validate + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.5 + jest-mock: 29.7.0 + jest-util: 29.7.0 + optional: true + + jest-get-type@29.6.3: + optional: true + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 22.5.5 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + optional: true + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + optional: true + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + optional: true + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.24.7 @@ -7036,15 +7998,125 @@ snapshots: jest-mock@29.7.0: dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.16.1 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + optional: true + + jest-regex-util@29.6.3: + optional: true + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + optional: true + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + optional: true + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@types/node': 22.5.5 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + optional: true - jest-util@29.7.0: + jest-runtime@29.7.0: dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@types/node': 22.5.5 chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + optional: true + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.25.2 + '@babel/generator': 7.25.5 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + '@babel/types': 7.25.4 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + optional: true + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.16.1 + chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 @@ -7057,61 +8129,40 @@ snapshots: jest-get-type: 29.6.3 leven: 3.1.0 pretty-format: 29.7.0 + optional: true jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.1 + '@types/node': 22.5.5 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 + optional: true jest-worker@29.7.0: dependencies: - '@types/node': 20.16.1 + '@types/node': 22.5.5 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - - jest@29.7.0: - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node optional: true - jest@29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)): + jest@29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.1)(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@22.5.5): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.5.5) + jest-cli: 29.7.0(@types/node@22.5.5)(ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + optional: true jju@1.4.0: {} @@ -7154,7 +8205,7 @@ snapshots: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.18.0 + ws: 8.17.1 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -7202,6 +8253,9 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@3.0.3: + optional: true + kuler@2.0.0: {} language-subtag-registry@0.3.23: {} @@ -7210,6 +8264,9 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + leven@3.1.0: + optional: true + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7221,6 +8278,13 @@ snapshots: load-tsconfig@0.2.5: {} + load-yaml-file@0.2.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + loading-cli@1.1.2: dependencies: colors-cli: 1.0.33 @@ -7252,14 +8316,14 @@ snapshots: '@types/triple-beam': 1.3.5 fecha: 4.2.3 ms: 2.1.3 - safe-stable-stringify: 2.5.0 + safe-stable-stringify: 2.4.3 triple-beam: 1.4.1 loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - lossless-json@4.0.2: {} + lossless-json@4.0.1: {} loupe@3.1.1: dependencies: @@ -7282,8 +8346,18 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + optional: true + make-error@1.3.6: {} + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + optional: true + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -7301,6 +8375,8 @@ snapshots: mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + min-indent@1.0.1: {} minimatch@3.1.2: @@ -7328,7 +8404,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -7348,6 +8424,8 @@ snapshots: mri@1.2.0: {} + ms@2.1.2: {} + ms@2.1.3: {} mz@2.7.0: @@ -7372,12 +8450,15 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-int64@0.4.0: + optional: true + node-releases@2.0.18: {} - nodemon@3.1.5: + nodemon@3.1.4: dependencies: chokidar: 3.6.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -7400,6 +8481,10 @@ snapshots: dependencies: path-key: 3.1.1 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + nwsapi@2.2.12: {} object-assign@4.1.1: {} @@ -7457,6 +8542,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -7496,8 +8585,6 @@ snapshots: package-json-from-dist@1.0.0: {} - package-manager-detector@0.2.0: {} - pako@2.1.0: {} parent-module@1.0.1: @@ -7521,6 +8608,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -7534,33 +8623,42 @@ snapshots: pathval@2.0.0: {} - picocolors@1.1.0: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} - pify@4.0.1: {} pirates@4.0.6: {} + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} - postcss-load-config@6.0.1(postcss@8.4.47)(tsx@4.19.1): + postcss-load-config@6.0.1(postcss@8.4.45)(tsx@4.17.0): dependencies: lilconfig: 3.1.2 optionalDependencies: - postcss: 8.4.47 - tsx: 4.19.1 + postcss: 8.4.45 + tsx: 4.17.0 - postcss@8.4.47: + postcss@8.4.45: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.0.1 source-map-js: 1.2.1 + preferred-pm@3.1.4: + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.2.0 + prelude-ls@1.2.1: {} prettier-plugin-packagejson@2.5.2(prettier@3.3.3): @@ -7570,10 +8668,10 @@ snapshots: optionalDependencies: prettier: 3.3.3 - prettier-plugin-sort-imports@1.8.6(typescript@5.6.2): + prettier-plugin-sort-imports@1.8.6(typescript@5.5.4): dependencies: prettier: 3.3.3 - typescript: 5.6.2 + typescript: 5.5.4 prettier@2.8.8: {} @@ -7591,6 +8689,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + optional: true + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -7605,6 +8709,9 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: + optional: true + querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -7623,7 +8730,7 @@ snapshots: react-error-boundary@3.1.4(react@18.3.1): dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.25.4 react: 18.3.1 react-is@16.13.1: {} @@ -7717,12 +8824,20 @@ snapshots: requires-port@1.0.0: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + optional: true + resolve-from@4.0.0: {} resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.2: + optional: true + resolve@1.19.0: dependencies: is-core-module: 2.15.1 @@ -7746,26 +8861,26 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.21.3: + rollup@4.21.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.3 - '@rollup/rollup-android-arm64': 4.21.3 - '@rollup/rollup-darwin-arm64': 4.21.3 - '@rollup/rollup-darwin-x64': 4.21.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 - '@rollup/rollup-linux-arm-musleabihf': 4.21.3 - '@rollup/rollup-linux-arm64-gnu': 4.21.3 - '@rollup/rollup-linux-arm64-musl': 4.21.3 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 - '@rollup/rollup-linux-riscv64-gnu': 4.21.3 - '@rollup/rollup-linux-s390x-gnu': 4.21.3 - '@rollup/rollup-linux-x64-gnu': 4.21.3 - '@rollup/rollup-linux-x64-musl': 4.21.3 - '@rollup/rollup-win32-arm64-msvc': 4.21.3 - '@rollup/rollup-win32-ia32-msvc': 4.21.3 - '@rollup/rollup-win32-x64-msvc': 4.21.3 + '@rollup/rollup-android-arm-eabi': 4.21.0 + '@rollup/rollup-android-arm64': 4.21.0 + '@rollup/rollup-darwin-arm64': 4.21.0 + '@rollup/rollup-darwin-x64': 4.21.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 + '@rollup/rollup-linux-arm-musleabihf': 4.21.0 + '@rollup/rollup-linux-arm64-gnu': 4.21.0 + '@rollup/rollup-linux-arm64-musl': 4.21.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 + '@rollup/rollup-linux-riscv64-gnu': 4.21.0 + '@rollup/rollup-linux-s390x-gnu': 4.21.0 + '@rollup/rollup-linux-x64-gnu': 4.21.0 + '@rollup/rollup-linux-x64-musl': 4.21.0 + '@rollup/rollup-win32-arm64-msvc': 4.21.0 + '@rollup/rollup-win32-ia32-msvc': 4.21.0 + '@rollup/rollup-win32-x64-msvc': 4.21.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -7787,7 +8902,7 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 - safe-stable-stringify@2.5.0: {} + safe-stable-stringify@2.4.3: {} safer-buffer@2.1.2: {} @@ -7860,6 +8975,9 @@ snapshots: dependencies: semver: 7.6.3 + sisteransi@1.0.5: + optional: true + slash@3.0.0: {} slash@4.0.0: {} @@ -7879,6 +8997,12 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + optional: true + source-map@0.6.1: optional: true @@ -7918,14 +9042,14 @@ snapshots: starknet@6.11.0: dependencies: '@noble/curves': 1.4.2 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 '@scure/starknet': 1.0.0 abi-wan-kanabi: 2.2.3 fetch-cookie: 3.0.1 get-starknet-core: 4.0.0 isomorphic-fetch: 3.0.0 - lossless-json: 4.0.2 + lossless-json: 4.0.1 pako: 2.1.0 starknet-types-07: '@starknet-io/types-js@0.7.7' ts-mixer: 6.0.4 @@ -7939,6 +9063,12 @@ snapshots: dependencies: internal-slot: 1.0.7 + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + optional: true + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -8005,12 +9135,17 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.0.1 strip-bom@3.0.0: {} + strip-bom@4.0.0: + optional: true + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -8052,6 +9187,13 @@ snapshots: term-size@2.2.1: {} + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + optional: true + text-hex@1.0.0: {} text-table@0.2.0: {} @@ -8066,13 +9208,6 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.0: {} - - tinyglobby@0.2.6: - dependencies: - fdir: 6.3.0(picomatch@4.0.2) - picomatch: 4.0.2 - tinypool@1.0.1: {} tinyrainbow@1.2.0: {} @@ -8083,6 +9218,9 @@ snapshots: dependencies: os-tmpdir: 1.0.2 + tmpl@1.0.5: + optional: true + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -8112,85 +9250,22 @@ snapshots: triple-beam@1.4.1: {} - ts-api-utils@1.3.0(typescript@5.6.2): - dependencies: - typescript: 5.6.2 - - ts-interface-checker@0.1.13: {} - - ts-mixer@6.0.4: {} - - ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2): + ts-api-utils@1.3.0(typescript@5.5.4): dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.5 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - semver: 7.6.3 typescript: 5.5.4 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.25.2 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - esbuild: 0.20.2 - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.5.5))(typescript@5.5.4): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.5.5) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.5.4 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.25.2 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) + ts-interface-checker@0.1.13: {} ts-mixer@6.0.4: {} - ts-node@10.9.2(@types/node@22.5.5)(typescript@5.6.2): + ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.5.5 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - ts-node@10.9.2(@types/node@22.5.5)(typescript@5.5.4): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.5.5 + '@types/node': 20.16.1 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -8230,42 +9305,42 @@ snapshots: tslib@2.7.0: {} - tsup@8.3.0(postcss@8.4.47)(tsx@4.19.1)(typescript@5.6.2): + tsup@8.2.4(postcss@8.4.45)(tsx@4.17.0)(typescript@5.5.4): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) cac: 6.7.14 chokidar: 3.6.0 consola: 3.2.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) esbuild: 0.23.1 execa: 5.1.1 + globby: 11.1.0 joycon: 3.1.1 - picocolors: 1.1.0 - postcss-load-config: 6.0.1(postcss@8.4.47)(tsx@4.19.1) + picocolors: 1.0.1 + postcss-load-config: 6.0.1(postcss@8.4.45)(tsx@4.17.0) resolve-from: 5.0.0 - rollup: 4.21.3 + rollup: 4.21.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 - tinyglobby: 0.2.6 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.4.47 - typescript: 5.6.2 + postcss: 8.4.45 + typescript: 5.5.4 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - tsutils@3.21.0(typescript@5.6.2): + tsutils@3.21.0(typescript@5.5.4): dependencies: tslib: 1.14.1 - typescript: 5.6.2 + typescript: 5.5.4 - tsx@4.19.1: + tsx@4.17.0: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.8.1 + get-tsconfig: 4.7.6 optionalDependencies: fsevents: 2.3.3 @@ -8304,6 +9379,9 @@ snapshots: type-fest@0.20.2: {} + type-fest@0.21.3: + optional: true + type-fest@0.6.0: {} type-fest@0.8.1: {} @@ -8340,7 +9418,7 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript@5.6.2: {} + typescript@5.5.4: {} unbox-primitive@1.0.2: dependencies: @@ -8364,8 +9442,8 @@ snapshots: update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: browserslist: 4.23.3 - escalade: 3.2.0 - picocolors: 1.1.0 + escalade: 3.1.2 + picocolors: 1.0.1 uri-js@4.4.1: dependencies: @@ -8382,33 +9460,58 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + optional: true + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - viem@2.21.9(typescript@5.6.2)(zod@3.23.8): + viem@2.20.0(typescript@5.5.4)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.5(typescript@5.6.2)(zod@3.23.8) + '@scure/bip39': 1.3.0 + abitype: 1.0.5(typescript@5.5.4)(zod@3.23.8) isows: 1.0.4(ws@8.17.1) webauthn-p256: 0.0.5 ws: 8.17.1 optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - utf-8-validate - zod + vite-node@2.0.5(@types/node@20.16.1): + dependencies: + cac: 6.7.14 + debug: 4.3.6(supports-color@5.5.0) + pathe: 1.1.2 + tinyrainbow: 1.2.0 + vite: 5.4.3(@types/node@20.16.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@2.0.5(@types/node@22.5.5): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) pathe: 1.1.2 tinyrainbow: 1.2.0 vite: 5.4.3(@types/node@22.5.5) @@ -8426,49 +9529,48 @@ snapshots: vite@5.4.3(@types/node@20.16.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.21.3 + postcss: 8.4.45 + rollup: 4.21.0 optionalDependencies: '@types/node': 20.16.1 fsevents: 2.3.3 - vitest@2.0.5(@types/node@22.5.5)(jsdom@20.0.3): + vite@5.4.3(@types/node@22.5.5): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.21.3 + postcss: 8.4.45 + rollup: 4.21.0 optionalDependencies: '@types/node': 22.5.5 fsevents: 2.3.3 - vitest@2.1.1(@types/node@20.16.5)(jsdom@20.0.3): + vitest@2.0.5(@types/node@20.16.1)(jsdom@20.0.3): dependencies: - '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.6(@types/node@20.16.5)) - '@vitest/pretty-format': 2.1.1 - '@vitest/runner': 2.1.1 - '@vitest/snapshot': 2.1.1 - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 chai: 5.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) + execa: 8.0.1 magic-string: 0.30.11 pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 - tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.3(@types/node@22.5.5) - vite-node: 2.0.5(@types/node@22.5.5) + vite: 5.4.3(@types/node@20.16.1) + vite-node: 2.0.5(@types/node@20.16.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.5.5 + '@types/node': 20.16.1 jsdom: 20.0.3 transitivePeerDependencies: - less - lightningcss - - msw - sass - sass-embedded - stylus @@ -8476,26 +9578,26 @@ snapshots: - supports-color - terser - vitest@2.1.1(@types/node@22.5.5)(jsdom@20.0.3): + vitest@2.0.5(@types/node@22.5.5)(jsdom@20.0.3): dependencies: - '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.6(@types/node@22.5.5)) - '@vitest/pretty-format': 2.1.1 - '@vitest/runner': 2.1.1 - '@vitest/snapshot': 2.1.1 - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 chai: 5.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) + execa: 8.0.1 magic-string: 0.30.11 pathe: 1.1.2 std-env: 3.7.0 tinybench: 2.9.0 - tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.6(@types/node@22.5.5) - vite-node: 2.1.1(@types/node@22.5.5) + vite: 5.4.3(@types/node@22.5.5) + vite-node: 2.0.5(@types/node@22.5.5) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.5.5 @@ -8503,7 +9605,6 @@ snapshots: transitivePeerDependencies: - less - lightningcss - - msw - sass - sass-embedded - stylus @@ -8515,6 +9616,11 @@ snapshots: dependencies: xml-name-validator: 4.0.0 + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + optional: true + web-streams-polyfill@3.3.3: {} webauthn-p256@0.0.5: @@ -8582,6 +9688,11 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 + which-pm@2.2.0: + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 @@ -8618,7 +9729,7 @@ snapshots: logform: 2.6.1 one-time: 1.0.0 readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 + safe-stable-stringify: 2.4.3 stack-trace: 0.0.10 triple-beam: 1.4.1 winston-transport: 4.7.1 @@ -8641,9 +9752,13 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.1: {} + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + optional: true - ws@8.18.0: {} + ws@8.17.1: {} xml-name-validator@4.0.0: {} @@ -8669,7 +9784,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.2.0 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -8679,7 +9794,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.2.0 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/turbo.json b/turbo.json index 9dafe42a7..822314520 100644 --- a/turbo.json +++ b/turbo.json @@ -1,16 +1,9 @@ { "$schema": "https://turbo.build/schema.json", - "globalDependencies": [ - "**/.env.*local" - ], - "globalDotEnv": [ - ".env" - ], - "pipeline": { + "globalDependencies": ["**/.env.*local"], + "tasks": { "build:packages": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "outputs": [ ".next/**", "!.next/cache/**", @@ -20,9 +13,7 @@ }, "build": { "cache": false, - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "outputs": [ ".next/**", "!.next/cache/**", @@ -31,42 +22,26 @@ ] }, "@ark-project/demo#build": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "env": [ "NEXT_PUBLIC_NFT_API_KEY", "NEXT_PUBLIC_ORDERBOOK_API_URL", "NEXT_PUBLIC_NFT_API_URL" ], - "outputs": [ - ".next/**", - "!.next/cache/**", - ".vercel/output/**" - ] + "outputs": [".next/**", "!.next/cache/**", ".vercel/output/**"] }, "dev": { - "dependsOn": [ - "^dev" - ], - "outputs": [ - ".dist/**" - ] + "dependsOn": ["^dev"], + "outputs": [".dist/**"] }, "lint": { - "dependsOn": [ - "^lint" - ] + "dependsOn": ["^lint"] }, "test": { - "dependsOn": [ - "^test" - ] + "dependsOn": ["^test"] }, "lint:fix": { - "dependsOn": [ - "^lint:fix" - ] + "dependsOn": ["^lint:fix"] }, "clean": { "cache": false @@ -102,7 +77,6 @@ }, "globalEnv": [ "ACCOUNT_CLASS_HASH", - "BROKER_ID", "CI", "SOLIS_ACCOUNT_CLASS_HASH", "SOLIS_ADMIN_ADDRESS", @@ -124,4 +98,4 @@ "STARKNET_ADMIN_PRIVATE_KEY", "STARKNET_ADMIN_ADDRESS" ] -} \ No newline at end of file +} From 3f148b27b824fb185ffaff19460a62d1016c7ad3 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 13:37:21 +0200 Subject: [PATCH 28/33] CI: update command to run SDK tests --- .github/workflows/arkproject-contracts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/arkproject-contracts.yml b/.github/workflows/arkproject-contracts.yml index 2bc38dab2..6d96fbc83 100644 --- a/.github/workflows/arkproject-contracts.yml +++ b/.github/workflows/arkproject-contracts.yml @@ -84,7 +84,7 @@ jobs: - name: Run SDK test run: | cp .env.devnet .env - pnpm test + pnpm test --filter=core - name: Stop starknet-devnet container if: always() From 3de7c7fbd22ee5654e9297c4cd98149005c52cd1 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 16:29:22 +0200 Subject: [PATCH 29/33] CI: run SDK fulfill action test and reset starknet devnet state --- .github/workflows/arkproject-contracts.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/arkproject-contracts.yml b/.github/workflows/arkproject-contracts.yml index 6d96fbc83..4186193aa 100644 --- a/.github/workflows/arkproject-contracts.yml +++ b/.github/workflows/arkproject-contracts.yml @@ -81,6 +81,20 @@ jobs: -X POST http://localhost:5050/dump \ -d '{"path": "$DEVNET_DEPLOYMENT_DUMP_PATH"}' + - name: Setup environment + run: cp .env.devnet .env + + - name: Run fulfill auction test + run: | + pnpm test --filter=core -- tests/setArkFees.test.ts + pnpm test --filter=core -- tests/fulfillAuction.test.ts + + - name: Restore devnet state + run: | + curl -H "Content-type: application/json" \ + -X POST http://localhost:5050/load \ + -d '{"path": "$DEVNET_DEPLOYMENT_DUMP_PATH"}' + - name: Run SDK test run: | cp .env.devnet .env From 7689a2abbce8c018dea31b2f3c11128b8442be2c Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 24 Sep 2024 17:16:16 +0200 Subject: [PATCH 30/33] CI: store devnet state after setArkFees has been called. --- .github/workflows/arkproject-contracts.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/arkproject-contracts.yml b/.github/workflows/arkproject-contracts.yml index 4186193aa..28c8d1939 100644 --- a/.github/workflows/arkproject-contracts.yml +++ b/.github/workflows/arkproject-contracts.yml @@ -15,6 +15,7 @@ env: STARKNET_DEVNET_VERSION: 0.2.0 DEVNET_DUMP_PATH: /devnet-dump.json DEVNET_DEPLOYMENT_DUMP_PATH: /tmp/devnet-deployment-dump.json + DEVNET_SET_FEES_DUMP_PATH: /tmp/devnet-set-fees-dump.json jobs: fmt: runs-on: ubuntu-latest @@ -84,20 +85,27 @@ jobs: - name: Setup environment run: cp .env.devnet .env + - name: Run set Ark fees test + run: pnpm test --filter=core -- tests/setArkFees.test.ts + + - name: Store devnet state after set ark fees + run: | + curl -H "Content-type: application/json" \ + -X POST http://localhost:5050/dump \ + -d '{"path": "$DEVNET_SET_FEES_DUMP_PATH"}' + - name: Run fulfill auction test run: | - pnpm test --filter=core -- tests/setArkFees.test.ts pnpm test --filter=core -- tests/fulfillAuction.test.ts - name: Restore devnet state run: | curl -H "Content-type: application/json" \ -X POST http://localhost:5050/load \ - -d '{"path": "$DEVNET_DEPLOYMENT_DUMP_PATH"}' + -d '{"path": "$DEVNET_SET_FEES_DUMP_PATH"}' - name: Run SDK test run: | - cp .env.devnet .env pnpm test --filter=core - name: Stop starknet-devnet container From 785ab1df968551df229f566940841a25d6a5310c Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Thu, 26 Sep 2024 12:17:04 +0200 Subject: [PATCH 31/33] display-events: add limit_wait_retries to end indexing when reached --- crates/diri/examples/display-events.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/crates/diri/examples/display-events.rs b/crates/diri/examples/display-events.rs index 4efcaacfe..297e7373b 100644 --- a/crates/diri/examples/display-events.rs +++ b/crates/diri/examples/display-events.rs @@ -53,6 +53,9 @@ struct Args { #[clap(long, help = "Block range", env = "BLOCK_RANGE", default_value = "0")] block_range: u64, + #[clap(long, help = "Nb limit of retries")] + limit_wait_retries: Option, + #[clap(long, help = "JSON output", env = "JSON_OUTPUT")] output: Option, } @@ -78,6 +81,8 @@ async fn main() -> Result<()> { // Set to None to keep polling the head of chain. let to = args.block_end; + let limit_wait_retries = args.limit_wait_retries; + let mut nb_retries = 0_u64; info!("Starting.....!"); @@ -118,10 +123,18 @@ async fn main() -> Result<()> { if start > end { trace!("Nothing to fetch at block {start}"); + if let Some(limit_wait_retries) = limit_wait_retries { + if nb_retries > limit_wait_retries { + info!("Wait limit reached"); + storage.end.store(latest_block, Ordering::SeqCst); + break; + } + nb_retries += 1; + } tokio::time::sleep(tokio::time::Duration::from_millis(sleep_msecs)).await; continue; } - + nb_retries = 0; trace!("Fetching blocks {start} - {end}"); match indexer .index_block_range(BlockId::Number(start), BlockId::Number(end)) @@ -134,7 +147,7 @@ async fn main() -> Result<()> { if end >= to { trace!("`to` block was reached, exit."); storage.end.store(end, Ordering::SeqCst); - break; // return Ok(()); + break; } } From 3167efbfc27355a82f875de6941cc9cf1150ae76 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 1 Oct 2024 01:18:20 +0200 Subject: [PATCH 32/33] feat(diri): add address filtering when fetching events --- crates/diri/examples/display-events.rs | 20 +++++++++++++++++++- crates/diri/src/lib.rs | 5 ++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/crates/diri/examples/display-events.rs b/crates/diri/examples/display-events.rs index 297e7373b..9b18fd3c1 100644 --- a/crates/diri/examples/display-events.rs +++ b/crates/diri/examples/display-events.rs @@ -14,6 +14,7 @@ use dotenv::dotenv; use serde::ser::SerializeStruct; use serde::Serialize; use starknet::core::types::BlockId; +use starknet::core::types::Felt; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::AnyProvider; use starknet::providers::JsonRpcClient; @@ -53,6 +54,9 @@ struct Args { #[clap(long, help = "Block range", env = "BLOCK_RANGE", default_value = "0")] block_range: u64, + #[clap(long, help = "Contract address", env = "CONTRACT_ADDRESS")] + contract: Option, + #[clap(long, help = "Nb limit of retries")] limit_wait_retries: Option, @@ -78,6 +82,16 @@ async fn main() -> Result<()> { let sleep_msecs = args.sleep_msecs; let mut from = args.block_start; let range = args.block_range; + let contract_address = match args.contract { + Some(v) => match Felt::from_hex(&v) { + Ok(v) => Some(v), + Err(e) => { + error!("Failed to parse contract address: {}", e); + None + } + }, + None => None, + }; // Set to None to keep polling the head of chain. let to = args.block_end; @@ -137,7 +151,11 @@ async fn main() -> Result<()> { nb_retries = 0; trace!("Fetching blocks {start} - {end}"); match indexer - .index_block_range(BlockId::Number(start), BlockId::Number(end)) + .index_block_range( + BlockId::Number(start), + BlockId::Number(end), + contract_address, + ) .await { Ok(_) => { diff --git a/crates/diri/src/lib.rs b/crates/diri/src/lib.rs index f215eebda..a37db1120 100644 --- a/crates/diri/src/lib.rs +++ b/crates/diri/src/lib.rs @@ -61,11 +61,13 @@ impl Diri { &self, from_block: BlockId, to_block: BlockId, + address: Option, ) -> IndexerResult<()> { let blocks_events = self .fetch_events( from_block, to_block, + address, Some(vec![vec![ selector!("OrderPlaced"), selector!("OrderFulfilled"), @@ -151,6 +153,7 @@ impl Diri { &self, from_block: BlockId, to_block: BlockId, + address: Option, keys: Option>>, ) -> Result>, IndexerError> { // TODO: setup key filtering here. @@ -160,7 +163,7 @@ impl Diri { let filter = EventFilter { from_block: Some(from_block), to_block: Some(to_block), - address: None, + address, keys, }; From c17a7e28eb2dba02f472161f9650cebde8d45fc9 Mon Sep 17 00:00:00 2001 From: Patrice Tisserand Date: Tue, 1 Oct 2024 20:34:01 +0200 Subject: [PATCH 33/33] contracts(starknet): remove not more needed order info storage --- contracts/ark_starknet/src/executor.cairo | 55 ++++++++----------- .../tests/integration/cancel_order.cairo | 2 +- .../tests/integration/fulfill_order.cairo | 2 +- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/contracts/ark_starknet/src/executor.cairo b/contracts/ark_starknet/src/executor.cairo index 204bf58d7..614047a0b 100644 --- a/contracts/ark_starknet/src/executor.cairo +++ b/contracts/ark_starknet/src/executor.cairo @@ -1,13 +1,11 @@ use ark_common::protocol::order_types::OrderTrait; use ark_common::protocol::order_types::OrderType; -use ark_common::protocol::order_v1::{OrderV1, OrderTraitOrderV1}; -use core::serde::Serde; use starknet::ContractAddress; -#[derive(Drop, Copy, Debug, Serde, starknet::Store)] +#[derive(Drop, Copy, Debug)] struct OrderInfo { order_type: OrderType, // Contract address of the currency used on Starknet for the transfer. @@ -24,24 +22,6 @@ struct OrderInfo { } -impl OrderV1IntoOrderInfo of Into { - fn into(self: OrderV1) -> OrderInfo { - let order_type = self.validate_order_type().expect('Unsupported Order'); - let token_id = match self.token_id { - Option::Some(token_id) => token_id, - Option::None => 0, - }; - OrderInfo { - order_type, - currency_address: self.currency_address, - token_address: self.token_address, - token_id: token_id, - start_amount: self.start_amount, - offerer: self.offerer, - } - } -} - //! Executor contract on Starknet //! //! This contract is responsible of executing the orders @@ -89,7 +69,7 @@ mod executor { use starknet::{ContractAddress, ClassHash}; - use super::{OrderInfo, OrderV1IntoOrderInfo}; + use super::OrderInfo; component!(path: OrderbookComponent, storage: orderbook, event: OrderbookEvent); @@ -100,8 +80,6 @@ mod executor { chain_id: felt252, broker_fees: Map, ark_fees: FeesRatio, - // order hash -> OrderInfo - orders: Map, // fallback when collection doesn't implement ERC2981 default_receiver: ContractAddress, default_fees: FeesRatio, @@ -279,10 +257,6 @@ mod executor { let vinfo = CreateOrderInfo { order: order.clone() }; _verify_create_order(@self, @vinfo); - let order_hash = order.compute_order_hash(); - let order_info = order.into(); - self.orders.write(order_hash, order_info); - self.orderbook.create_order(order); } @@ -359,7 +333,8 @@ mod executor { let canceller = *(cancel_info.canceller); assert!(caller == canceller, "Caller is not the canceller"); - let order_info = self.orders.read(*cancel_info.order_hash); + let order_info = _get_order_info(self, *cancel_info.order_hash); + // default value for ContractAddress is zero // and an order's currency address shall not be zero assert!(order_info.currency_address.is_non_zero(), "Order not found"); @@ -372,7 +347,8 @@ mod executor { let fulfiller = *(fulfill_info.fulfiller); assert!(caller == fulfiller, "Caller is not the fulfiller"); - let order_info = self.orders.read(*fulfill_info.order_hash); + let order_info = _get_order_info(self, *fulfill_info.order_hash); + // default value for ContractAddress is zero // and an order's currency address shall not be zero if order_info.currency_address.is_zero() { @@ -487,7 +463,7 @@ mod executor { ) { let related_order_info = match *(fulfill_info.related_order_hash) { Option::None => panic!("Fulfill auction order require a related order"), - Option::Some(related_order_hash) => self.orders.read(related_order_hash), + Option::Some(related_order_hash) => _get_order_info(self, related_order_hash), }; assert!( @order_info.currency_address == @related_order_info.currency_address, @@ -771,4 +747,21 @@ mod executor { creator_fees_amount, ) } + + fn _get_order_info(self: @ContractState, order_hash: felt252) -> OrderInfo { + let order = self.orderbook.get_order(order_hash); + let order_type = self.orderbook.get_order_type(order_hash); + let token_id = match order.token_id { + Option::Some(token_id) => token_id, + Option::None => 0, + }; + OrderInfo { + order_type, + currency_address: order.currency_address, + token_address: order.token_address, + token_id, + start_amount: order.start_amount, + offerer: order.offerer, + } + } } diff --git a/contracts/ark_starknet/tests/integration/cancel_order.cairo b/contracts/ark_starknet/tests/integration/cancel_order.cairo index 88933b5e0..8e71daf9f 100644 --- a/contracts/ark_starknet/tests/integration/cancel_order.cairo +++ b/contracts/ark_starknet/tests/integration/cancel_order.cairo @@ -256,7 +256,7 @@ fn test_cancel_offer_order_already_cancelled() { } #[test] -#[should_panic(expected: "Order not found")] +#[should_panic(expected: 'OB: order not found')] fn test_cancel_offer_order_bad_order_hash() { let (executor_address, erc20_address, nft_address) = setup(); let token_id = 10; diff --git a/contracts/ark_starknet/tests/integration/fulfill_order.cairo b/contracts/ark_starknet/tests/integration/fulfill_order.cairo index 86baa1b31..c23d362dd 100644 --- a/contracts/ark_starknet/tests/integration/fulfill_order.cairo +++ b/contracts/ark_starknet/tests/integration/fulfill_order.cairo @@ -143,7 +143,7 @@ fn test_fulfill_offer_order_fulfiller_not_owner() { } #[test] -#[should_panic(expected: "Order not found")] +#[should_panic(expected: 'OB: order not found')] fn test_fulfill_order_not_found() { let (executor_address, _erc20_address, nft_address) = setup(); let fulfiller = contract_address_const::<'fulfiller'>();