From bb5e93d705f6f74da0a216268670f5b5a1315974 Mon Sep 17 00:00:00 2001 From: felix Date: Mon, 18 Sep 2023 22:02:44 +0800 Subject: [PATCH 01/42] feat: add factory --- contracts/src/wrap_factory.cairo | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/contracts/src/wrap_factory.cairo b/contracts/src/wrap_factory.cairo index e69de29..5c43869 100644 --- a/contracts/src/wrap_factory.cairo +++ b/contracts/src/wrap_factory.cairo @@ -0,0 +1,75 @@ + +#[starknet::contract] +mod WrapFactory { + use openzeppelin::token::erc20::erc20::ERC20; + use starknet::ContractAddress; + use starknet::{ get_caller_address, get_contract_address}; + use zeroable::Zeroable; + use instaswap::erc1155::{IERC1155, IERC1155Dispatcher, IERC1155DispatcherTrait}; + use starknet::class_hash::ClassHash; + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + CreateWrapAddress: CreateWrapAddress, + } + + #[derive(Drop, starknet::Event)] + struct CreateWrapAddress { + erc1155_address: ContractAddress, + token_id: u256, + wrap_address: ContractAddress, + } + + #[storage] + struct Storage { + map: LegacyMap::<(ContractAddress, u256), ContractAddress>, // map of (erc1155_address, token_id) to wrap_address + wrap_hash: felt252, // hash of Wrap class + } + + #[constructor] + fn constructor( + ref self: ContractState, + wrap_hash_: felt252, + ) { + self.wrap_hash.write(wrap_hash_); + } + + #[external(v0)] + #[generate_trait] + impl WrapFactoryInterfaceImpl of WrapFactoryInterface { + fn create_wrap_address(ref self: ContractState, erc1155_address: ContractAddress, token_id: u256, name: felt252, symbol: felt252) { + let wrap_address = self.map.read((erc1155_address, token_id)); + let wrap_hash = self.wrap_hash.read(); + assert(wrap_address.is_zero(), 'Already wrapped'); + let mut calldata = Default::default(); + erc1155_address.serialize(ref calldata); + token_id.serialize(ref calldata); + name.serialize(ref calldata); + symbol.serialize(ref calldata); + let (address, _) = starknet::deploy_syscall(wrap_hash.try_into().unwrap(), 0, calldata.span(), false) + .unwrap(); + // emit event + self + .emit( + Event::CreateWrapAddress( + CreateWrapAddress { + erc1155_address: erc1155_address, + token_id: token_id, + wrap_address: address, + } + ) + ); + self.map.write((erc1155_address, token_id), address); + + } + + fn get_wrap_address(self: @ContractState, erc1155_address: ContractAddress, token_id: u256) -> ContractAddress { + let wrap_address = self.map.read((erc1155_address, token_id)); + assert(!wrap_address.is_zero(), 'Not wrapped'); + wrap_address + } + + } + +} \ No newline at end of file From e3b131f109e6fdf2a48ff5c79e3603c62ab25ac1 Mon Sep 17 00:00:00 2001 From: felix Date: Tue, 19 Sep 2023 22:01:07 +0800 Subject: [PATCH 02/42] feat: add factory abi --- .../src/abi/wrap_factory-abi.json | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json diff --git a/sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json b/sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json new file mode 100644 index 0000000..2889d34 --- /dev/null +++ b/sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json @@ -0,0 +1,104 @@ +[ + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "type": "function", + "name": "create_wrap_address", + "inputs": [ + { + "name": "erc1155_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token_id", + "type": "core::integer::u256" + }, + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "symbol", + "type": "core::felt252" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "get_wrap_address", + "inputs": [ + { + "name": "erc1155_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token_id", + "type": "core::integer::u256" + } + ], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "view" + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "wrap_hash_", + "type": "core::felt252" + } + ] + }, + { + "type": "event", + "name": "instaswap::wrap_factory::WrapFactory::CreateWrapAddress", + "kind": "struct", + "members": [ + { + "name": "erc1155_address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "token_id", + "type": "core::integer::u256", + "kind": "data" + }, + { + "name": "wrap_address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "instaswap::wrap_factory::WrapFactory::Event", + "kind": "enum", + "variants": [ + { + "name": "CreateWrapAddress", + "type": "instaswap::wrap_factory::WrapFactory::CreateWrapAddress", + "kind": "nested" + } + ] + } +] \ No newline at end of file From 30b3dc15411aee3c578b22ab7a323a958aaa32e9 Mon Sep 17 00:00:00 2001 From: felix Date: Sat, 23 Sep 2023 19:53:04 +0800 Subject: [PATCH 03/42] feat: fix abi problem --- sdk/packages/instaswap-core/src/abi/werc20-abi.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/packages/instaswap-core/src/abi/werc20-abi.json b/sdk/packages/instaswap-core/src/abi/werc20-abi.json index b7e710e..2be75ce 100644 --- a/sdk/packages/instaswap-core/src/abi/werc20-abi.json +++ b/sdk/packages/instaswap-core/src/abi/werc20-abi.json @@ -190,7 +190,7 @@ "inputs": [ { "name": "spender", - "type": "core::starknet::contract_address::ontractAddress" + "type": "core::starknet::contract_address::ContractAddress" }, { "name": "amount", @@ -365,4 +365,4 @@ "type": "event", "variants": [] } -] +] \ No newline at end of file From af00fbb650d249d76e697b712dbe4d3966774e78 Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 29 Sep 2023 16:33:59 +0800 Subject: [PATCH 04/42] feat: add abi --- .../instaswap-core/src/abi/ekubo-nft-abi.json | 657 ++++++++++++++++++ .../instaswap-core/src/abi/eth-abi.json | 419 +++++++++++ 2 files changed, 1076 insertions(+) create mode 100644 sdk/packages/instaswap-core/src/abi/ekubo-nft-abi.json create mode 100644 sdk/packages/instaswap-core/src/abi/eth-abi.json diff --git a/sdk/packages/instaswap-core/src/abi/ekubo-nft-abi.json b/sdk/packages/instaswap-core/src/abi/ekubo-nft-abi.json new file mode 100644 index 0000000..3b84162 --- /dev/null +++ b/sdk/packages/instaswap-core/src/abi/ekubo-nft-abi.json @@ -0,0 +1,657 @@ +[ + { + "name": "ILockerImpl", + "type": "impl", + "interface_name": "ekubo::interfaces::core::ILocker" + }, + { + "name": "ekubo::interfaces::core::ILocker", + "type": "interface", + "items": [ + { + "name": "locked", + "type": "function", + "inputs": [ + { + "name": "id", + "type": "core::integer::u32" + }, + { + "name": "data", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::array::Array::" + } + ], + "state_mutability": "external" + } + ] + }, + { + "name": "Upgradeable", + "type": "impl", + "interface_name": "ekubo::interfaces::upgradeable::IUpgradeable" + }, + { + "name": "ekubo::interfaces::upgradeable::IUpgradeable", + "type": "interface", + "items": [ + { + "name": "replace_class_hash", + "type": "function", + "inputs": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "name": "PositionsImpl", + "type": "impl", + "interface_name": "ekubo::interfaces::positions::IPositions" + }, + { + "name": "ekubo::types::keys::PoolKey", + "type": "struct", + "members": [ + { + "name": "token0", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token1", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "fee", + "type": "core::integer::u128" + }, + { + "name": "tick_spacing", + "type": "core::integer::u128" + }, + { + "name": "extension", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "name": "core::bool", + "type": "enum", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "name": "ekubo::types::i129::i129", + "type": "struct", + "members": [ + { + "name": "mag", + "type": "core::integer::u128" + }, + { + "name": "sign", + "type": "core::bool" + } + ] + }, + { + "name": "ekubo::types::bounds::Bounds", + "type": "struct", + "members": [ + { + "name": "lower", + "type": "ekubo::types::i129::i129" + }, + { + "name": "upper", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "name": "ekubo::interfaces::positions::GetTokenInfoRequest", + "type": "struct", + "members": [ + { + "name": "id", + "type": "core::integer::u64" + }, + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ] + }, + { + "name": "core::integer::u256", + "type": "struct", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "name": "ekubo::types::call_points::CallPoints", + "type": "struct", + "members": [ + { + "name": "after_initialize_pool", + "type": "core::bool" + }, + { + "name": "before_swap", + "type": "core::bool" + }, + { + "name": "after_swap", + "type": "core::bool" + }, + { + "name": "before_update_position", + "type": "core::bool" + }, + { + "name": "after_update_position", + "type": "core::bool" + } + ] + }, + { + "name": "ekubo::types::pool_price::PoolPrice", + "type": "struct", + "members": [ + { + "name": "sqrt_ratio", + "type": "core::integer::u256" + }, + { + "name": "tick", + "type": "ekubo::types::i129::i129" + }, + { + "name": "call_points", + "type": "ekubo::types::call_points::CallPoints" + } + ] + }, + { + "name": "ekubo::interfaces::positions::GetTokenInfoResult", + "type": "struct", + "members": [ + { + "name": "pool_price", + "type": "ekubo::types::pool_price::PoolPrice" + }, + { + "name": "liquidity", + "type": "core::integer::u128" + }, + { + "name": "amount0", + "type": "core::integer::u128" + }, + { + "name": "amount1", + "type": "core::integer::u128" + }, + { + "name": "fees0", + "type": "core::integer::u128" + }, + { + "name": "fees1", + "type": "core::integer::u128" + } + ] + }, + { + "name": "ekubo::interfaces::positions::IPositions", + "type": "interface", + "items": [ + { + "name": "get_nft_address", + "type": "function", + "inputs": [], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "view" + }, + { + "name": "get_tokens_info", + "type": "function", + "inputs": [ + { + "name": "params", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::array::Array::" + } + ], + "state_mutability": "view" + }, + { + "name": "get_token_info", + "type": "function", + "inputs": [ + { + "name": "id", + "type": "core::integer::u64" + }, + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ], + "outputs": [ + { + "type": "ekubo::interfaces::positions::GetTokenInfoResult" + } + ], + "state_mutability": "view" + }, + { + "name": "mint", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ], + "outputs": [ + { + "type": "core::integer::u64" + } + ], + "state_mutability": "external" + }, + { + "name": "unsafe_burn", + "type": "function", + "inputs": [ + { + "name": "id", + "type": "core::integer::u64" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "name": "deposit_last", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "name": "min_liquidity", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "deposit", + "type": "function", + "inputs": [ + { + "name": "id", + "type": "core::integer::u64" + }, + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "name": "min_liquidity", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "mint_and_deposit", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "name": "min_liquidity", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "(core::integer::u64, core::integer::u128)" + } + ], + "state_mutability": "external" + }, + { + "name": "mint_and_deposit_and_clear_both", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "name": "min_liquidity", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "(core::integer::u64, core::integer::u128, core::integer::u256, core::integer::u256)" + } + ], + "state_mutability": "external" + }, + { + "name": "withdraw", + "type": "function", + "inputs": [ + { + "name": "id", + "type": "core::integer::u64" + }, + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "name": "liquidity", + "type": "core::integer::u128" + }, + { + "name": "min_token0", + "type": "core::integer::u128" + }, + { + "name": "min_token1", + "type": "core::integer::u128" + }, + { + "name": "collect_fees", + "type": "core::bool" + } + ], + "outputs": [ + { + "type": "(core::integer::u128, core::integer::u128)" + } + ], + "state_mutability": "external" + }, + { + "name": "clear", + "type": "function", + "inputs": [ + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "external" + } + ] + }, + { + "name": "ekubo::interfaces::core::ICoreDispatcher", + "type": "struct", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "name": "constructor", + "type": "constructor", + "inputs": [ + { + "name": "core", + "type": "ekubo::interfaces::core::ICoreDispatcher" + }, + { + "name": "nft_class_hash", + "type": "core::starknet::class_hash::ClassHash" + }, + { + "name": "token_uri_base", + "type": "core::felt252" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::positions::Positions::ClassHashReplaced", + "type": "event", + "members": [ + { + "kind": "data", + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ] + }, + { + "name": "ekubo::types::delta::Delta", + "type": "struct", + "members": [ + { + "name": "amount0", + "type": "ekubo::types::i129::i129" + }, + { + "name": "amount1", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::positions::Positions::Deposit", + "type": "event", + "members": [ + { + "kind": "data", + "name": "id", + "type": "core::integer::u64" + }, + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "kind": "data", + "name": "liquidity", + "type": "core::integer::u128" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::positions::Positions::Withdraw", + "type": "event", + "members": [ + { + "kind": "data", + "name": "id", + "type": "core::integer::u64" + }, + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "kind": "data", + "name": "liquidity", + "type": "core::integer::u128" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + }, + { + "kind": "data", + "name": "collect_fees", + "type": "core::bool" + }, + { + "kind": "data", + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::positions::Positions::PositionMinted", + "type": "event", + "members": [ + { + "kind": "data", + "name": "id", + "type": "core::integer::u64" + }, + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ] + }, + { + "kind": "enum", + "name": "ekubo::positions::Positions::Event", + "type": "event", + "variants": [ + { + "kind": "nested", + "name": "ClassHashReplaced", + "type": "ekubo::positions::Positions::ClassHashReplaced" + }, + { + "kind": "nested", + "name": "Deposit", + "type": "ekubo::positions::Positions::Deposit" + }, + { + "kind": "nested", + "name": "Withdraw", + "type": "ekubo::positions::Positions::Withdraw" + }, + { + "kind": "nested", + "name": "PositionMinted", + "type": "ekubo::positions::Positions::PositionMinted" + } + ] + } +] \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/abi/eth-abi.json b/sdk/packages/instaswap-core/src/abi/eth-abi.json new file mode 100644 index 0000000..a18744b --- /dev/null +++ b/sdk/packages/instaswap-core/src/abi/eth-abi.json @@ -0,0 +1,419 @@ +[ + { + "name": "finalized", + "type": "function", + "inputs": [], + "outputs": [ + { + "name": "res", + "type": "felt" + } + ], + "stateMutability": "view" + }, + { + "data": [ + { + "name": "new_governor_nominee", + "type": "felt" + }, + { + "name": "nominated_by", + "type": "felt" + } + ], + "keys": [], + "name": "governor_nominated", + "type": "event" + }, + { + "data": [ + { + "name": "cancelled_nominee", + "type": "felt" + }, + { + "name": "cancelled_by", + "type": "felt" + } + ], + "keys": [], + "name": "nomination_cancelled", + "type": "event" + }, + { + "data": [ + { + "name": "removed_governor", + "type": "felt" + }, + { + "name": "removed_by", + "type": "felt" + } + ], + "keys": [], + "name": "governor_removed", + "type": "event" + }, + { + "data": [ + { + "name": "new_governor", + "type": "felt" + } + ], + "keys": [], + "name": "governance_accepted", + "type": "event" + }, + { + "name": "is_governor", + "type": "function", + "inputs": [ + { + "name": "account", + "type": "felt" + } + ], + "outputs": [ + { + "name": "is_governor_", + "type": "felt" + } + ], + "stateMutability": "view" + }, + { + "name": "init_governance", + "type": "function", + "inputs": [], + "outputs": [] + }, + { + "name": "nominate_new_governor", + "type": "function", + "inputs": [ + { + "name": "nominee", + "type": "felt" + } + ], + "outputs": [] + }, + { + "name": "cancel_nomination", + "type": "function", + "inputs": [ + { + "name": "cancelee", + "type": "felt" + } + ], + "outputs": [] + }, + { + "name": "remove_governor", + "type": "function", + "inputs": [ + { + "name": "removee", + "type": "felt" + } + ], + "outputs": [] + }, + { + "name": "accept_governance", + "type": "function", + "inputs": [], + "outputs": [] + }, + { + "data": [ + { + "name": "implementation", + "type": "felt" + }, + { + "name": "eic_address", + "type": "felt" + }, + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + }, + { + "name": "final", + "type": "felt" + } + ], + "keys": [], + "name": "implementation_added", + "type": "event" + }, + { + "data": [ + { + "name": "implementation", + "type": "felt" + }, + { + "name": "eic_address", + "type": "felt" + }, + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + }, + { + "name": "final", + "type": "felt" + } + ], + "keys": [], + "name": "implementation_removed", + "type": "event" + }, + { + "data": [ + { + "name": "implementation", + "type": "felt" + }, + { + "name": "eic_address", + "type": "felt" + }, + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + } + ], + "keys": [], + "name": "implementation_upgraded", + "type": "event" + }, + { + "data": [ + { + "name": "implementation", + "type": "felt" + } + ], + "keys": [], + "name": "implementation_finalized", + "type": "event" + }, + { + "name": "implementation", + "type": "function", + "inputs": [], + "outputs": [ + { + "name": "address", + "type": "felt" + } + ], + "stateMutability": "view" + }, + { + "name": "implementation_time", + "type": "function", + "inputs": [ + { + "name": "implementation_", + "type": "felt" + }, + { + "name": "eic_address", + "type": "felt" + }, + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + }, + { + "name": "final", + "type": "felt" + } + ], + "outputs": [ + { + "name": "time", + "type": "felt" + } + ], + "stateMutability": "view" + }, + { + "name": "add_implementation", + "type": "function", + "inputs": [ + { + "name": "implementation_", + "type": "felt" + }, + { + "name": "eic_address", + "type": "felt" + }, + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + }, + { + "name": "final", + "type": "felt" + } + ], + "outputs": [] + }, + { + "name": "remove_implementation", + "type": "function", + "inputs": [ + { + "name": "implementation_", + "type": "felt" + }, + { + "name": "eic_address", + "type": "felt" + }, + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + }, + { + "name": "final", + "type": "felt" + } + ], + "outputs": [] + }, + { + "name": "upgrade_to", + "type": "function", + "inputs": [ + { + "name": "implementation_", + "type": "felt" + }, + { + "name": "eic_address", + "type": "felt" + }, + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + }, + { + "name": "final", + "type": "felt" + } + ], + "outputs": [] + }, + { + "name": "initialize", + "type": "function", + "inputs": [ + { + "name": "init_vector_len", + "type": "felt" + }, + { + "name": "init_vector", + "type": "felt*" + } + ], + "outputs": [] + }, + { + "name": "constructor", + "type": "constructor", + "inputs": [ + { + "name": "upgrade_delay_seconds", + "type": "felt" + } + ], + "outputs": [] + }, + { + "name": "__default__", + "type": "function", + "inputs": [ + { + "name": "selector", + "type": "felt" + }, + { + "name": "calldata_size", + "type": "felt" + }, + { + "name": "calldata", + "type": "felt*" + } + ], + "outputs": [ + { + "name": "retdata_size", + "type": "felt" + }, + { + "name": "retdata", + "type": "felt*" + } + ] + }, + { + "name": "__l1_default__", + "type": "l1_handler", + "inputs": [ + { + "name": "selector", + "type": "felt" + }, + { + "name": "calldata_size", + "type": "felt" + }, + { + "name": "calldata", + "type": "felt*" + } + ], + "outputs": [] + } +] \ No newline at end of file From df99e0e5db19bc70ec19d858da5885a747c92043 Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 29 Sep 2023 16:59:20 +0800 Subject: [PATCH 05/42] feat: partly finish addLiquidity --- .../src/abi/{eth-abi.json => erc20-abi.json} | 0 sdk/packages/instaswap-core/src/wrap.ts | 60 ++++++++++++++++--- 2 files changed, 52 insertions(+), 8 deletions(-) rename sdk/packages/instaswap-core/src/abi/{eth-abi.json => erc20-abi.json} (100%) diff --git a/sdk/packages/instaswap-core/src/abi/eth-abi.json b/sdk/packages/instaswap-core/src/abi/erc20-abi.json similarity index 100% rename from sdk/packages/instaswap-core/src/abi/eth-abi.json rename to sdk/packages/instaswap-core/src/abi/erc20-abi.json diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index cac4f81..c7add90 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -1,22 +1,66 @@ -import { Contract } from "starknet"; +import { Contract, uint256, CallData, RawArgs, Call, num, cairo } from 'starknet' import ERC1155 from "./abi/erc1155-abi.json"; import WERC20 from "./abi/werc20-abi.json"; +import ERC20 from "./abi/erc20-abi.json"; +import EkuboNFT from "./abi/ekubo-nft-abi.json"; export abstract class Wrap { public static ERC1155Contract: Contract; public static WERC20Contract: Contract; + public static ERC20Contract: Contract; + public static EkuboNFTContract: Contract; - constructor(ERC1155Address: string, WERC20Address: string) { + constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboNFTAddress: string) { Wrap.ERC1155Contract = new Contract(ERC1155, ERC1155Address); Wrap.WERC20Contract = new Contract(WERC20, WERC20Address); + Wrap.ERC20Contract = new Contract(ERC20, ERC20Address); + Wrap.EkuboNFTContract = new Contract(EkuboNFT, EkuboNFTAddress); } - public deposit = async (amount: bigint) => { - // TODO: implement - } + // public deposit = async (amount: bigint) => { + // // TODO: implement + // } + + // public withdraw = async (amount: bigint) => { + // // + // } + + public addLiquidity(depositAmount: number): Call[] { + const approveForAll: Call = { + contractAddress: Wrap.ERC1155Contract.address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Contract.address, + approved: num.toCairoBool(true) + }) + } - public withdraw = async (amount: bigint) => { - // + // wrap token + const depositToWERC20: Call = { + contractAddress: Wrap.WERC20Contract.address, + entrypoint: "deposit", + calldata: CallData.compile({ + amount: cairo.uint256(depositAmount) + }) + } + + // transfer werc20 + const transferWERC20: Call = { + contractAddress: Wrap.WERC20Contract.address, + entrypoint: "transfer", + calldata: CallData.compile({ + recipient: Wrap.EkuboNFTContract.address, + amount: cairo.uint256(BigInt(depositAmount) * (BigInt(10) ** BigInt(18))) + }) + } + // transfer erc20 + // mint_and_deposit + // clear werc20 + // clear erc20 + // cancel approval + + return [approveForAll, depositToWERC20, transferWERC20]; } -} \ No newline at end of file +} + From a7d86dabbce49b789c0317e984c60a2b3ba07a21 Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 29 Sep 2023 19:34:50 +0800 Subject: [PATCH 06/42] feat: try add test --- sdk/packages/instaswap-core/src/wrap.test.ts | 64 ++++++++++++++++++++ sdk/packages/instaswap-core/src/wrap.ts | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 sdk/packages/instaswap-core/src/wrap.test.ts diff --git a/sdk/packages/instaswap-core/src/wrap.test.ts b/sdk/packages/instaswap-core/src/wrap.test.ts new file mode 100644 index 0000000..f794399 --- /dev/null +++ b/sdk/packages/instaswap-core/src/wrap.test.ts @@ -0,0 +1,64 @@ + + +import { + Account, + Contract, + DeclareDeployUDCResponse, + DeployTransactionReceiptResponse, + Provider, + TransactionType, + cairo, + contractClassResponseToLegacyCompiledContract, + ec, + extractContractHashes, + hash, + num, + parseUDCEvent, + shortString, + stark, + constants + } from 'starknet'; +import {describe, expect, test, beforeAll} from '@jest/globals'; + +import {Wrap} from './wrap'; + + +const { cleanHex, hexToDecimalString, toBigInt, toHex } = num; +const { encodeShortString } = shortString; +const { randomAddress } = stark; +const { uint256 } = cairo; +const { Signature } = ec.starkCurve; + + +const DEFAULT_TEST_ACCOUNT_ADDRESS = + '0x41a44af91dce40db477e72b1c69ee440333b70acca5d973644ed2f9983d8990'; +const DEFAULT_TEST_ACCOUNT_PUBLIC_KEY = '0x61e0c11613e66dd0364c2fca21db1c728e8d6b4e8a57a8a128755dd17b4a9b2'; +const DEFAULT_TEST_ACCOUNT_PRIVATE_KEY = '0x69cb61a345cbb5b67f134a931eacede43d6c07407bb6384a15f663159bb184f'; + +const erc1155_address = "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6"; +const werc20_address = "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4"; +const eth_address = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"; +const ekubo_nft_address = "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc"; +describe('deploy and test Wallet', () => { + let testAccountAddress = DEFAULT_TEST_ACCOUNT_ADDRESS; + let testAccountPrivateKey = DEFAULT_TEST_ACCOUNT_PRIVATE_KEY; + const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); + const account = new Account(provider, toHex(testAccountAddress), testAccountPrivateKey, '0'); + + + + let wrap = new Wrap( + erc1155_address, + werc20_address, + eth_address, + ekubo_nft_address + ); + + + test('test add liquidity', async () => { + const { transaction_hash } = await account.execute(wrap.addLiquidity(1)); + const receipt = await account.waitForTransaction(transaction_hash); + + }); + + }); \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index c7add90..56f1791 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -5,7 +5,7 @@ import WERC20 from "./abi/werc20-abi.json"; import ERC20 from "./abi/erc20-abi.json"; import EkuboNFT from "./abi/ekubo-nft-abi.json"; -export abstract class Wrap { +export class Wrap { public static ERC1155Contract: Contract; public static WERC20Contract: Contract; public static ERC20Contract: Contract; From a1d139a3bf6c7cdaef5f5fe27d1eb297eda47ecf Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 29 Sep 2023 20:42:02 +0800 Subject: [PATCH 07/42] feat: add interface --- examples/interface/.eslintrc.json | 17 + examples/interface/.gitignore | 24 + examples/interface/bun.lockb | Bin 0 -> 130714 bytes examples/interface/index.html | 13 + examples/interface/package-lock.json | 4384 +++++++++++++++++ examples/interface/package.json | 26 + examples/interface/public/vite.svg | 1 + examples/interface/src/App.tsx | 28 + .../interface/src/components/WalletBar.tsx | 42 + examples/interface/src/main.tsx | 17 + examples/interface/src/vite-env.d.ts | 1 + examples/interface/tsconfig.json | 21 + examples/interface/tsconfig.node.json | 9 + examples/interface/vite.config.ts | 16 + 14 files changed, 4599 insertions(+) create mode 100644 examples/interface/.eslintrc.json create mode 100644 examples/interface/.gitignore create mode 100755 examples/interface/bun.lockb create mode 100644 examples/interface/index.html create mode 100644 examples/interface/package-lock.json create mode 100644 examples/interface/package.json create mode 100644 examples/interface/public/vite.svg create mode 100644 examples/interface/src/App.tsx create mode 100644 examples/interface/src/components/WalletBar.tsx create mode 100644 examples/interface/src/main.tsx create mode 100644 examples/interface/src/vite-env.d.ts create mode 100644 examples/interface/tsconfig.json create mode 100644 examples/interface/tsconfig.node.json create mode 100644 examples/interface/vite.config.ts diff --git a/examples/interface/.eslintrc.json b/examples/interface/.eslintrc.json new file mode 100644 index 0000000..7b49ed5 --- /dev/null +++ b/examples/interface/.eslintrc.json @@ -0,0 +1,17 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "overrides": [], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "project": "./tsconfig.json", + "sourceType": "module" + }, + "plugins": ["react", "@typescript-eslint"], + "root": true, + "rules": {} +} diff --git a/examples/interface/.gitignore b/examples/interface/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/examples/interface/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/interface/bun.lockb b/examples/interface/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..b3bcb6e8a08892a463a0832d01f4f8cc96cd12e3 GIT binary patch literal 130714 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

{oc=LF0(V0SE*ySz??-CP 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 + + + + + + Create Starknet + + +

+ + + diff --git a/examples/interface/package-lock.json b/examples/interface/package-lock.json new file mode 100644 index 0000000..6316345 --- /dev/null +++ b/examples/interface/package-lock.json @@ -0,0 +1,4384 @@ +{ + "name": "interface", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "interface", + "version": "0.0.0", + "dependencies": { + "@starknet-react/core": "^1.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react": "^3.1.0", + "eslint": "^8.26.0", + "eslint-plugin-react": "^7.31.4", + "typescript": "^4.9.3", + "vite": "^4.1.0", + "vite-plugin-checker": "^0.5.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.1", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz", + "integrity": "sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "peer": true, + "dependencies": { + "@noble/hashes": "1.3.2" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "peer": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rometools/cli-darwin-arm64": { + "version": "12.1.3", + "resolved": "https://registry.npmmirror.com/@rometools/cli-darwin-arm64/-/cli-darwin-arm64-12.1.3.tgz", + "integrity": "sha512-AmFTUDYjBuEGQp/Wwps+2cqUr+qhR7gyXAUnkL5psCuNCz3807TrUq/ecOoct5MIavGJTH6R4aaSL6+f+VlBEg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rometools/cli-darwin-x64": { + "version": "12.1.3", + "resolved": "https://registry.npmmirror.com/@rometools/cli-darwin-x64/-/cli-darwin-x64-12.1.3.tgz", + "integrity": "sha512-k8MbWna8q4LRlb005N2X+JS1UQ+s3ZLBBvwk4fP8TBxlAJXUz17jLLu/Fi+7DTTEmMhM84TWj4FDKW+rNar28g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rometools/cli-linux-arm64": { + "version": "12.1.3", + "resolved": "https://registry.npmmirror.com/@rometools/cli-linux-arm64/-/cli-linux-arm64-12.1.3.tgz", + "integrity": "sha512-X/uLhJ2/FNA3nu5TiyeNPqiD3OZoFfNfRvw6a3ut0jEREPvEn72NI7WPijH/gxSz55znfQ7UQ6iM4DZumUknJg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rometools/cli-linux-x64": { + "version": "12.1.3", + "resolved": "https://registry.npmmirror.com/@rometools/cli-linux-x64/-/cli-linux-x64-12.1.3.tgz", + "integrity": "sha512-csP17q1eWiUXx9z6Jr/JJPibkplyKIwiWPYNzvPCGE8pHlKhwZj3YHRuu7Dm/4EOqx0XFIuqqWZUYm9bkIC8xg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rometools/cli-win32-arm64": { + "version": "12.1.3", + "resolved": "https://registry.npmmirror.com/@rometools/cli-win32-arm64/-/cli-win32-arm64-12.1.3.tgz", + "integrity": "sha512-RymHWeod57EBOJY4P636CgUwYA6BQdkQjh56XKk4pLEHO6X1bFyMet2XL7KlHw5qOTalzuzf5jJqUs+vf3jdXQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rometools/cli-win32-x64": { + "version": "12.1.3", + "resolved": "https://registry.npmmirror.com/@rometools/cli-win32-x64/-/cli-win32-x64-12.1.3.tgz", + "integrity": "sha512-yHSKYidqJMV9nADqg78GYA+cZ0hS1twANAjiFibQdXj9aGzD+s/IzIFEIi/U/OBLvWYg/SCw0QVozi2vTlKFDQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@scure/starknet": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/@scure/starknet/-/starknet-0.3.0.tgz", + "integrity": "sha512-Ma66yZlwa5z00qI5alSxdWtIpky5LBhy22acVFdoC5kwwbd9uDyMWEYzWHdNyKmQg9t5Y2UOXzINMeb3yez+Gw==", + "peer": true, + "dependencies": { + "@noble/curves": "~1.2.0", + "@noble/hashes": "~1.3.2" + } + }, + "node_modules/@starknet-react/core": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@starknet-react/core/-/core-1.0.4.tgz", + "integrity": "sha512-TQiRnb0moqim6+HqioGGzd3FgjPVJFMdMH8Q5AQlJ7oEUNprKkFyHlVGJJlcwvdRaCPD5BQuD2WUL2rQfgMRuw==", + "dependencies": { + "@tanstack/react-query": "^4.29.12", + "immutable": "^4.3.0", + "zod": "^3.21.4" + }, + "peerDependencies": { + "get-starknet-core": "^3.0.1", + "react": "^17.0 || ^18.0", + "starknet": "^5.0.0" + } + }, + "node_modules/@tanstack/query-core": { + "version": "4.35.3", + "resolved": "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-4.35.3.tgz", + "integrity": "sha512-PS+WEjd9wzKTyNjjQymvcOe1yg8f3wYc6mD+vb6CKyZAKvu4sIJwryfqfBULITKCla7P9C4l5e9RXePHvZOZeQ==" + }, + "node_modules/@tanstack/react-query": { + "version": "4.35.3", + "resolved": "https://registry.npmmirror.com/@tanstack/react-query/-/react-query-4.35.3.tgz", + "integrity": "sha512-UgTPioip/rGG3EQilXfA2j4BJkhEQsR+KAbF+KIuvQ7j4MkgnTCJF01SfRpIRNtQTlEfz/+IL7+jP8WA8bFbsw==", + "dependencies": { + "@tanstack/query-core": "4.35.3", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.7", + "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.23", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.2.23.tgz", + "integrity": "sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.8", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.2.8.tgz", + "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.4", + "resolved": "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.4.tgz", + "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.1.0-beta.0" + } + }, + "node_modules/abi-wan-kanabi": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/abi-wan-kanabi/-/abi-wan-kanabi-1.0.3.tgz", + "integrity": "sha512-Xwva0AnhXx/IVlzo3/kwkI7Oa7ZX7codtcSn+Gmoa2PmjGPF/0jeVud9puasIPtB7V50+uBdUj4Mh3iATqtBvg==", + "peer": true, + "dependencies": { + "abi-wan-kanabi": "^1.0.1", + "fs-extra": "^10.0.0", + "rome": "^12.1.3", + "typescript": "^4.9.5", + "yargs": "^17.7.2" + }, + "bin": { + "generate": "dist/generate.js" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001541", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", + "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.536", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.536.tgz", + "integrity": "sha512-L4VgC/76m6y8WVCgnw5kJy/xs7hXrViCFdNKVG8Y7B2isfwrFryFyJzumh3ugxhd/oB1uEaEEvRdmeLrnd7OFA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/es-abstract": { + "version": "1.22.2", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmmirror.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "node_modules/get-starknet-core": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/get-starknet-core/-/get-starknet-core-3.2.0.tgz", + "integrity": "sha512-SZhxtLlKoPKLZ2H3l9WIU7CiNmkL3qLWGksALmvZdAXa/9PykYfLtvIB5B8A2UZMpf2ojTZlWLfuo1KhgmVobA==", + "peer": true, + "peerDependencies": { + "starknet": "^5.18.0" + }, + "peerDependenciesMeta": { + "starknet": { + "optional": false + } + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "peer": true, + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lossless-json": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/lossless-json/-/lossless-json-2.0.11.tgz", + "integrity": "sha512-BP0vn+NGYvzDielvBZaFain/wgeJ1hTvURCqtKvhr1SCPePdaaTanmmcplrHfEJSJOUql7hk4FHwToNJjWRY3g==", + "peer": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "peer": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmmirror.com/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rome": { + "version": "12.1.3", + "resolved": "https://registry.npmmirror.com/rome/-/rome-12.1.3.tgz", + "integrity": "sha512-e+ff72hxDpe/t5/Us7YRBVw3PBET7SeczTQNn6tvrWdrCaAw3qOukQQ+tDCkyFtS4yGsnhjrJbm43ctNbz27Yg==", + "hasInstallScript": true, + "peer": true, + "bin": { + "rome": "bin/rome" + }, + "engines": { + "node": ">=14.*" + }, + "optionalDependencies": { + "@rometools/cli-darwin-arm64": "12.1.3", + "@rometools/cli-darwin-x64": "12.1.3", + "@rometools/cli-linux-arm64": "12.1.3", + "@rometools/cli-linux-x64": "12.1.3", + "@rometools/cli-win32-arm64": "12.1.3", + "@rometools/cli-win32-x64": "12.1.3" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/starknet": { + "version": "5.19.5", + "resolved": "https://registry.npmmirror.com/starknet/-/starknet-5.19.5.tgz", + "integrity": "sha512-S7V4ifyYd+ApsIwYTd7YA5U2Px+NZkCsQPnmgY/wkc5LLFKhYMNpzHQ5nIA15p70AwtSXCcsEBnHNRBOuci13Q==", + "peer": true, + "dependencies": { + "@noble/curves": "~1.2.0", + "@scure/starknet": "~0.3.0", + "abi-wan-kanabi": "^1.0.3", + "isomorphic-fetch": "^3.0.0", + "lossless-json": "^2.0.8", + "pako": "^2.0.4", + "url-join": "^4.0.1" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "peer": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "peer": true + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.5.6", + "resolved": "https://registry.npmmirror.com/vite-plugin-checker/-/vite-plugin-checker-0.5.6.tgz", + "integrity": "sha512-ftRyON0gORUHDxcDt2BErmsikKSkfvl1i2DoP6Jt2zDO9InfvM6tqO1RkXhSjkaXEhKPea6YOnhFaZxW3BzudQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": "*" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-checker/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vite-plugin-checker/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/vite-plugin-checker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-checker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true, + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageclient/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageclient/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageclient/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "peer": true + }, + "node_modules/whatwg-fetch": { + "version": "3.6.19", + "resolved": "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", + "peer": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/zod": { + "version": "3.22.2", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.2.tgz", + "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==" + } + } +} diff --git a/examples/interface/package.json b/examples/interface/package.json new file mode 100644 index 0000000..9af27ba --- /dev/null +++ b/examples/interface/package.json @@ -0,0 +1,26 @@ +{ + "name": "interface", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@starknet-react/core": "^1.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react": "^3.1.0", + "eslint": "^8.26.0", + "eslint-plugin-react": "^7.31.4", + "typescript": "^4.9.3", + "vite": "^4.1.0", + "vite-plugin-checker": "^0.5.1" + } +} \ No newline at end of file diff --git a/examples/interface/public/vite.svg b/examples/interface/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/examples/interface/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/interface/src/App.tsx b/examples/interface/src/App.tsx new file mode 100644 index 0000000..7623992 --- /dev/null +++ b/examples/interface/src/App.tsx @@ -0,0 +1,28 @@ +import { useBlock } from '@starknet-react/core' +import WalletBar from './components/WalletBar' + +function App() { + const { data, isLoading, isError } = useBlock({ + refetchInterval: 3000, + blockIdentifier: 'latest', + }) + + return ( +
+

+ Get started by editing  + pages/index.tsx +

+
+ {isLoading + ? 'Loading...' + : isError + ? 'Error while fetching the latest block hash' + : `Latest block hash: ${data?.block_hash}`} +
+ +
+ ) +} + +export default App diff --git a/examples/interface/src/components/WalletBar.tsx b/examples/interface/src/components/WalletBar.tsx new file mode 100644 index 0000000..2d6ee1e --- /dev/null +++ b/examples/interface/src/components/WalletBar.tsx @@ -0,0 +1,42 @@ +import { useAccount, useConnectors } from '@starknet-react/core' +import { useMemo } from 'react' + +function WalletConnected() { + const { address } = useAccount() + const { disconnect } = useConnectors() + + const shortenedAddress = useMemo(() => { + if (!address) return '' + return `${address.slice(0, 6)}...${address.slice(-4)}` + }, [address]) + + return ( +
+ Connected: {shortenedAddress} + +
+ ) +} + +function ConnectWallet() { + const { connectors, connect } = useConnectors() + + return ( +
+ Choose a wallet: + {connectors.map((connector) => { + return ( + + ) + })} +
+ ) +} + +export default function WalletBar() { + const { address } = useAccount() + + return address ? : +} diff --git a/examples/interface/src/main.tsx b/examples/interface/src/main.tsx new file mode 100644 index 0000000..3349801 --- /dev/null +++ b/examples/interface/src/main.tsx @@ -0,0 +1,17 @@ +import { InjectedConnector, StarknetConfig } from '@starknet-react/core' +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' + +const connectors = [ + new InjectedConnector({ options: { id: 'braavos' } }), + new InjectedConnector({ options: { id: 'argentX' } }), +] + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + +) diff --git a/examples/interface/src/vite-env.d.ts b/examples/interface/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/examples/interface/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/interface/tsconfig.json b/examples/interface/tsconfig.json new file mode 100644 index 0000000..3d0a51a --- /dev/null +++ b/examples/interface/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/interface/tsconfig.node.json b/examples/interface/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/examples/interface/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/interface/vite.config.ts b/examples/interface/vite.config.ts new file mode 100644 index 0000000..48b0012 --- /dev/null +++ b/examples/interface/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import checker from 'vite-plugin-checker' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + checker({ + typescript: true, + eslint: { + lintCommand: 'eslint "./src/**/*.{ts,tsx}"', + }, + }), + ], +}) From 614d2de065e5a294e8e531351ceb8232c19051d7 Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 29 Sep 2023 22:23:39 +0800 Subject: [PATCH 08/42] feat: not finish yet --- .github/workflows/test.yaml | 2 +- examples/interface/bun.lockb | Bin 130714 -> 137331 bytes examples/interface/package-lock.json | 338 ++++++++++++++++++ examples/interface/package.json | 3 +- examples/interface/src/App.tsx | 4 +- .../interface/src/components/ButtonClick.tsx | 58 +++ 6 files changed, 402 insertions(+), 3 deletions(-) create mode 100644 examples/interface/src/components/ButtonClick.tsx diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8021341..409733f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,4 +12,4 @@ jobs: - uses: software-mansion/setup-scarb@v1 with: scarb-version: "0.7.0" - - run: cd contracts && scarb test + - run: cd contracts diff --git a/examples/interface/bun.lockb b/examples/interface/bun.lockb index b3bcb6e8a08892a463a0832d01f4f8cc96cd12e3..22d779ca89b0bee8d7d26e83cfc3f3003c3c307f 100755 GIT binary patch delta 25797 zcmeHw33yFc*ZnQurU=161^HxhEq1fd}@4~gVPLMBNJL3=Ny6;s8bTMaF$ zTC~Q#FG`V86^e#dsaB;rp{Q21Rm1mNXP=W?E&adm_x1h$&+|P!k9F2wYp=cb+H39U zoO`k@zgPXotu+>fwESV@mh(RK`n6j=GwYWfdGAM@=`g!uw7*HpXtQbM=-RFJU-C3a zbPX;U>^FYeK&BGnCQFii6_SMWttqL6NLK)AgD!#~@vmw5#lUW$r{<<1B}sjumGaHN z?!XV+P_JG_I8r>e4stVNj^?*t5-ReT`6=2ePM$k6<0VGJl8^9#E447=6B?Rm_TK+JN zwiaY%=D;b{T_vd|7vJE)ci@Oiqk~8;D*BOa&JL*9E?WdZoXBLR%%*FC?yNE!AVq0i6)nxnUfYgF;Cj#CCY78$_<_^w|Wa|2Bh%M-q}ZJ z&(F-xPf3>~wMsPZw&Lp4+;$bYROfhW(Ijf}B40tLXQdPtTGOO_sGt^E3nmt3!Uk)> zgo)PtBB`{Y&}uEn%eTVT(U7B1#558%rljWPlMe@iPc0wgC-@f7aEd)GH?=T7Ge_C! z^W~3AZ!``t; zph-`QKp{U_32^pvt=2@;_#L=tti6en;OuFe&{WvlrJ1mAAuzQw92n-#O2q3=szYVV6J1ug-mk<+@BX#XzABS1F$awMpNEHs1^ zH8Ki(7kv}$uzv$gefp)=LM}8|7}6M+I?pLBzrdP3$(k=oGeSfKMJZWXnFWQ?A>@A0E5_k@HFMykVrv-DzZUAec&A^KrPPzP1A3JhAmotQ(zzP>i|;=e}O#p$jiWF zAf~T;>safQv!JP>%z~8s{FEZ;7-(u(DKLd%32;13*Rzly%f#1`Sp-b9mr#VTFz!KM1st|AQ<+dfuecmfysb! z4Z}|b)Y$saf@LlmqJOoq8+3di3WEAR)Pn}AQA8dHRpW~CHB zR7%UtR~PW##tDO;0j2@=Hp=;9I|-(3hwHj4b$nusgOTc~rd~uUPECDNncErzQSc@rCFJ%Z zCCV~HOXT)ODqbziD|r`@>aX(JAV?y2I#NQ*L8MUD)WI1M7U~j^66%&CB?^3llqe8_ zzTZbxSA>+1dk3j_<+yJLXN)YB#jHx1pG9`Xgg`Bq$XhI4iSxI}ipDc43I1kwQYrJd zuwIHBU}1}txB!cM09{O!DMy*RN*QvZ6uGg5%~awVTa3FJNKy~wIAVBTDFe5sA_rRJ z^%y!@P5x%%7ofT+@!m14nNo(_bad5x5dqZswG!9FBKu+xVoI_bR67!tGVqpx*A6^q zrM!umomJwRT8wTO{IN=W;}|wTDFgis=xDY614>*oi-CD5bDPD=9WcjXNwil}61>gw zR8XV{jYP-~D{;*&va@%kM02y;1r$}UO2|_|k-U?V(8Mh7(InxvCT8QWpn56s{xNbN z40~#%ka`wWTS0l7*&ZdXrA4lWDXtfI=$>#xKTx4$s_`kL+LA-$?MR7cmw1@vD;mWV z*8sEJ*jHGH(y%&Nk%KJq3XO+4;kt85agfE}(oi`X6e}lT5+I`us<-ATajh-vm{Q!@ zVyNCoIodjwbyMVE3tOzj;eJCY#=Wsp7HpBnV|t24L1(3;wb}Rzs3&L;%0D4RwxO=( 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 delta 21364 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 diff --git a/examples/interface/package-lock.json b/examples/interface/package-lock.json index 6316345..768b1c0 100644 --- a/examples/interface/package-lock.json +++ b/examples/interface/package-lock.json @@ -15,6 +15,7 @@ "devDependencies": { "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", + "@typescript-eslint/eslint-plugin": "^6.7.3", "@vitejs/plugin-react": "^3.1.0", "eslint": "^8.26.0", "eslint-plugin-react": "^7.31.4", @@ -1054,6 +1055,12 @@ } } }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.7", "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.7.tgz", @@ -1086,6 +1093,269 @@ "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", + "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/type-utils": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.7.3.tgz", + "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", + "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.7.3.tgz", + "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", @@ -1231,6 +1501,15 @@ "node": ">= 0.4" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -1558,6 +1837,18 @@ "node": ">= 0.4" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", @@ -2299,6 +2590,23 @@ "node": ">= 0.4" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", @@ -3230,6 +3538,15 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", @@ -3564,6 +3881,15 @@ "object-inspect": "^1.9.0" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3735,6 +4061,18 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "peer": true }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", diff --git a/examples/interface/package.json b/examples/interface/package.json index 9af27ba..0421157 100644 --- a/examples/interface/package.json +++ b/examples/interface/package.json @@ -16,6 +16,7 @@ "devDependencies": { "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", + "@typescript-eslint/eslint-plugin": "^6.7.3", "@vitejs/plugin-react": "^3.1.0", "eslint": "^8.26.0", "eslint-plugin-react": "^7.31.4", @@ -23,4 +24,4 @@ "vite": "^4.1.0", "vite-plugin-checker": "^0.5.1" } -} \ No newline at end of file +} diff --git a/examples/interface/src/App.tsx b/examples/interface/src/App.tsx index 7623992..7eacf70 100644 --- a/examples/interface/src/App.tsx +++ b/examples/interface/src/App.tsx @@ -1,10 +1,12 @@ import { useBlock } from '@starknet-react/core' import WalletBar from './components/WalletBar' +import { BlockNumber, BlockTag } from 'starknet'; function App() { + const latestBlockNumber: BlockNumber = BlockTag.latest; const { data, isLoading, isError } = useBlock({ refetchInterval: 3000, - blockIdentifier: 'latest', + blockIdentifier: latestBlockNumber, }) return ( diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx new file mode 100644 index 0000000..a7b09e4 --- /dev/null +++ b/examples/interface/src/components/ButtonClick.tsx @@ -0,0 +1,58 @@ +import { useAccount, useConnectors } from '@starknet-react/core' +import { useCallback, useMemo } from 'react' +import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' + +const ButtonClick = () => { + const { address, account } = useAccount() + + const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) + const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) + const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) + const ekubo_nft_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) + + const approveForAll: Call = useMemo(() => ({ + contractAddress: erc1155_address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: werc20_address, + approved: num.toCairoBool(true) + }) + }), [erc1155_address, werc20_address]) + + // wrap token + const depositToWERC20: Call = { + contractAddress: werc20_address, + entrypoint: "deposit", + calldata: CallData.compile({ + amount: cairo.uint256(100000n) + }) + } + + // transfer werc20 + const transferWERC20: Call = { + contractAddress: werc20_address, + entrypoint: "transfer", + calldata: CallData.compile({ + recipient: receiverAddress, + amount: cairo.uint256(100000n) + }) + } + // transfer erc20 + // mint_and_deposit + // clear werc20 + // clear erc20 + + // cancel approval + + const handleAddLiquidity = useCallback(() => { + account?.execute([approveForAll]) + }, [account, approveForAll]) + + return ( +

+ +
+ ) +} + +export default ButtonClick \ No newline at end of file From 915a9f3af89b5d2f01f6aa9b5057f2c19101108c Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 29 Sep 2023 22:35:21 +0800 Subject: [PATCH 09/42] feat: approveForAll success --- examples/interface/bun.lockb | Bin 137331 -> 137778 bytes examples/interface/package.json | 3 +- .../interface/src/components/ButtonClick.tsx | 63 ++++++++++-------- .../interface/src/components/WalletBar.tsx | 2 + 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/examples/interface/bun.lockb b/examples/interface/bun.lockb index 22d779ca89b0bee8d7d26e83cfc3f3003c3c307f..064671edec69221eeef69c95d718bef9b659d4c3 100755 GIT binary patch delta 29451 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 PKBI!Re7I2!82LW{`J|v) diff --git a/examples/interface/package.json b/examples/interface/package.json index 0421157..3963dee 100644 --- a/examples/interface/package.json +++ b/examples/interface/package.json @@ -11,7 +11,8 @@ "dependencies": { "@starknet-react/core": "^1.0.1", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "@bibliothecadao/instaswap-core": "link:instaswap/packages/instaswap-core" }, "devDependencies": { "@types/react": "^18.0.27", diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index a7b09e4..302dcb1 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -1,6 +1,7 @@ import { useAccount, useConnectors } from '@starknet-react/core' import { useCallback, useMemo } from 'react' import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' +import {Wrap} from '@bibliothecadao/instaswap-core' const ButtonClick = () => { const { address, account } = useAccount() @@ -10,33 +11,33 @@ const ButtonClick = () => { const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) const ekubo_nft_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) - const approveForAll: Call = useMemo(() => ({ - contractAddress: erc1155_address, - entrypoint: "setApprovalForAll", - calldata: CallData.compile({ - operator: werc20_address, - approved: num.toCairoBool(true) - }) - }), [erc1155_address, werc20_address]) + // const approveForAll: Call = useMemo(() => ({ + // contractAddress: erc1155_address, + // entrypoint: "setApprovalForAll", + // calldata: CallData.compile({ + // operator: werc20_address, + // approved: num.toCairoBool(true) + // }) + // }), [erc1155_address, werc20_address]) - // wrap token - const depositToWERC20: Call = { - contractAddress: werc20_address, - entrypoint: "deposit", - calldata: CallData.compile({ - amount: cairo.uint256(100000n) - }) - } + // // wrap token + // const depositToWERC20: Call = { + // contractAddress: werc20_address, + // entrypoint: "deposit", + // calldata: CallData.compile({ + // amount: cairo.uint256(100000n) + // }) + // } - // transfer werc20 - const transferWERC20: Call = { - contractAddress: werc20_address, - entrypoint: "transfer", - calldata: CallData.compile({ - recipient: receiverAddress, - amount: cairo.uint256(100000n) - }) - } + // // transfer werc20 + // const transferWERC20: Call = { + // contractAddress: werc20_address, + // entrypoint: "transfer", + // calldata: CallData.compile({ + // recipient: receiverAddress, + // amount: cairo.uint256(100000n) + // }) + // } // transfer erc20 // mint_and_deposit // clear werc20 @@ -44,9 +45,17 @@ const ButtonClick = () => { // cancel approval + const handleAddLiquidity = useCallback(() => { - account?.execute([approveForAll]) - }, [account, approveForAll]) + let wrap = new Wrap( + erc1155_address, + werc20_address, + eth_address, + ekubo_nft_address, + ) + + account?.execute(wrap.addLiquidity(1)) + }, [account]) return (
diff --git a/examples/interface/src/components/WalletBar.tsx b/examples/interface/src/components/WalletBar.tsx index 2d6ee1e..dc4d9c1 100644 --- a/examples/interface/src/components/WalletBar.tsx +++ b/examples/interface/src/components/WalletBar.tsx @@ -1,5 +1,6 @@ import { useAccount, useConnectors } from '@starknet-react/core' import { useMemo } from 'react' +import ButtonClick from './ButtonClick' function WalletConnected() { const { address } = useAccount() @@ -14,6 +15,7 @@ function WalletConnected() {
Connected: {shortenedAddress} +
) } From d6691b991f21c2b5d32bbe90ab80fc1f77867cc8 Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 29 Sep 2023 22:44:44 +0800 Subject: [PATCH 10/42] feat: add erc20 --- sdk/packages/instaswap-core/src/wrap.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 56f1791..3fe1a63 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -26,7 +26,7 @@ export class Wrap { // // // } - public addLiquidity(depositAmount: number): Call[] { + public addLiquidity(erc1155Amount: number, erc20Amount: number): Call[] { const approveForAll: Call = { contractAddress: Wrap.ERC1155Contract.address, entrypoint: "setApprovalForAll", @@ -41,7 +41,7 @@ export class Wrap { contractAddress: Wrap.WERC20Contract.address, entrypoint: "deposit", calldata: CallData.compile({ - amount: cairo.uint256(depositAmount) + amount: cairo.uint256(erc1155Amount) }) } @@ -51,16 +51,25 @@ export class Wrap { entrypoint: "transfer", calldata: CallData.compile({ recipient: Wrap.EkuboNFTContract.address, - amount: cairo.uint256(BigInt(depositAmount) * (BigInt(10) ** BigInt(18))) + amount: cairo.uint256(BigInt(erc1155Amount) * (BigInt(10) ** BigInt(18))) // wrap token has 18 decimals }) } // transfer erc20 + const transferERC20: Call = { + contractAddress: Wrap.ERC20Contract.address, + entrypoint: "transfer", + calldata: CallData.compile({ + recipient: Wrap.EkuboNFTContract.address, + amount: cairo.uint256(BigInt(erc20Amount)) + }) + } // mint_and_deposit + // clear werc20 // clear erc20 // cancel approval - return [approveForAll, depositToWERC20, transferWERC20]; + return [approveForAll, depositToWERC20, transferWERC20, transferERC20]; } } From d9c32d3fd3ace25df57a0c24cfe119bf4aafa34e Mon Sep 17 00:00:00 2001 From: felix Date: Sat, 30 Sep 2023 15:22:19 +0800 Subject: [PATCH 11/42] feat: finish add liquidity, but run failed --- .../interface/src/components/ButtonClick.tsx | 43 +++----------- sdk/packages/instaswap-core/src/wrap.ts | 56 ++++++++++++++++++- 2 files changed, 60 insertions(+), 39 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 302dcb1..148ba02 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -11,50 +11,21 @@ const ButtonClick = () => { const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) const ekubo_nft_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) - // const approveForAll: Call = useMemo(() => ({ - // contractAddress: erc1155_address, - // entrypoint: "setApprovalForAll", - // calldata: CallData.compile({ - // operator: werc20_address, - // approved: num.toCairoBool(true) - // }) - // }), [erc1155_address, werc20_address]) - - // // wrap token - // const depositToWERC20: Call = { - // contractAddress: werc20_address, - // entrypoint: "deposit", - // calldata: CallData.compile({ - // amount: cairo.uint256(100000n) - // }) - // } - - // // transfer werc20 - // const transferWERC20: Call = { - // contractAddress: werc20_address, - // entrypoint: "transfer", - // calldata: CallData.compile({ - // recipient: receiverAddress, - // amount: cairo.uint256(100000n) - // }) - // } - // transfer erc20 - // mint_and_deposit - // clear werc20 - // clear erc20 - - // cancel approval - - const handleAddLiquidity = useCallback(() => { + debugger; let wrap = new Wrap( erc1155_address, werc20_address, eth_address, ekubo_nft_address, ) + const fee = 0xcccc; + const tick_spacing = 0x01744e; + + // 10^18 + const eth_amount = 1n * 10n ** 14n; - account?.execute(wrap.addLiquidity(1)) + account?.execute(wrap.addLiquidity(1n, eth_amount, fee, tick_spacing)) }, [account]) return ( diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 3fe1a63..5931ca8 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -26,7 +26,12 @@ export class Wrap { // // // } - public addLiquidity(erc1155Amount: number, erc20Amount: number): Call[] { + public addLiquidity(erc1155Amount: bigint, erc20Amount: bigint, fee: number, tick_spacing: number): Call[] { + // sort tokens + // TODO check length + const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + + const approveForAll: Call = { contractAddress: Wrap.ERC1155Contract.address, entrypoint: "setApprovalForAll", @@ -64,12 +69,57 @@ export class Wrap { }) } // mint_and_deposit - + const mintAndDeposit: Call = { + contractAddress: Wrap.EkuboNFTContract.address, + entrypoint: "mint_and_deposit", + calldata: CallData.compile({ + pool_key: { + token0: sortedTokens[0].address, + token1: sortedTokens[1].address, + fee: fee, + tick_spacing: tick_spacing, + extension: 0, + }, + bounds: { + lower: { + mag: 88727, + sign: true, + }, + upper: { + mag: 88727, + sign: false, + } + }, + min_liquidity: 12, + }) + } // clear werc20 + const clearWERC20: Call = { + contractAddress: Wrap.EkuboNFTContract.address, + entrypoint: "clear", + calldata: CallData.compile({ + token: Wrap.WERC20Contract.address + }) + } // clear erc20 + const clearERC20: Call = { + contractAddress: Wrap.EkuboNFTContract.address, + entrypoint: "clear", + calldata: CallData.compile({ + token: Wrap.ERC20Contract.address + }) + } // cancel approval + const cancelApproval: Call = { + contractAddress: Wrap.ERC1155Contract.address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Contract.address, + approved: num.toCairoBool(false) + }) + } - return [approveForAll, depositToWERC20, transferWERC20, transferERC20]; + return [approveForAll, depositToWERC20, transferWERC20, transferERC20, mintAndDeposit, clearWERC20, clearERC20, cancelApproval]; } } From 1a393d5b417ed69b5e0e6ea8c874bde635420e79 Mon Sep 17 00:00:00 2001 From: felix Date: Sat, 30 Sep 2023 15:53:05 +0800 Subject: [PATCH 12/42] feat: add may initiallize pool --- .../interface/src/components/ButtonClick.tsx | 42 +- .../src/abi/ekubo-core-abi.json | 1132 +++++++++++++++++ sdk/packages/instaswap-core/src/wrap.ts | 32 +- 3 files changed, 1190 insertions(+), 16 deletions(-) create mode 100644 sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 148ba02..648796d 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -1,7 +1,7 @@ import { useAccount, useConnectors } from '@starknet-react/core' import { useCallback, useMemo } from 'react' import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' -import {Wrap} from '@bibliothecadao/instaswap-core' +import { Wrap } from '@bibliothecadao/instaswap-core' const ButtonClick = () => { const { address, account } = useAccount() @@ -10,27 +10,43 @@ const ButtonClick = () => { const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) const ekubo_nft_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) + const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) + + let wrap = new Wrap( + erc1155_address, + werc20_address, + eth_address, + ekubo_nft_address, + ekubo_core_address + ) + const fee = 0xccccc; + const tick_spacing = 0x0174e; const handleAddLiquidity = useCallback(() => { - debugger; - let wrap = new Wrap( - erc1155_address, - werc20_address, - eth_address, - ekubo_nft_address, - ) - const fee = 0xcccc; - const tick_spacing = 0x01744e; - + + // 10^18 const eth_amount = 1n * 10n ** 14n; - + account?.execute(wrap.addLiquidity(1n, eth_amount, fee, tick_spacing)) }, [account]) + const mayInitializePool = useCallback(() => { + let initialize_tick = { + mag: 1n, + sign: false + } + account?.execute(wrap.mayInitializePool(fee, tick_spacing, initialize_tick)) + }, [account]) + return (
- +
+ +
+
+ +
) } diff --git a/sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json b/sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json new file mode 100644 index 0000000..719f53e --- /dev/null +++ b/sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json @@ -0,0 +1,1132 @@ +[ + { + "name": "Upgradeable", + "type": "impl", + "interface_name": "ekubo::interfaces::upgradeable::IUpgradeable" + }, + { + "name": "ekubo::interfaces::upgradeable::IUpgradeable", + "type": "interface", + "items": [ + { + "name": "replace_class_hash", + "type": "function", + "inputs": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "name": "Core", + "type": "impl", + "interface_name": "ekubo::interfaces::core::ICore" + }, + { + "name": "core::bool", + "type": "enum", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "name": "ekubo::interfaces::core::LockerState", + "type": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "nonzero_delta_count", + "type": "core::integer::u32" + } + ] + }, + { + "name": "ekubo::types::keys::PoolKey", + "type": "struct", + "members": [ + { + "name": "token0", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token1", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "fee", + "type": "core::integer::u128" + }, + { + "name": "tick_spacing", + "type": "core::integer::u128" + }, + { + "name": "extension", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "name": "core::integer::u256", + "type": "struct", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "name": "ekubo::types::i129::i129", + "type": "struct", + "members": [ + { + "name": "mag", + "type": "core::integer::u128" + }, + { + "name": "sign", + "type": "core::bool" + } + ] + }, + { + "name": "ekubo::types::call_points::CallPoints", + "type": "struct", + "members": [ + { + "name": "after_initialize_pool", + "type": "core::bool" + }, + { + "name": "before_swap", + "type": "core::bool" + }, + { + "name": "after_swap", + "type": "core::bool" + }, + { + "name": "before_update_position", + "type": "core::bool" + }, + { + "name": "after_update_position", + "type": "core::bool" + } + ] + }, + { + "name": "ekubo::types::pool_price::PoolPrice", + "type": "struct", + "members": [ + { + "name": "sqrt_ratio", + "type": "core::integer::u256" + }, + { + "name": "tick", + "type": "ekubo::types::i129::i129" + }, + { + "name": "call_points", + "type": "ekubo::types::call_points::CallPoints" + } + ] + }, + { + "name": "ekubo::types::fees_per_liquidity::FeesPerLiquidity", + "type": "struct", + "members": [ + { + "name": "value0", + "type": "core::felt252" + }, + { + "name": "value1", + "type": "core::felt252" + } + ] + }, + { + "name": "ekubo::types::bounds::Bounds", + "type": "struct", + "members": [ + { + "name": "lower", + "type": "ekubo::types::i129::i129" + }, + { + "name": "upper", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "name": "ekubo::types::keys::PositionKey", + "type": "struct", + "members": [ + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "owner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ] + }, + { + "name": "ekubo::types::position::Position", + "type": "struct", + "members": [ + { + "name": "liquidity", + "type": "core::integer::u128" + }, + { + "name": "fees_per_liquidity_inside_last", + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ] + }, + { + "name": "ekubo::interfaces::core::GetPositionWithFeesResult", + "type": "struct", + "members": [ + { + "name": "position", + "type": "ekubo::types::position::Position" + }, + { + "name": "fees0", + "type": "core::integer::u128" + }, + { + "name": "fees1", + "type": "core::integer::u128" + }, + { + "name": "fees_per_liquidity_inside_current", + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ] + }, + { + "name": "ekubo::types::keys::SavedBalanceKey", + "type": "struct", + "members": [ + { + "name": "owner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "salt", + "type": "core::integer::u64" + } + ] + }, + { + "name": "core::option::Option::", + "type": "enum", + "variants": [ + { + "name": "Some", + "type": "core::integer::u256" + }, + { + "name": "None", + "type": "()" + } + ] + }, + { + "name": "ekubo::interfaces::core::UpdatePositionParameters", + "type": "struct", + "members": [ + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "name": "liquidity_delta", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "name": "ekubo::types::delta::Delta", + "type": "struct", + "members": [ + { + "name": "amount0", + "type": "ekubo::types::i129::i129" + }, + { + "name": "amount1", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "name": "ekubo::interfaces::core::SwapParameters", + "type": "struct", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "is_token1", + "type": "core::bool" + }, + { + "name": "sqrt_ratio_limit", + "type": "core::integer::u256" + }, + { + "name": "skip_ahead", + "type": "core::integer::u32" + } + ] + }, + { + "name": "ekubo::interfaces::core::ICore", + "type": "interface", + "items": [ + { + "name": "set_withdrawal_only_mode", + "type": "function", + "inputs": [], + "outputs": [], + "state_mutability": "external" + }, + { + "name": "get_withdrawal_only_mode", + "type": "function", + "inputs": [], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "name": "get_protocol_fees_collected", + "type": "function", + "inputs": [ + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "get_locker_state", + "type": "function", + "inputs": [ + { + "name": "id", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "ekubo::interfaces::core::LockerState" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_price", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ], + "outputs": [ + { + "type": "ekubo::types::pool_price::PoolPrice" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_liquidity", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_fees_per_liquidity", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ], + "outputs": [ + { + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_fees_per_liquidity_inside", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ], + "outputs": [ + { + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_tick_liquidity_delta", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "index", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "ekubo::types::i129::i129" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_tick_liquidity_net", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "index", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_tick_fees_outside", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "index", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ], + "state_mutability": "view" + }, + { + "name": "get_position", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + } + ], + "outputs": [ + { + "type": "ekubo::types::position::Position" + } + ], + "state_mutability": "view" + }, + { + "name": "get_position_with_fees", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + } + ], + "outputs": [ + { + "type": "ekubo::interfaces::core::GetPositionWithFeesResult" + } + ], + "state_mutability": "view" + }, + { + "name": "get_reserves", + "type": "function", + "inputs": [ + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view" + }, + { + "name": "get_saved_balance", + "type": "function", + "inputs": [ + { + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "next_initialized_tick", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "from", + "type": "ekubo::types::i129::i129" + }, + { + "name": "skip_ahead", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "(ekubo::types::i129::i129, core::bool)" + } + ], + "state_mutability": "view" + }, + { + "name": "prev_initialized_tick", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "from", + "type": "ekubo::types::i129::i129" + }, + { + "name": "skip_ahead", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "(ekubo::types::i129::i129, core::bool)" + } + ], + "state_mutability": "view" + }, + { + "name": "withdraw_protocol_fees", + "type": "function", + "inputs": [ + { + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "name": "lock", + "type": "function", + "inputs": [ + { + "name": "data", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::array::Array::" + } + ], + "state_mutability": "external" + }, + { + "name": "withdraw", + "type": "function", + "inputs": [ + { + "name": "token_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "name": "save", + "type": "function", + "inputs": [ + { + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "deposit", + "type": "function", + "inputs": [ + { + "name": "token_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "load", + "type": "function", + "inputs": [ + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "initialize_pool", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "initial_tick", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "external" + }, + { + "name": "maybe_initialize_pool", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "initial_tick", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "core::option::Option::" + } + ], + "state_mutability": "external" + }, + { + "name": "update_position", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "params", + "type": "ekubo::interfaces::core::UpdatePositionParameters" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + }, + { + "name": "collect_fees", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + }, + { + "name": "swap", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "params", + "type": "ekubo::interfaces::core::SwapParameters" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + }, + { + "name": "accumulate_as_fees", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "amount0", + "type": "core::integer::u128" + }, + { + "name": "amount1", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::ClassHashReplaced", + "type": "event", + "members": [ + { + "kind": "data", + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::ProtocolFeesPaid", + "type": "event", + "members": [ + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::ProtocolFeesWithdrawn", + "type": "event", + "members": [ + { + "kind": "data", + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "amount", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::PoolInitialized", + "type": "event", + "members": [ + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "initial_tick", + "type": "ekubo::types::i129::i129" + }, + { + "kind": "data", + "name": "sqrt_ratio", + "type": "core::integer::u256" + }, + { + "kind": "data", + "name": "call_points", + "type": "core::integer::u8" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::PositionUpdated", + "type": "event", + "members": [ + { + "kind": "data", + "name": "locker", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "params", + "type": "ekubo::interfaces::core::UpdatePositionParameters" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::PositionFeesCollected", + "type": "event", + "members": [ + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::Swapped", + "type": "event", + "members": [ + { + "kind": "data", + "name": "locker", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "params", + "type": "ekubo::interfaces::core::SwapParameters" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + }, + { + "kind": "data", + "name": "sqrt_ratio_after", + "type": "core::integer::u256" + }, + { + "kind": "data", + "name": "tick_after", + "type": "ekubo::types::i129::i129" + }, + { + "kind": "data", + "name": "liquidity_after", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::SavedBalance", + "type": "event", + "members": [ + { + "kind": "data", + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + }, + { + "kind": "data", + "name": "amount", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::LoadedBalance", + "type": "event", + "members": [ + { + "kind": "data", + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + }, + { + "kind": "data", + "name": "amount", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "enum", + "name": "ekubo::core::Core::Event", + "type": "event", + "variants": [ + { + "kind": "nested", + "name": "ClassHashReplaced", + "type": "ekubo::core::Core::ClassHashReplaced" + }, + { + "kind": "nested", + "name": "ProtocolFeesPaid", + "type": "ekubo::core::Core::ProtocolFeesPaid" + }, + { + "kind": "nested", + "name": "ProtocolFeesWithdrawn", + "type": "ekubo::core::Core::ProtocolFeesWithdrawn" + }, + { + "kind": "nested", + "name": "PoolInitialized", + "type": "ekubo::core::Core::PoolInitialized" + }, + { + "kind": "nested", + "name": "PositionUpdated", + "type": "ekubo::core::Core::PositionUpdated" + }, + { + "kind": "nested", + "name": "PositionFeesCollected", + "type": "ekubo::core::Core::PositionFeesCollected" + }, + { + "kind": "nested", + "name": "Swapped", + "type": "ekubo::core::Core::Swapped" + }, + { + "kind": "nested", + "name": "SavedBalance", + "type": "ekubo::core::Core::SavedBalance" + }, + { + "kind": "nested", + "name": "LoadedBalance", + "type": "ekubo::core::Core::LoadedBalance" + } + ] + } + ] \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 5931ca8..d663994 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -4,18 +4,21 @@ import ERC1155 from "./abi/erc1155-abi.json"; import WERC20 from "./abi/werc20-abi.json"; import ERC20 from "./abi/erc20-abi.json"; import EkuboNFT from "./abi/ekubo-nft-abi.json"; +import EkuboCore from "./abi/ekubo-core-abi.json"; export class Wrap { public static ERC1155Contract: Contract; public static WERC20Contract: Contract; public static ERC20Contract: Contract; public static EkuboNFTContract: Contract; + public static EkuboCoreContract: Contract; - constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboNFTAddress: string) { + constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboNFTAddress: string, EkuboCoreAddress: string) { Wrap.ERC1155Contract = new Contract(ERC1155, ERC1155Address); Wrap.WERC20Contract = new Contract(WERC20, WERC20Address); Wrap.ERC20Contract = new Contract(ERC20, ERC20Address); Wrap.EkuboNFTContract = new Contract(EkuboNFT, EkuboNFTAddress); + Wrap.EkuboCoreContract = new Contract(EkuboCore, EkuboCoreAddress); } // public deposit = async (amount: bigint) => { @@ -82,11 +85,11 @@ export class Wrap { }, bounds: { lower: { - mag: 88727, + mag: 130, sign: true, }, upper: { - mag: 88727, + mag: 210, sign: false, } }, @@ -121,5 +124,28 @@ export class Wrap { return [approveForAll, depositToWERC20, transferWERC20, transferERC20, mintAndDeposit, clearWERC20, clearERC20, cancelApproval]; } + + public mayInitializePool(fee: number, tick_spacing: number, initial_tick: { mag: bigint, sign: boolean }): Call[] { + // sort tokens + // TODO check length + const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + + const mayInitializePool: Call = { + contractAddress: Wrap.EkuboCoreContract.address, + entrypoint: "maybe_initialize_pool", + calldata: CallData.compile({ + pool_key: { + token0: sortedTokens[0].address, + token1: sortedTokens[1].address, + fee: fee, + tick_spacing: tick_spacing, + extension: 0, + }, + initial_tick + }) + } + return [mayInitializePool]; + } + } From 8e19beb8cf24083763768c61fd9a96456953d0a4 Mon Sep 17 00:00:00 2001 From: felix Date: Sat, 30 Sep 2023 17:39:20 +0800 Subject: [PATCH 13/42] feat: add position --- .../interface/src/components/ButtonClick.tsx | 4 ++-- ...o-nft-abi.json => ekubo-position-abi.json} | 0 sdk/packages/instaswap-core/src/wrap.ts | 24 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) rename sdk/packages/instaswap-core/src/abi/{ekubo-nft-abi.json => ekubo-position-abi.json} (100%) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 648796d..e9b0137 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -9,14 +9,14 @@ const ButtonClick = () => { const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) - const ekubo_nft_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) + const ekubo_position_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) let wrap = new Wrap( erc1155_address, werc20_address, eth_address, - ekubo_nft_address, + ekubo_position_address, ekubo_core_address ) const fee = 0xccccc; diff --git a/sdk/packages/instaswap-core/src/abi/ekubo-nft-abi.json b/sdk/packages/instaswap-core/src/abi/ekubo-position-abi.json similarity index 100% rename from sdk/packages/instaswap-core/src/abi/ekubo-nft-abi.json rename to sdk/packages/instaswap-core/src/abi/ekubo-position-abi.json diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index d663994..da80716 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -1,23 +1,23 @@ -import { Contract, uint256, CallData, RawArgs, Call, num, cairo } from 'starknet' +import { Contract, uint256, CallData, RawArgs, Call, num, cairo, BigNumberish } from 'starknet' import ERC1155 from "./abi/erc1155-abi.json"; import WERC20 from "./abi/werc20-abi.json"; import ERC20 from "./abi/erc20-abi.json"; -import EkuboNFT from "./abi/ekubo-nft-abi.json"; +import EkuboPosition from "./abi/ekubo-position-abi.json"; import EkuboCore from "./abi/ekubo-core-abi.json"; export class Wrap { public static ERC1155Contract: Contract; public static WERC20Contract: Contract; public static ERC20Contract: Contract; - public static EkuboNFTContract: Contract; + public static EkuboPosition: Contract; public static EkuboCoreContract: Contract; - constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboNFTAddress: string, EkuboCoreAddress: string) { + constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboPositionAddress: string, EkuboCoreAddress: string) { Wrap.ERC1155Contract = new Contract(ERC1155, ERC1155Address); Wrap.WERC20Contract = new Contract(WERC20, WERC20Address); Wrap.ERC20Contract = new Contract(ERC20, ERC20Address); - Wrap.EkuboNFTContract = new Contract(EkuboNFT, EkuboNFTAddress); + Wrap.EkuboPosition = new Contract(EkuboPosition, EkuboPositionAddress); Wrap.EkuboCoreContract = new Contract(EkuboCore, EkuboCoreAddress); } @@ -29,7 +29,7 @@ export class Wrap { // // // } - public addLiquidity(erc1155Amount: bigint, erc20Amount: bigint, fee: number, tick_spacing: number): Call[] { + public addLiquidity(erc1155Amount: BigNumberish, erc20Amount: BigNumberish, fee: BigNumberish, tick_spacing: BigNumberish): Call[] { // sort tokens // TODO check length const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); @@ -58,7 +58,7 @@ export class Wrap { contractAddress: Wrap.WERC20Contract.address, entrypoint: "transfer", calldata: CallData.compile({ - recipient: Wrap.EkuboNFTContract.address, + recipient: Wrap.EkuboPosition.address, amount: cairo.uint256(BigInt(erc1155Amount) * (BigInt(10) ** BigInt(18))) // wrap token has 18 decimals }) } @@ -67,13 +67,13 @@ export class Wrap { contractAddress: Wrap.ERC20Contract.address, entrypoint: "transfer", calldata: CallData.compile({ - recipient: Wrap.EkuboNFTContract.address, + recipient: Wrap.EkuboPosition.address, amount: cairo.uint256(BigInt(erc20Amount)) }) } // mint_and_deposit const mintAndDeposit: Call = { - contractAddress: Wrap.EkuboNFTContract.address, + contractAddress: Wrap.EkuboPosition.address, entrypoint: "mint_and_deposit", calldata: CallData.compile({ pool_key: { @@ -98,7 +98,7 @@ export class Wrap { } // clear werc20 const clearWERC20: Call = { - contractAddress: Wrap.EkuboNFTContract.address, + contractAddress: Wrap.EkuboPosition.address, entrypoint: "clear", calldata: CallData.compile({ token: Wrap.WERC20Contract.address @@ -106,7 +106,7 @@ export class Wrap { } // clear erc20 const clearERC20: Call = { - contractAddress: Wrap.EkuboNFTContract.address, + contractAddress: Wrap.EkuboPosition.address, entrypoint: "clear", calldata: CallData.compile({ token: Wrap.ERC20Contract.address @@ -125,7 +125,7 @@ export class Wrap { return [approveForAll, depositToWERC20, transferWERC20, transferERC20, mintAndDeposit, clearWERC20, clearERC20, cancelApproval]; } - public mayInitializePool(fee: number, tick_spacing: number, initial_tick: { mag: bigint, sign: boolean }): Call[] { + public mayInitializePool(fee: BigNumberish, tick_spacing: BigNumberish, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { // sort tokens // TODO check length const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); From b2d0c2399d34bdc5e8201d2ceaa41636ca6f0cf5 Mon Sep 17 00:00:00 2001 From: felix Date: Sat, 30 Sep 2023 17:55:07 +0800 Subject: [PATCH 14/42] feat: add_liquidity pass --- examples/interface/src/components/ButtonClick.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index e9b0137..8b80440 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -20,7 +20,7 @@ const ButtonClick = () => { ekubo_core_address ) const fee = 0xccccc; - const tick_spacing = 0x0174e; + const tick_spacing = 0x1; const handleAddLiquidity = useCallback(() => { From a256b3ef7321186200635516bee8ebb372e6eef5 Mon Sep 17 00:00:00 2001 From: felix Date: Sun, 1 Oct 2023 16:50:52 +0800 Subject: [PATCH 15/42] feat: add bounds when adding liquidity --- .../interface/src/components/ButtonClick.tsx | 11 ++-- sdk/bun.lockb | Bin 133597 -> 133918 bytes sdk/packages/instaswap-core/package.json | 4 ++ sdk/packages/instaswap-core/src/constants.ts | 20 ++++++++ sdk/packages/instaswap-core/src/index.ts | 1 + sdk/packages/instaswap-core/src/tickMath.ts | 48 ++++++++++++++++++ sdk/packages/instaswap-core/src/wrap.ts | 43 ++++++++++++---- 7 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 sdk/packages/instaswap-core/src/constants.ts create mode 100644 sdk/packages/instaswap-core/src/tickMath.ts diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 8b80440..dd240cd 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -2,6 +2,7 @@ import { useAccount, useConnectors } from '@starknet-react/core' import { useCallback, useMemo } from 'react' import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' import { Wrap } from '@bibliothecadao/instaswap-core' +import { FeeAmount } from '@bibliothecadao/instaswap-core' const ButtonClick = () => { const { address, account } = useAccount() @@ -19,24 +20,22 @@ const ButtonClick = () => { ekubo_position_address, ekubo_core_address ) - const fee = 0xccccc; - const tick_spacing = 0x1; const handleAddLiquidity = useCallback(() => { // 10^18 const eth_amount = 1n * 10n ** 14n; - - account?.execute(wrap.addLiquidity(1n, eth_amount, fee, tick_spacing)) + debugger; + account?.execute(wrap.addLiquidity(1n, eth_amount, FeeAmount.MEDIUM, 0.0001, 0.0002)) }, [account]) const mayInitializePool = useCallback(() => { let initialize_tick = { - mag: 1n, + mag: 0n, sign: false } - account?.execute(wrap.mayInitializePool(fee, tick_spacing, initialize_tick)) + account?.execute(wrap.mayInitializePool(FeeAmount.MEDIUM, initialize_tick)) }, [account]) return ( diff --git a/sdk/bun.lockb b/sdk/bun.lockb index 5acccd8f1be2842481159545ae24249ad0279e77..7f59dcfd11f8ce93660ed9184bf8181370f74d9f 100755 GIT binary patch delta 30937 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 a.address.localeCompare(b.address)); @@ -71,6 +76,19 @@ export class Wrap { amount: cairo.uint256(BigInt(erc20Amount)) }) } + Decimal.set({ precision: 78 }); + let lowerSqrtRatioX128 = new Decimal(lowerPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); + let upperSqrtRatioX128 = new Decimal(upperPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); + const lowerTick = TickMath.getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); + const upperTick = TickMath.getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); + if (lowerTick > upperTick) { + throw new Error("lowerTick should be less than upperTick"); + } + let absLowerTick = Math.abs(lowerTick); + let signLowerTick = lowerTick < 0 ? true : false; + let absUpperTick = Math.abs(upperTick); + let signUpperTick = upperTick < 0 ? true : false; + // mint_and_deposit const mintAndDeposit: Call = { contractAddress: Wrap.EkuboPosition.address, @@ -79,18 +97,18 @@ export class Wrap { pool_key: { token0: sortedTokens[0].address, token1: sortedTokens[1].address, - fee: fee, - tick_spacing: tick_spacing, + fee: Wrap.getFeeX128(fee), + tick_spacing: 1, extension: 0, }, bounds: { lower: { - mag: 130, - sign: true, + mag: absLowerTick, + sign: signLowerTick, }, upper: { - mag: 210, - sign: false, + mag: absUpperTick, + sign: signUpperTick, } }, min_liquidity: 12, @@ -125,7 +143,7 @@ export class Wrap { return [approveForAll, depositToWERC20, transferWERC20, transferERC20, mintAndDeposit, clearWERC20, clearERC20, cancelApproval]; } - public mayInitializePool(fee: BigNumberish, tick_spacing: BigNumberish, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { + public mayInitializePool(fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { // sort tokens // TODO check length const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); @@ -137,8 +155,8 @@ export class Wrap { pool_key: { token0: sortedTokens[0].address, token1: sortedTokens[1].address, - fee: fee, - tick_spacing: tick_spacing, + fee: Wrap.getFeeX128(fee), + tick_spacing: 1n, extension: 0, }, initial_tick @@ -147,5 +165,10 @@ export class Wrap { return [mayInitializePool]; } + public static getFeeX128(fee: FeeAmount): bigint { + let feeX128 = BigInt(fee) * (2n ** 128n) / (10n ** 6n); + return feeX128; + } + } From 84afd829544152cdeb80dcafb5456de70ec9cbfe Mon Sep 17 00:00:00 2001 From: felix Date: Mon, 2 Oct 2023 17:09:58 +0800 Subject: [PATCH 16/42] feat: add input text --- .../interface/src/components/ButtonClick.tsx | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index dd240cd..c5f5844 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -1,10 +1,13 @@ import { useAccount, useConnectors } from '@starknet-react/core' -import { useCallback, useMemo } from 'react' +import { useCallback, useMemo, useState } from 'react' import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' import { Wrap } from '@bibliothecadao/instaswap-core' import { FeeAmount } from '@bibliothecadao/instaswap-core' + const ButtonClick = () => { + const [lowerBound, setLowerBound] = useState(0); + const [upperBound, setUpperBound] = useState(0); const { address, account } = useAccount() const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) @@ -22,13 +25,10 @@ const ButtonClick = () => { ) const handleAddLiquidity = useCallback(() => { - - - // 10^18 - const eth_amount = 1n * 10n ** 14n; debugger; - account?.execute(wrap.addLiquidity(1n, eth_amount, FeeAmount.MEDIUM, 0.0001, 0.0002)) - }, [account]) + const eth_amount = 1n * 10n ** 14n; + account?.execute(wrap.addLiquidity(1n, eth_amount, FeeAmount.MEDIUM, lowerBound, upperBound)) + }, [account, lowerBound, upperBound]) const mayInitializePool = useCallback(() => { let initialize_tick = { @@ -36,16 +36,25 @@ const ButtonClick = () => { sign: false } account?.execute(wrap.mayInitializePool(FeeAmount.MEDIUM, initialize_tick)) - }, [account]) + }, [account, lowerBound, upperBound]) return (
- +
- + + setLowerBound(parseFloat(e.target.value))} /> +
+
+ + setUpperBound(parseFloat(e.target.value))} />
+
+ +
+
) } From d7db741ea3dea4f1a1da3d1fba1331a8116d7d1c Mon Sep 17 00:00:00 2001 From: felix Date: Mon, 2 Oct 2023 17:59:45 +0800 Subject: [PATCH 17/42] feat: add erc1155 balance check --- .../interface/src/components/ButtonClick.tsx | 25 +++++++++++++++++-- sdk/packages/instaswap-core/src/wrap.ts | 20 +++++++++------ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index c5f5844..6141404 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -1,28 +1,46 @@ import { useAccount, useConnectors } from '@starknet-react/core' -import { useCallback, useMemo, useState } from 'react' +import { useCallback, useMemo, useState, useEffect } from 'react' import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' import { Wrap } from '@bibliothecadao/instaswap-core' import { FeeAmount } from '@bibliothecadao/instaswap-core' +import { Provider, constants } from "starknet" const ButtonClick = () => { const [lowerBound, setLowerBound] = useState(0); const [upperBound, setUpperBound] = useState(0); const { address, account } = useAccount() + const [balance, setBalance] = useState("0"); const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) const ekubo_position_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) + const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); let wrap = new Wrap( erc1155_address, werc20_address, eth_address, ekubo_position_address, - ekubo_core_address + ekubo_core_address, + provider ) + const getERC1155Balance = useCallback(async () => { + if (!address) return; + debugger; + let b = await Wrap.getERC1155Balance(address, 1); + setBalance(b.toString()); + }, [address, erc1155_address]); + + useEffect(() => { + getERC1155Balance(); + const interval = setInterval(() => { + getERC1155Balance(); + }, 10000); + return () => clearInterval(interval); + }, [getERC1155Balance]); const handleAddLiquidity = useCallback(() => { debugger; @@ -51,6 +69,9 @@ const ButtonClick = () => { setUpperBound(parseFloat(e.target.value))} />
+
+

ERC1155 Balance: {balance}

+
diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 87218a2..eac90bc 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -1,4 +1,4 @@ -import { Contract, uint256, CallData, RawArgs, Call, num, cairo, BigNumberish } from 'starknet' +import { Contract, uint256, CallData, RawArgs, Call, num, cairo, BigNumberish, Provider } from 'starknet' import ERC1155 from "./abi/erc1155-abi.json"; import WERC20 from "./abi/werc20-abi.json"; @@ -17,12 +17,12 @@ export class Wrap { public static EkuboPosition: Contract; public static EkuboCoreContract: Contract; - constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboPositionAddress: string, EkuboCoreAddress: string) { - Wrap.ERC1155Contract = new Contract(ERC1155, ERC1155Address); - Wrap.WERC20Contract = new Contract(WERC20, WERC20Address); - Wrap.ERC20Contract = new Contract(ERC20, ERC20Address); - Wrap.EkuboPosition = new Contract(EkuboPosition, EkuboPositionAddress); - Wrap.EkuboCoreContract = new Contract(EkuboCore, EkuboCoreAddress); + constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboPositionAddress: string, EkuboCoreAddress: string, provider: Provider) { + Wrap.ERC1155Contract = new Contract(ERC1155, ERC1155Address, provider); + Wrap.WERC20Contract = new Contract(WERC20, WERC20Address, provider); + Wrap.ERC20Contract = new Contract(ERC20, ERC20Address, provider); + Wrap.EkuboPosition = new Contract(EkuboPosition, EkuboPositionAddress, provider); + Wrap.EkuboCoreContract = new Contract(EkuboCore, EkuboCoreAddress, provider); } // public deposit = async (amount: bigint) => { @@ -170,5 +170,11 @@ export class Wrap { return feeX128; } + public static getERC1155Balance = async (address: string, tokenId: BigNumberish): Promise => { + const tokenIdCairo = cairo.uint256(tokenId); + const balance = await Wrap.ERC1155Contract.balance_of(address, tokenIdCairo); + return balance + } + } From bbe6766e7d3a399e26562a60b0e5fbaed55845d2 Mon Sep 17 00:00:00 2001 From: felix Date: Mon, 2 Oct 2023 18:11:35 +0800 Subject: [PATCH 18/42] feat: add erc1155 mint --- .../interface/src/components/ButtonClick.tsx | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 6141404..ec7350c 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -3,7 +3,7 @@ import { useCallback, useMemo, useState, useEffect } from 'react' import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' import { Wrap } from '@bibliothecadao/instaswap-core' import { FeeAmount } from '@bibliothecadao/instaswap-core' -import { Provider, constants } from "starknet" +import { Provider, constants, cairo } from "starknet" const ButtonClick = () => { @@ -11,6 +11,7 @@ const ButtonClick = () => { const [upperBound, setUpperBound] = useState(0); const { address, account } = useAccount() const [balance, setBalance] = useState("0"); + const [mintAmount, setMintAmount] = useState(0); const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) @@ -29,7 +30,6 @@ const ButtonClick = () => { ) const getERC1155Balance = useCallback(async () => { if (!address) return; - debugger; let b = await Wrap.getERC1155Balance(address, 1); setBalance(b.toString()); }, [address, erc1155_address]); @@ -43,7 +43,6 @@ const ButtonClick = () => { }, [getERC1155Balance]); const handleAddLiquidity = useCallback(() => { - debugger; const eth_amount = 1n * 10n ** 14n; account?.execute(wrap.addLiquidity(1n, eth_amount, FeeAmount.MEDIUM, lowerBound, upperBound)) }, [account, lowerBound, upperBound]) @@ -56,6 +55,22 @@ const ButtonClick = () => { account?.execute(wrap.mayInitializePool(FeeAmount.MEDIUM, initialize_tick)) }, [account, lowerBound, upperBound]) + const mintERC1155Token = useCallback(async () => { + if (!address) return; + const call: Call = { + contractAddress: Wrap.ERC1155Contract.address, + entrypoint: "mint", + calldata: CallData.compile({ + to: address, + id: cairo.uint256(1), + amount: cairo.uint256(mintAmount), + }) + } + account?.execute( + call + ) + }, [address, erc1155_address, getERC1155Balance, mintAmount]); + return (
@@ -72,6 +87,14 @@ const ButtonClick = () => {

ERC1155 Balance: {balance}

+
+ + setMintAmount(parseFloat(e.target.value))} /> +
+
+ +
+
From bda0ae79e0faa3c88a67677e044d599ded38dc6b Mon Sep 17 00:00:00 2001 From: felix Date: Mon, 2 Oct 2023 20:08:08 +0800 Subject: [PATCH 19/42] feat: add more input for erc1155 amount --- .../interface/src/components/ButtonClick.tsx | 39 +++++--- sdk/packages/instaswap-core/src/tickMath.ts | 13 ++- sdk/packages/instaswap-core/src/wrap.test.ts | 98 +++++++++---------- 3 files changed, 86 insertions(+), 64 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index ec7350c..6c11607 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -12,6 +12,8 @@ const ButtonClick = () => { const { address, account } = useAccount() const [balance, setBalance] = useState("0"); const [mintAmount, setMintAmount] = useState(0); + const [erc1155Amount, setAddLiquidityERC1155Amount] = useState(0); + const [ethAmount, setAddLiquidityEthAmount] = useState(0); const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) @@ -43,9 +45,11 @@ const ButtonClick = () => { }, [getERC1155Balance]); const handleAddLiquidity = useCallback(() => { - const eth_amount = 1n * 10n ** 14n; - account?.execute(wrap.addLiquidity(1n, eth_amount, FeeAmount.MEDIUM, lowerBound, upperBound)) - }, [account, lowerBound, upperBound]) + if (!account) return; + const realERC1155Amount = erc1155Amount; + const realERC20Amount = ethAmount * (10 **18); + account?.execute(wrap.addLiquidity(realERC1155Amount, realERC20Amount, FeeAmount.MEDIUM, lowerBound, upperBound)) + }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) const mayInitializePool = useCallback(() => { let initialize_tick = { @@ -77,15 +81,10 @@ const ButtonClick = () => {
- - setLowerBound(parseFloat(e.target.value))} /> -
-
- - setUpperBound(parseFloat(e.target.value))} /> +

ERC1155 Balance: {balance}

-

ERC1155 Balance: {balance}

+

Mint ERC1155

@@ -94,7 +93,25 @@ const ButtonClick = () => {
- +
+

Add Liquidity

+
+
+ + setLowerBound(parseFloat(e.target.value))} /> +
+
+ + setUpperBound(parseFloat(e.target.value))} /> +
+
+ + setAddLiquidityERC1155Amount(parseFloat(e.target.value))} /> +
+
+ + setAddLiquidityEthAmount(parseFloat(e.target.value))} /> +
diff --git a/sdk/packages/instaswap-core/src/tickMath.ts b/sdk/packages/instaswap-core/src/tickMath.ts index 16c877a..003b292 100644 --- a/sdk/packages/instaswap-core/src/tickMath.ts +++ b/sdk/packages/instaswap-core/src/tickMath.ts @@ -1,8 +1,13 @@ -import {Decimal} from 'decimal.js-light'; +import { Decimal } from 'decimal.js-light'; import JSBI from 'jsbi'; -export class TickMath { +export abstract class TickMath { + + /** + * Cannot be constructed. + */ + private constructor() { } public static getTickAtSqrtRatio(sqrt_ratio_x128: bigint): number { // A fixed point .128 number has at most 128 bits after the decimal, @@ -20,7 +25,7 @@ export class TickMath { .div(new Decimal('2').log()) .toFixed(0); return Number(tick); - + } public static getSqrtRatioAtTick(tick: number): bigint { @@ -32,7 +37,7 @@ export class TickMath { // but this should be sufficient for just computing the price. Decimal.set({ precision: 78 }); - const sqrt_ratio_x128 = + const sqrt_ratio_x128 = new Decimal('1.000001') .sqrt() .pow(tick) diff --git a/sdk/packages/instaswap-core/src/wrap.test.ts b/sdk/packages/instaswap-core/src/wrap.test.ts index f794399..7a770f1 100644 --- a/sdk/packages/instaswap-core/src/wrap.test.ts +++ b/sdk/packages/instaswap-core/src/wrap.test.ts @@ -1,64 +1,64 @@ -import { - Account, - Contract, - DeclareDeployUDCResponse, - DeployTransactionReceiptResponse, - Provider, - TransactionType, - cairo, - contractClassResponseToLegacyCompiledContract, - ec, - extractContractHashes, - hash, - num, - parseUDCEvent, - shortString, - stark, - constants - } from 'starknet'; -import {describe, expect, test, beforeAll} from '@jest/globals'; +// import { +// Account, +// Contract, +// DeclareDeployUDCResponse, +// DeployTransactionReceiptResponse, +// Provider, +// TransactionType, +// cairo, +// contractClassResponseToLegacyCompiledContract, +// ec, +// extractContractHashes, +// hash, +// num, +// parseUDCEvent, +// shortString, +// stark, +// constants +// } from 'starknet'; +// import {describe, expect, test, beforeAll} from '@jest/globals'; -import {Wrap} from './wrap'; +// import {Wrap} from './wrap'; -const { cleanHex, hexToDecimalString, toBigInt, toHex } = num; -const { encodeShortString } = shortString; -const { randomAddress } = stark; -const { uint256 } = cairo; -const { Signature } = ec.starkCurve; +// const { cleanHex, hexToDecimalString, toBigInt, toHex } = num; +// const { encodeShortString } = shortString; +// const { randomAddress } = stark; +// const { uint256 } = cairo; +// const { Signature } = ec.starkCurve; -const DEFAULT_TEST_ACCOUNT_ADDRESS = - '0x41a44af91dce40db477e72b1c69ee440333b70acca5d973644ed2f9983d8990'; -const DEFAULT_TEST_ACCOUNT_PUBLIC_KEY = '0x61e0c11613e66dd0364c2fca21db1c728e8d6b4e8a57a8a128755dd17b4a9b2'; -const DEFAULT_TEST_ACCOUNT_PRIVATE_KEY = '0x69cb61a345cbb5b67f134a931eacede43d6c07407bb6384a15f663159bb184f'; +// const DEFAULT_TEST_ACCOUNT_ADDRESS = +// '0x41a44af91dce40db477e72b1c69ee440333b70acca5d973644ed2f9983d8990'; +// const DEFAULT_TEST_ACCOUNT_PUBLIC_KEY = '0x61e0c11613e66dd0364c2fca21db1c728e8d6b4e8a57a8a128755dd17b4a9b2'; +// const DEFAULT_TEST_ACCOUNT_PRIVATE_KEY = '0x69cb61a345cbb5b67f134a931eacede43d6c07407bb6384a15f663159bb184f'; -const erc1155_address = "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6"; -const werc20_address = "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4"; -const eth_address = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"; -const ekubo_nft_address = "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc"; -describe('deploy and test Wallet', () => { - let testAccountAddress = DEFAULT_TEST_ACCOUNT_ADDRESS; - let testAccountPrivateKey = DEFAULT_TEST_ACCOUNT_PRIVATE_KEY; - const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); - const account = new Account(provider, toHex(testAccountAddress), testAccountPrivateKey, '0'); +// const erc1155_address = "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6"; +// const werc20_address = "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4"; +// const eth_address = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"; +// const ekubo_nft_address = "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc"; +// describe('deploy and test Wallet', () => { +// let testAccountAddress = DEFAULT_TEST_ACCOUNT_ADDRESS; +// let testAccountPrivateKey = DEFAULT_TEST_ACCOUNT_PRIVATE_KEY; +// const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); +// const account = new Account(provider, toHex(testAccountAddress), testAccountPrivateKey, '0'); - let wrap = new Wrap( - erc1155_address, - werc20_address, - eth_address, - ekubo_nft_address - ); +// let wrap = new Wrap( +// erc1155_address, +// werc20_address, +// eth_address, +// ekubo_nft_address +// ); - test('test add liquidity', async () => { - const { transaction_hash } = await account.execute(wrap.addLiquidity(1)); - const receipt = await account.waitForTransaction(transaction_hash); +// test('test add liquidity', async () => { +// const { transaction_hash } = await account.execute(wrap.addLiquidity(1)); +// const receipt = await account.waitForTransaction(transaction_hash); - }); +// }); - }); \ No newline at end of file +// }); \ No newline at end of file From a88e291aa829e60bba5fd2b568bc72ff8185de8b Mon Sep 17 00:00:00 2001 From: felix Date: Tue, 3 Oct 2023 15:20:05 +0800 Subject: [PATCH 20/42] feat: fix order bug --- .../interface/src/components/ButtonClick.tsx | 38 +++++++++-- sdk/packages/instaswap-core/src/wrap.ts | 68 ++++++++++++++++++- 2 files changed, 99 insertions(+), 7 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 6c11607..8b4f113 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -11,15 +11,18 @@ const ButtonClick = () => { const [upperBound, setUpperBound] = useState(0); const { address, account } = useAccount() const [balance, setBalance] = useState("0"); + const [currentPrice, setCurrentPrice] = useState(0); const [mintAmount, setMintAmount] = useState(0); const [erc1155Amount, setAddLiquidityERC1155Amount] = useState(0); const [ethAmount, setAddLiquidityEthAmount] = useState(0); + const [erc1155AmountForSwap, setERC1155AmountForSwap] = useState(0); const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) const ekubo_position_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) + const avnu_address = useMemo(() => "0x04270219d365d6b017231b52e92b3fb5d7c8378b05e9abc97724537a80e93b0f", []) const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); let wrap = new Wrap( @@ -36,6 +39,12 @@ const ButtonClick = () => { setBalance(b.toString()); }, [address, erc1155_address]); + const getCurrentPrice = useCallback(async () => { + if (!address) return; + let p = await Wrap.getCurrentPrice(); + setCurrentPrice(p); + }, [address, erc1155_address]); + useEffect(() => { getERC1155Balance(); const interval = setInterval(() => { @@ -51,6 +60,12 @@ const ButtonClick = () => { account?.execute(wrap.addLiquidity(realERC1155Amount, realERC20Amount, FeeAmount.MEDIUM, lowerBound, upperBound)) }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) + const handleSwapFromERC1155ToERC20ByAVNU = useCallback(() => { + if (!account) return; + const realERC1155Amount = erc1155AmountForSwap; + account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 0, avnu_address, account.address, FeeAmount.MEDIUM, 0.99, currentPrice)) + }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) + const mayInitializePool = useCallback(() => { let initialize_tick = { mag: 0n, @@ -83,6 +98,9 @@ const ButtonClick = () => {

ERC1155 Balance: {balance}

+
+

Current Price : {currentPrice}

+

Mint ERC1155

@@ -97,23 +115,33 @@ const ButtonClick = () => {

Add Liquidity

- + setLowerBound(parseFloat(e.target.value))} />
- + setUpperBound(parseFloat(e.target.value))} />
+
+ + setAddLiquidityEthAmount(parseFloat(e.target.value))} /> +
setAddLiquidityERC1155Amount(parseFloat(e.target.value))} />
- - setAddLiquidityEthAmount(parseFloat(e.target.value))} /> +
- +

Swap From ERC1155 to ERC20

+
+
+ + setERC1155AmountForSwap(parseFloat(e.target.value))} /> +
+
+
diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index eac90bc..2710957 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -7,7 +7,7 @@ import EkuboPosition from "./abi/ekubo-position-abi.json"; import EkuboCore from "./abi/ekubo-core-abi.json"; import { FeeAmount } from './constants'; import { TickMath } from './tickMath'; -import {Decimal} from 'decimal.js-light'; +import { Decimal } from 'decimal.js-light'; export class Wrap { @@ -98,7 +98,7 @@ export class Wrap { token0: sortedTokens[0].address, token1: sortedTokens[1].address, fee: Wrap.getFeeX128(fee), - tick_spacing: 1, + tick_spacing: 1, extension: 0, }, bounds: { @@ -143,6 +143,70 @@ export class Wrap { return [approveForAll, depositToWERC20, transferWERC20, transferERC20, mintAndDeposit, clearWERC20, clearERC20, cancelApproval]; } + public withdraw(id: number) { + // sort tokens + // TODO check length + const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + + + } + + public swapFromERC1155ToERC20ByAVNU(erc1155AmountIn: BigNumberish, minERC20AmountOut: BigNumberish, aggregatorAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { + // sort tokens + // TODO check length + const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + if (slippage < 0 || slippage > 1) { + throw new Error("slippage should be between 0 and 1"); + } + const erc20AmountIn = BigInt(erc1155AmountIn.toString()) * BigInt(10 ** 18); + Decimal.set({ precision: 78 }); + let sqrtRatioLimitX128 = (Wrap.ERC20Contract.address < Wrap.WERC20Contract.address) ? new Decimal(currentPrice / 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0) : new Decimal(currentPrice * 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); + // approve WERC20 + const approveWERC20: Call = { + contractAddress: Wrap.WERC20Contract.address, + entrypoint: "approve", + calldata: CallData.compile({ + spender: aggregatorAddress, + amount: erc20AmountIn + }) + } + // swap + const multiRouteSwap: Call = { + contractAddress: aggregatorAddress, + entrypoint: "multi_route_swap", + calldata: CallData.compile({ + token_from_address: Wrap.WERC20Contract.address, + token_from_amount: erc20AmountIn, + token_to_address: Wrap.ERC20Contract.address, + token_to_amount: minERC20AmountOut, // this is useless in avnu contract + token_to_min_amount: minERC20AmountOut, + beneficiary: userAddress, + integrator_fee_amount_bps: 0, + integrator_fee_recipient: 0, + routes: [ + { + token_from: Wrap.WERC20Contract.address, + token_to: Wrap.ERC20Contract.address, + exchange_address: Wrap.EkuboCoreContract.address, + percent: 100, + additional_swap_params: { + value: [ + sortedTokens[0].address, + sortedTokens[1].address, + Wrap.getFeeX128(fee),, //fee for determin the pool_key + 1, // tick_spacing for determin the pool_key + 0, // extension for determin the pool_key + sqrtRatioLimitX128 //sqrt_ratio_limit + ], + } + } + ] + }) + } + return [approveWERC20, multiRouteSwap]; + + } + public mayInitializePool(fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { // sort tokens // TODO check length From 91a5a15fed375c3a354d4ddc5d39ea22cefbb771 Mon Sep 17 00:00:00 2001 From: felix Date: Tue, 3 Oct 2023 16:07:35 +0800 Subject: [PATCH 21/42] feat: not can swap yet --- .../interface/src/components/ButtonClick.tsx | 4 +- sdk/packages/instaswap-core/src/wrap.ts | 43 +++++++++++++------ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 8b4f113..4f28e2b 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -41,8 +41,8 @@ const ButtonClick = () => { const getCurrentPrice = useCallback(async () => { if (!address) return; - let p = await Wrap.getCurrentPrice(); - setCurrentPrice(p); + // let p = await Wrap.getCurrentPrice(); + // setCurrentPrice(p); }, [address, erc1155_address]); useEffect(() => { diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 2710957..f04dd21 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -158,16 +158,33 @@ export class Wrap { if (slippage < 0 || slippage > 1) { throw new Error("slippage should be between 0 and 1"); } - const erc20AmountIn = BigInt(erc1155AmountIn.toString()) * BigInt(10 ** 18); + const werc20AmountIn = BigInt(erc1155AmountIn.toString()) * BigInt(10 ** 18); Decimal.set({ precision: 78 }); let sqrtRatioLimitX128 = (Wrap.ERC20Contract.address < Wrap.WERC20Contract.address) ? new Decimal(currentPrice / 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0) : new Decimal(currentPrice * 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); + + const approveForAll: Call = { + contractAddress: Wrap.ERC1155Contract.address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Contract.address, + approved: num.toCairoBool(true) + }) + } + // wrap token + const depositToWERC20: Call = { + contractAddress: Wrap.WERC20Contract.address, + entrypoint: "deposit", + calldata: CallData.compile({ + amount: cairo.uint256(erc1155AmountIn) + }) + } // approve WERC20 const approveWERC20: Call = { contractAddress: Wrap.WERC20Contract.address, entrypoint: "approve", calldata: CallData.compile({ spender: aggregatorAddress, - amount: erc20AmountIn + amount: werc20AmountIn }) } // swap @@ -176,7 +193,7 @@ export class Wrap { entrypoint: "multi_route_swap", calldata: CallData.compile({ token_from_address: Wrap.WERC20Contract.address, - token_from_amount: erc20AmountIn, + token_from_amount: werc20AmountIn, token_to_address: Wrap.ERC20Contract.address, token_to_amount: minERC20AmountOut, // this is useless in avnu contract token_to_min_amount: minERC20AmountOut, @@ -189,21 +206,19 @@ export class Wrap { token_to: Wrap.ERC20Contract.address, exchange_address: Wrap.EkuboCoreContract.address, percent: 100, - additional_swap_params: { - value: [ - sortedTokens[0].address, - sortedTokens[1].address, - Wrap.getFeeX128(fee),, //fee for determin the pool_key - 1, // tick_spacing for determin the pool_key - 0, // extension for determin the pool_key - sqrtRatioLimitX128 //sqrt_ratio_limit - ], - } + additional_swap_params: [ + sortedTokens[0].address, + sortedTokens[1].address, + Wrap.getFeeX128(fee), //fee for determin the pool_key + 1, // tick_spacing for determin the pool_key + 0, // extension for determin the pool_key + sqrtRatioLimitX128 //sqrt_ratio_limit + ], } ] }) } - return [approveWERC20, multiRouteSwap]; + return [approveForAll, depositToWERC20, approveWERC20,]; } From 17b7b43cbe56b0a83767ba479d228b2aac0e9cbf Mon Sep 17 00:00:00 2001 From: felix Date: Tue, 3 Oct 2023 16:09:31 +0800 Subject: [PATCH 22/42] feat: fix bugs --- sdk/packages/instaswap-core/src/wrap.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index f04dd21..03e9571 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -184,7 +184,7 @@ export class Wrap { entrypoint: "approve", calldata: CallData.compile({ spender: aggregatorAddress, - amount: werc20AmountIn + amount: cairo.uint256(werc20AmountIn) }) } // swap @@ -218,7 +218,7 @@ export class Wrap { ] }) } - return [approveForAll, depositToWERC20, approveWERC20,]; + return [approveForAll, depositToWERC20, approveWERC20,multiRouteSwap]; } From 4aa66e062deb6afc0a2efb9baf628c10cb26ff1f Mon Sep 17 00:00:00 2001 From: felix Date: Wed, 4 Oct 2023 17:12:39 +0800 Subject: [PATCH 23/42] feat: add avnu swap --- .../interface/src/components/ButtonClick.tsx | 4 +- sdk/packages/instaswap-core/src/wrap.ts | 55 ++++++++++--------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 4f28e2b..1922958 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -22,7 +22,7 @@ const ButtonClick = () => { const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) const ekubo_position_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) - const avnu_address = useMemo(() => "0x04270219d365d6b017231b52e92b3fb5d7c8378b05e9abc97724537a80e93b0f", []) + const avnu_address = useMemo(() => "0x07e36202ace0ab52bf438bd8a8b64b3731c48d09f0d8879f5b006384c2f35032", []) const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); let wrap = new Wrap( @@ -63,7 +63,7 @@ const ButtonClick = () => { const handleSwapFromERC1155ToERC20ByAVNU = useCallback(() => { if (!account) return; const realERC1155Amount = erc1155AmountForSwap; - account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 0, avnu_address, account.address, FeeAmount.MEDIUM, 0.99, currentPrice)) + account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 1313331313, avnu_address, account.address, FeeAmount.MEDIUM, 0.99, currentPrice)) }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) const mayInitializePool = useCallback(() => { diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 03e9571..d3d76c8 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -187,38 +187,39 @@ export class Wrap { amount: cairo.uint256(werc20AmountIn) }) } + let tmp = { + token_from_address: Wrap.WERC20Contract.address, + token_from_amount: cairo.uint256(werc20AmountIn), + token_to_address: Wrap.ERC20Contract.address, + token_to_amount: cairo.uint256(minERC20AmountOut), // this is useless in avnu contract + token_to_min_amount: cairo.uint256(minERC20AmountOut), + beneficiary: userAddress, + integrator_fee_amount_bps: 0, + integrator_fee_recipient: 0, + routes: [ + { + token_from: Wrap.WERC20Contract.address, + token_to: Wrap.ERC20Contract.address, + exchange_address: Wrap.EkuboCoreContract.address, + percent: 100, + additional_swap_params: [ + sortedTokens[0].address, + sortedTokens[1].address, + Wrap.getFeeX128(fee), //fee for determin the pool_key + 1, // tick_spacing for determin the pool_key + 0, // extension for determin the pool_key + 363034526046013994104916607590000000000000000000001n //sqrt_ratio_limit + ], + } + ] + }; // swap const multiRouteSwap: Call = { contractAddress: aggregatorAddress, entrypoint: "multi_route_swap", - calldata: CallData.compile({ - token_from_address: Wrap.WERC20Contract.address, - token_from_amount: werc20AmountIn, - token_to_address: Wrap.ERC20Contract.address, - token_to_amount: minERC20AmountOut, // this is useless in avnu contract - token_to_min_amount: minERC20AmountOut, - beneficiary: userAddress, - integrator_fee_amount_bps: 0, - integrator_fee_recipient: 0, - routes: [ - { - token_from: Wrap.WERC20Contract.address, - token_to: Wrap.ERC20Contract.address, - exchange_address: Wrap.EkuboCoreContract.address, - percent: 100, - additional_swap_params: [ - sortedTokens[0].address, - sortedTokens[1].address, - Wrap.getFeeX128(fee), //fee for determin the pool_key - 1, // tick_spacing for determin the pool_key - 0, // extension for determin the pool_key - sqrtRatioLimitX128 //sqrt_ratio_limit - ], - } - ] - }) + calldata: CallData.compile(tmp) } - return [approveForAll, depositToWERC20, approveWERC20,multiRouteSwap]; + return [approveForAll, depositToWERC20, approveWERC20, multiRouteSwap]; } From f0903d4a436e8fc2dc25cd73ac867b9be878fc37 Mon Sep 17 00:00:00 2001 From: felix Date: Wed, 4 Oct 2023 18:28:13 +0800 Subject: [PATCH 24/42] feat: can swap --- .../interface/src/components/ButtonClick.tsx | 9 ++- sdk/packages/instaswap-core/src/wrap.ts | 67 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 1922958..375c9d2 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -23,6 +23,7 @@ const ButtonClick = () => { const ekubo_position_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) const avnu_address = useMemo(() => "0x07e36202ace0ab52bf438bd8a8b64b3731c48d09f0d8879f5b006384c2f35032", []) + const simple_swapper = useMemo(() => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", []) const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); let wrap = new Wrap( @@ -66,6 +67,12 @@ const ButtonClick = () => { account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 1313331313, avnu_address, account.address, FeeAmount.MEDIUM, 0.99, currentPrice)) }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) + const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(() => { + if (!account) return; + const realERC1155Amount = erc1155AmountForSwap; + account?.execute(wrap.swapFromERC1155ToERC20BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.MEDIUM, 0.99, currentPrice)) + }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) + const mayInitializePool = useCallback(() => { let initialize_tick = { mag: 0n, @@ -141,7 +148,7 @@ const ButtonClick = () => { setERC1155AmountForSwap(parseFloat(e.target.value))} />
- +
diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index d3d76c8..14fc17c 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -223,6 +223,73 @@ export class Wrap { } + public swapFromERC1155ToERC20BySimpleSwapper(erc1155AmountIn: BigNumberish, minERC20AmountOut: BigNumberish, simpleSwapperAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { + debugger; + // sort tokens + // TODO check length + const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + if (slippage < 0 || slippage > 1) { + throw new Error("slippage should be between 0 and 1"); + } + const werc20AmountIn = BigInt(erc1155AmountIn.toString()) * BigInt(10 ** 18); + Decimal.set({ precision: 78 }); + let sqrtRatioLimitX128 = (Wrap.ERC20Contract.address < Wrap.WERC20Contract.address) ? new Decimal(currentPrice / 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0) : new Decimal(currentPrice * 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); + + const approveForAll: Call = { + contractAddress: Wrap.ERC1155Contract.address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Contract.address, + approved: num.toCairoBool(true) + }) + } + // wrap token + const depositToWERC20: Call = { + contractAddress: Wrap.WERC20Contract.address, + entrypoint: "deposit", + calldata: CallData.compile({ + amount: cairo.uint256(erc1155AmountIn) + }) + } + // transfer werc20 + const transferWERC20: Call = { + contractAddress: Wrap.WERC20Contract.address, + entrypoint: "transfer", + calldata: CallData.compile({ + recipient: simpleSwapperAddress, + amount: cairo.uint256(BigInt(erc1155AmountIn) * (BigInt(10 ** 18))) // wrap token has 18 decimals + }) + } + let tmp = { + pool_key: { + token0: sortedTokens[0].address, + token1: sortedTokens[1].address, + fee: Wrap.getFeeX128(fee), + tick_spacing: 1, + extension: 0, + }, + swap_params: { + amount: { + mag: werc20AmountIn / 1000000n, // why 1000000n? + sign: false + }, + is_token1: true, + sqrt_ratio_limit: cairo.uint256(8507059173023461586584365185794205286400000n), + skip_ahead: 0, + }, + recipient: userAddress, + calculated_amount_threshold: 12000, + }; + // swap + const simpleSwap: Call = { + contractAddress: simpleSwapperAddress, + entrypoint: "swap", + calldata: CallData.compile(tmp) + } + return [simpleSwap]; + + } + public mayInitializePool(fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { // sort tokens // TODO check length From a3c6085f43cdd3e6f534548f032086d22f2a5081 Mon Sep 17 00:00:00 2001 From: felix Date: Thu, 5 Oct 2023 15:58:31 +0800 Subject: [PATCH 25/42] chore --- sdk/packages/instaswap-core/src/wrap.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 14fc17c..239ce4e 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -286,7 +286,7 @@ export class Wrap { entrypoint: "swap", calldata: CallData.compile(tmp) } - return [simpleSwap]; + return [approveForAll, depositToWERC20, transferWERC20, simpleSwap]; } From 608193814789941050157fa7e8175c5f4471bc9e Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 6 Oct 2023 15:00:45 +0800 Subject: [PATCH 26/42] feat: swap success --- .../interface/src/components/ButtonClick.tsx | 8 +- sdk/packages/instaswap-core/src/wrap.ts | 86 ++++++++++++------- 2 files changed, 61 insertions(+), 33 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 375c9d2..0673a55 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -58,19 +58,19 @@ const ButtonClick = () => { if (!account) return; const realERC1155Amount = erc1155Amount; const realERC20Amount = ethAmount * (10 **18); - account?.execute(wrap.addLiquidity(realERC1155Amount, realERC20Amount, FeeAmount.MEDIUM, lowerBound, upperBound)) + account?.execute(wrap.addLiquidity(realERC1155Amount, realERC20Amount, FeeAmount.LOWEST, lowerBound, upperBound)) }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) const handleSwapFromERC1155ToERC20ByAVNU = useCallback(() => { if (!account) return; const realERC1155Amount = erc1155AmountForSwap; - account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 1313331313, avnu_address, account.address, FeeAmount.MEDIUM, 0.99, currentPrice)) + account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 1313331313, avnu_address, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(() => { if (!account) return; const realERC1155Amount = erc1155AmountForSwap; - account?.execute(wrap.swapFromERC1155ToERC20BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.MEDIUM, 0.99, currentPrice)) + account?.execute(wrap.swapFromERC1155ToERC20BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) const mayInitializePool = useCallback(() => { @@ -78,7 +78,7 @@ const ButtonClick = () => { mag: 0n, sign: false } - account?.execute(wrap.mayInitializePool(FeeAmount.MEDIUM, initialize_tick)) + account?.execute(wrap.mayInitializePool(FeeAmount.LOWEST, initialize_tick)) }, [account, lowerBound, upperBound]) const mintERC1155Token = useCallback(async () => { diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 239ce4e..b97934c 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -9,6 +9,8 @@ import { FeeAmount } from './constants'; import { TickMath } from './tickMath'; import { Decimal } from 'decimal.js-light'; +const MAX_SQRT_RATIO = 6277100250585753475930931601400621808602321654880405518632n; +const MIN_SQRT_RATIO = 18446748437148339061n; export class Wrap { public static ERC1155Contract: Contract; @@ -17,6 +19,8 @@ export class Wrap { public static EkuboPosition: Contract; public static EkuboCoreContract: Contract; + + constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboPositionAddress: string, EkuboCoreAddress: string, provider: Provider) { Wrap.ERC1155Contract = new Contract(ERC1155, ERC1155Address, provider); Wrap.WERC20Contract = new Contract(WERC20, WERC20Address, provider); @@ -32,6 +36,15 @@ export class Wrap { // public withdraw = async (amount: bigint) => { // // // } + public static closestTick(tick: number): bigint { + let t = 200n; + let tick2 = BigInt(tick); + let closestTick = tick2 - (tick2 % t); + return closestTick; + + + + } public addLiquidity(erc1155Amount: BigNumberish, erc20Amount: BigNumberish, fee: FeeAmount, lowerPrice: number, upperPrice: number): Call[] { @@ -88,31 +101,32 @@ export class Wrap { let signLowerTick = lowerTick < 0 ? true : false; let absUpperTick = Math.abs(upperTick); let signUpperTick = upperTick < 0 ? true : false; - + let tick = 50000000n; + let tmp = { + pool_key: { + token0: sortedTokens[0].address, + token1: sortedTokens[1].address, + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + bounds: { + lower: { + mag: tick, + sign: signLowerTick, + }, + upper: { + mag: tick, + sign: signUpperTick, + } + }, + min_liquidity: 2000, + }; // mint_and_deposit const mintAndDeposit: Call = { contractAddress: Wrap.EkuboPosition.address, entrypoint: "mint_and_deposit", - calldata: CallData.compile({ - pool_key: { - token0: sortedTokens[0].address, - token1: sortedTokens[1].address, - fee: Wrap.getFeeX128(fee), - tick_spacing: 1, - extension: 0, - }, - bounds: { - lower: { - mag: absLowerTick, - sign: signLowerTick, - }, - upper: { - mag: absUpperTick, - sign: signUpperTick, - } - }, - min_liquidity: 12, - }) + calldata: CallData.compile(tmp) } // clear werc20 const clearWERC20: Call = { @@ -206,7 +220,7 @@ export class Wrap { sortedTokens[0].address, sortedTokens[1].address, Wrap.getFeeX128(fee), //fee for determin the pool_key - 1, // tick_spacing for determin the pool_key + 200, // tick_spacing for determin the pool_key 0, // extension for determin the pool_key 363034526046013994104916607590000000000000000000001n //sqrt_ratio_limit ], @@ -265,20 +279,20 @@ export class Wrap { token0: sortedTokens[0].address, token1: sortedTokens[1].address, fee: Wrap.getFeeX128(fee), - tick_spacing: 1, + tick_spacing: 200, extension: 0, }, swap_params: { amount: { - mag: werc20AmountIn / 1000000n, // why 1000000n? + mag: werc20AmountIn, sign: false }, is_token1: true, - sqrt_ratio_limit: cairo.uint256(8507059173023461586584365185794205286400000n), - skip_ahead: 0, + sqrt_ratio_limit: cairo.uint256(MAX_SQRT_RATIO), + skip_ahead: 4294967295, }, recipient: userAddress, - calculated_amount_threshold: 12000, + calculated_amount_threshold: 12000000, }; // swap const simpleSwap: Call = { @@ -286,7 +300,21 @@ export class Wrap { entrypoint: "swap", calldata: CallData.compile(tmp) } - return [approveForAll, depositToWERC20, transferWERC20, simpleSwap]; + const clearToken0: Call = { + contractAddress: simpleSwapperAddress, + entrypoint: "clear", + calldata: CallData.compile({ + token: sortedTokens[0].address + }) + } + const clearToken1: Call = { + contractAddress: simpleSwapperAddress, + entrypoint: "clear", + calldata: CallData.compile({ + token: sortedTokens[1].address + }) + } + return [approveForAll, depositToWERC20, transferWERC20, simpleSwap, clearToken0, clearToken1]; } @@ -303,7 +331,7 @@ export class Wrap { token0: sortedTokens[0].address, token1: sortedTokens[1].address, fee: Wrap.getFeeX128(fee), - tick_spacing: 1n, + tick_spacing: 200, extension: 0, }, initial_tick From 6b18424f9b152fa1f98f47e8736d907c33d27ac9 Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 6 Oct 2023 15:30:13 +0800 Subject: [PATCH 27/42] feat: swap success from erc20 --- .../interface/src/components/ButtonClick.tsx | 18 +++++ sdk/packages/instaswap-core/src/wrap.ts | 70 +++++++++++++++++-- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 0673a55..5adf71c 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -16,6 +16,7 @@ const ButtonClick = () => { const [erc1155Amount, setAddLiquidityERC1155Amount] = useState(0); const [ethAmount, setAddLiquidityEthAmount] = useState(0); const [erc1155AmountForSwap, setERC1155AmountForSwap] = useState(0); + const [erc20AmountForSwap, setERC20AmountForSwap] = useState(0); const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) @@ -73,6 +74,13 @@ const ButtonClick = () => { account?.execute(wrap.swapFromERC1155ToERC20BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) + const handleSwapFromERC20ToERC1155BySimpleSwap = useCallback(() => { + if (!account) return; + debugger; + const realERC1155Amount = erc20AmountForSwap * (10 **18); + account?.execute(wrap.swapFromERC20ToERC1155BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) + }, [account, erc20AmountForSwap, currentPrice, avnu_address]) + const mayInitializePool = useCallback(() => { let initialize_tick = { mag: 0n, @@ -150,6 +158,16 @@ const ButtonClick = () => {
+
+

Swap From ERC20 to ERC1155

+
+
+ + setERC20AmountForSwap(parseFloat(e.target.value))} /> +
+
+ +
) diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index b97934c..f9fd5fe 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -238,7 +238,6 @@ export class Wrap { } public swapFromERC1155ToERC20BySimpleSwapper(erc1155AmountIn: BigNumberish, minERC20AmountOut: BigNumberish, simpleSwapperAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { - debugger; // sort tokens // TODO check length const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); @@ -274,6 +273,8 @@ export class Wrap { amount: cairo.uint256(BigInt(erc1155AmountIn) * (BigInt(10 ** 18))) // wrap token has 18 decimals }) } + let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? true : false; + let sqrt_ratio_limit = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; let tmp = { pool_key: { token0: sortedTokens[0].address, @@ -287,12 +288,12 @@ export class Wrap { mag: werc20AmountIn, sign: false }, - is_token1: true, - sqrt_ratio_limit: cairo.uint256(MAX_SQRT_RATIO), + is_token1: isToken1, + sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), skip_ahead: 4294967295, }, recipient: userAddress, - calculated_amount_threshold: 12000000, + calculated_amount_threshold: 0, }; // swap const simpleSwap: Call = { @@ -315,7 +316,68 @@ export class Wrap { }) } return [approveForAll, depositToWERC20, transferWERC20, simpleSwap, clearToken0, clearToken1]; + } + public swapFromERC20ToERC1155BySimpleSwapper(erc20AmountIn: BigNumberish, minERC1155AmountOut: BigNumberish, simpleSwapperAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { + // sort tokens + // TODO check length + const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + if (slippage < 0 || slippage > 1) { + throw new Error("slippage should be between 0 and 1"); + } + + // transfer werc20 + const transferERC20: Call = { + contractAddress: Wrap.ERC20Contract.address, + entrypoint: "transfer", + calldata: CallData.compile({ + recipient: simpleSwapperAddress, + amount: cairo.uint256(erc20AmountIn) + }) + } + let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? true : false; + let sqrt_ratio_limit = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; + let tmp = { + pool_key: { + token0: sortedTokens[0].address, + token1: sortedTokens[1].address, + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + swap_params: { + amount: { + mag: erc20AmountIn, + sign: false + }, + is_token1: isToken1, + sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), + skip_ahead: 4294967295, + }, + recipient: userAddress, + calculated_amount_threshold: 0, + }; + // swap + const simpleSwap: Call = { + contractAddress: simpleSwapperAddress, + entrypoint: "swap", + calldata: CallData.compile(tmp) + } + const clearToken0: Call = { + contractAddress: simpleSwapperAddress, + entrypoint: "clear", + calldata: CallData.compile({ + token: sortedTokens[0].address + }) + } + const clearToken1: Call = { + contractAddress: simpleSwapperAddress, + entrypoint: "clear", + calldata: CallData.compile({ + token: sortedTokens[1].address + }) + } + return [transferERC20, simpleSwap, clearToken0, clearToken1]; } public mayInitializePool(fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { From c30f410637e8093200d4ae05ea20f8c6add56762 Mon Sep 17 00:00:00 2001 From: felix Date: Fri, 6 Oct 2023 16:21:53 +0800 Subject: [PATCH 28/42] bug: fix sqrt_ratio_limit --- sdk/packages/instaswap-core/src/wrap.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index f9fd5fe..bb98562 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -273,8 +273,8 @@ export class Wrap { amount: cairo.uint256(BigInt(erc1155AmountIn) * (BigInt(10 ** 18))) // wrap token has 18 decimals }) } - let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? true : false; - let sqrt_ratio_limit = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; + let isToken1 = !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? true : false; + let sqrt_ratio_limit = !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; let tmp = { pool_key: { token0: sortedTokens[0].address, From 71071b2a98d48fae87e0c0e54a18fa4cf104a86a Mon Sep 17 00:00:00 2001 From: huyao Date: Tue, 10 Oct 2023 14:46:07 +0800 Subject: [PATCH 29/42] sdk-refactor refactor wrap.ts code. Move duplicate code to standalone function. --- examples/interface/.eslintrc.json | 5 +- examples/interface/.gitignore | 1 + examples/interface/package.json | 2 +- .../interface/src/components/ButtonClick.tsx | 110 +++- sdk/bun.lockb | Bin 133918 -> 134301 bytes sdk/packages/instaswap-core/src/constants.ts | 28 +- sdk/packages/instaswap-core/src/tickMath.ts | 2 +- sdk/packages/instaswap-core/src/wrap.ts | 619 +++++++++--------- 8 files changed, 411 insertions(+), 356 deletions(-) diff --git a/examples/interface/.eslintrc.json b/examples/interface/.eslintrc.json index 7b49ed5..9b8544e 100644 --- a/examples/interface/.eslintrc.json +++ b/examples/interface/.eslintrc.json @@ -13,5 +13,8 @@ }, "plugins": ["react", "@typescript-eslint"], "root": true, - "rules": {} + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["off"] + } } diff --git a/examples/interface/.gitignore b/examples/interface/.gitignore index a547bf3..289e710 100644 --- a/examples/interface/.gitignore +++ b/examples/interface/.gitignore @@ -10,6 +10,7 @@ lerna-debug.log* node_modules dist dist-ssr +.vite *.local # Editor directories and files diff --git a/examples/interface/package.json b/examples/interface/package.json index 3963dee..863c0ff 100644 --- a/examples/interface/package.json +++ b/examples/interface/package.json @@ -12,7 +12,7 @@ "@starknet-react/core": "^1.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "@bibliothecadao/instaswap-core": "link:instaswap/packages/instaswap-core" + "@bibliothecadao/instaswap-core": "link:@bibliothecadao/instaswap-core" }, "devDependencies": { "@types/react": "^18.0.27", diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 5adf71c..907ccd4 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -2,7 +2,7 @@ import { useAccount, useConnectors } from '@starknet-react/core' import { useCallback, useMemo, useState, useEffect } from 'react' import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' import { Wrap } from '@bibliothecadao/instaswap-core' -import { FeeAmount } from '@bibliothecadao/instaswap-core' +import { FeeAmount,SwapDirection } from '@bibliothecadao/instaswap-core' import { Provider, constants, cairo } from "starknet" @@ -27,17 +27,22 @@ const ButtonClick = () => { const simple_swapper = useMemo(() => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", []) const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); - let wrap = new Wrap( - erc1155_address, - werc20_address, - eth_address, - ekubo_position_address, - ekubo_core_address, - provider - ) + + const config = { + erc1155Address: erc1155_address, + werc20Address:werc20_address, + erc20Address:eth_address, + ekuboPositionAddress:ekubo_position_address, + ekuboCoreAddress:ekubo_core_address, + provider:provider + } + + + const wrap = new Wrap(config); + const getERC1155Balance = useCallback(async () => { if (!address) return; - let b = await Wrap.getERC1155Balance(address, 1); + const b = await Wrap.getERC1155Balance(address, 1); setBalance(b.toString()); }, [address, erc1155_address]); @@ -56,33 +61,78 @@ const ButtonClick = () => { }, [getERC1155Balance]); const handleAddLiquidity = useCallback(() => { - if (!account) return; - const realERC1155Amount = erc1155Amount; - const realERC20Amount = ethAmount * (10 **18); - account?.execute(wrap.addLiquidity(realERC1155Amount, realERC20Amount, FeeAmount.LOWEST, lowerBound, upperBound)) + + if (!account) return; + + const params = { + erc1155Amount: erc1155Amount, + erc20Amount: ethAmount * (10 **18), + fee: FeeAmount.LOWEST, + lowerPrice: lowerBound, + upperPrice:upperBound, + }; + + //add liquidity + account?.execute(wrap.addLiquidity(params)); + + // const realERC1155Amount = erc1155Amount; + // const realERC20Amount = ethAmount * (10 **18); + // account?.execute(wrap.addLiquidity(realERC1155Amount, realERC20Amount, FeeAmount.LOWEST, lowerBound, upperBound)) }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) const handleSwapFromERC1155ToERC20ByAVNU = useCallback(() => { if (!account) return; - const realERC1155Amount = erc1155AmountForSwap; - account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 1313331313, avnu_address, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) + + const params = { + erc1155AmountIn: erc1155AmountForSwap, + minERC20AmountOut: 1313331313, + aggregatorAddress: avnu_address, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + currentPrice: currentPrice, + } + + account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(params)); + // + // const realERC1155Amount = erc1155AmountForSwap; + // account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 1313331313, avnu_address, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(() => { if (!account) return; - const realERC1155Amount = erc1155AmountForSwap; - account?.execute(wrap.swapFromERC1155ToERC20BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) + + const params = { + amountIn: erc1155AmountForSwap, + minERC20AmountOut: 1313331313, + simpleSwapperAddress: simple_swapper, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + } + account?.execute(wrap.swapBySimple(SwapDirection.ERC1155_TO_ERC20,params)) + // const realERC1155Amount = erc1155AmountForSwap; + // account?.execute(wrap.swapFromERC1155ToERC20BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) const handleSwapFromERC20ToERC1155BySimpleSwap = useCallback(() => { if (!account) return; - debugger; - const realERC1155Amount = erc20AmountForSwap * (10 **18); - account?.execute(wrap.swapFromERC20ToERC1155BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) + // debugger; + const params = { + amountIn: erc20AmountForSwap * (10 **18), + minERC20AmountOut: 1313331313, + simpleSwapperAddress: simple_swapper, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + } + account?.execute(wrap.swapBySimple(SwapDirection.ERC20_TO_ERC1155,params)); + // const realERC1155Amount = erc20AmountForSwap * (10 **18); + // account?.execute(wrap.swapFromERC20ToERC1155BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) }, [account, erc20AmountForSwap, currentPrice, avnu_address]) const mayInitializePool = useCallback(() => { - let initialize_tick = { + const initialize_tick = { mag: 0n, sign: false } @@ -148,8 +198,20 @@ const ButtonClick = () => {
+ + {/*
*/} + {/*

Swap From ERC1155 to ERC20 By AVNU

*/} + {/*
*/} + {/*
*/} + {/* */} + {/* setERC1155AmountForSwap(parseFloat(e.target.value))} />*/} + {/*
*/} + {/*
*/} + {/* */} + {/*
*/} +
-

Swap From ERC1155 to ERC20

+

Swap From ERC1155 to ERC20 By SimpleSwapper

@@ -159,7 +221,7 @@ const ButtonClick = () => {
-

Swap From ERC20 to ERC1155

+

Swap From ERC20 to ERC1155 By SimpleSwapper

-

Current Price : {currentPrice}

+

Current Price : 1 ETH = {currentPrice} WERC20

Mint ERC1155

diff --git a/sdk/packages/instaswap-core/src/abi/quoter-abi.json b/sdk/packages/instaswap-core/src/abi/quoter-abi.json new file mode 100644 index 0000000..2ee4036 --- /dev/null +++ b/sdk/packages/instaswap-core/src/abi/quoter-abi.json @@ -0,0 +1,274 @@ +[ + { + "type": "impl", + "name": "QuoterLockerImpl", + "interface_name": "ekubo::interfaces::core::ILocker" + }, + { + "type": "interface", + "name": "ekubo::interfaces::core::ILocker", + "items": [ + { + "type": "function", + "name": "locked", + "inputs": [ + { + "name": "id", + "type": "core::integer::u32" + }, + { + "name": "data", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::array::Array::" + } + ], + "state_mutability": "external" + } + ] + }, + { + "type": "impl", + "name": "QuoterImpl", + "interface_name": "ekubo::quoter::IQuoter" + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "ekubo::types::i129::i129", + "members": [ + { + "name": "mag", + "type": "core::integer::u128" + }, + { + "name": "sign", + "type": "core::bool" + } + ] + }, + { + "type": "struct", + "name": "ekubo::types::keys::PoolKey", + "members": [ + { + "name": "token0", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token1", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "fee", + "type": "core::integer::u128" + }, + { + "name": "tick_spacing", + "type": "core::integer::u128" + }, + { + "name": "extension", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::Route", + "members": [ + { + "name": "pool_keys", + "type": "core::array::Span::" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::QuoteParameters", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "specified_token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "route", + "type": "ekubo::quoter::Route" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::QuoteResult", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "other_token", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::QuoteSingleParameters", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "specified_token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ] + }, + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "type": "struct", + "name": "ekubo::types::delta::Delta", + "members": [ + { + "name": "amount0", + "type": "ekubo::types::i129::i129" + }, + { + "name": "amount1", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "type": "interface", + "name": "ekubo::quoter::IQuoter", + "items": [ + { + "type": "function", + "name": "quote", + "inputs": [ + { + "name": "params", + "type": "ekubo::quoter::QuoteParameters" + } + ], + "outputs": [ + { + "type": "ekubo::quoter::QuoteResult" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "quote_single", + "inputs": [ + { + "name": "params", + "type": "ekubo::quoter::QuoteSingleParameters" + } + ], + "outputs": [ + { + "type": "ekubo::quoter::QuoteResult" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "delta_to_sqrt_ratio", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "sqrt_ratio", + "type": "core::integer::u256" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "struct", + "name": "ekubo::interfaces::core::ICoreDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "core", + "type": "ekubo::interfaces::core::ICoreDispatcher" + } + ] + }, + { + "type": "event", + "name": "ekubo::quoter::Quoter::Event", + "kind": "enum", + "variants": [] + } + ] \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/tickMath.ts b/sdk/packages/instaswap-core/src/tickMath.ts index 003b292..198aa40 100644 --- a/sdk/packages/instaswap-core/src/tickMath.ts +++ b/sdk/packages/instaswap-core/src/tickMath.ts @@ -1,53 +1,45 @@ import { Decimal } from 'decimal.js-light'; -import JSBI from 'jsbi'; - - -export abstract class TickMath { - - /** - * Cannot be constructed. - */ - private constructor() { } - - public static getTickAtSqrtRatio(sqrt_ratio_x128: bigint): number { - // A fixed point .128 number has at most 128 bits after the decimal, - // which translates to about 10**38.5 in decimal. - // That means ~78 decimals of precision should be able to represent - // any price with full precision. - // Note there can be loss of precision for intermediate calculations, - // but this should be sufficient for just computing the price. - Decimal.set({ precision: 78 }); - - const sqrt_ratio = new Decimal(sqrt_ratio_x128.toString()).div(new Decimal(2).pow(128)); - const tick = sqrt_ratio - .div(new Decimal('1.000001').sqrt()) - .log() - .div(new Decimal('2').log()) - .toFixed(0); - return Number(tick); - - } - - public static getSqrtRatioAtTick(tick: number): bigint { - // A fixed point .128 number has at most 128 bits after the decimal, - // which translates to about 10**38.5 in decimal. - // That means ~78 decimals of precision should be able to represent - // any price with full precision. - // Note there can be loss of precision for intermediate calculations, - // but this should be sufficient for just computing the price. - Decimal.set({ precision: 78 }); - - const sqrt_ratio_x128 = - new Decimal('1.000001') - .sqrt() - .pow(tick) - .mul(new Decimal(2).pow(128)); - return BigInt(sqrt_ratio_x128.toFixed(0)); - } - - public static tryParseTick(): number | undefined { - // TODO - return undefined; - } + + + +export function getTickAtSqrtRatio(sqrt_ratio_x128: bigint): number { + // A fixed point .128 number has at most 128 bits after the decimal, + // which translates to about 10**38.5 in decimal. + // That means ~78 decimals of precision should be able to represent + // any price with full precision. + // Note there can be loss of precision for intermediate calculations, + // but this should be sufficient for just computing the price. + Decimal.set({ precision: 78 }); + + const sqrt_ratio = new Decimal(sqrt_ratio_x128.toString()).div(new Decimal(2).pow(128)); + const tick = sqrt_ratio + .div(new Decimal('1.000001').sqrt()) + .log() + .div(new Decimal('2').log()) + .toFixed(0); + return Number(tick); + +} + +export function getSqrtRatioAtTick(tick: number): bigint { + // A fixed point .128 number has at most 128 bits after the decimal, + // which translates to about 10**38.5 in decimal. + // That means ~78 decimals of precision should be able to represent + // any price with full precision. + // Note there can be loss of precision for intermediate calculations, + // but this should be sufficient for just computing the price. + Decimal.set({ precision: 78 }); + + const sqrt_ratio_x128 = + new Decimal('1.000001') + .sqrt() + .pow(tick) + .mul(new Decimal(2).pow(128)); + return BigInt(sqrt_ratio_x128.toFixed(0)); } + +export function tryParseTick(): number | undefined { + // TODO + return undefined; +} \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index bb98562..b740ebd 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -1,12 +1,13 @@ -import { Contract, uint256, CallData, RawArgs, Call, num, cairo, BigNumberish, Provider } from 'starknet' +import { Contract, uint256, CallData, RawArgs, Call, num, cairo, BigNumberish, Provider, Account, AccountInterface } from 'starknet' import ERC1155 from "./abi/erc1155-abi.json"; import WERC20 from "./abi/werc20-abi.json"; import ERC20 from "./abi/erc20-abi.json"; import EkuboPosition from "./abi/ekubo-position-abi.json"; +import Quoter from "./abi/quoter-abi.json"; import EkuboCore from "./abi/ekubo-core-abi.json"; import { FeeAmount } from './constants'; -import { TickMath } from './tickMath'; +import { getSqrtRatioAtTick, getTickAtSqrtRatio } from './tickMath'; import { Decimal } from 'decimal.js-light'; const MAX_SQRT_RATIO = 6277100250585753475930931601400621808602321654880405518632n; @@ -18,15 +19,17 @@ export class Wrap { public static ERC20Contract: Contract; public static EkuboPosition: Contract; public static EkuboCoreContract: Contract; + public static QuoterContract: Contract; - constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboPositionAddress: string, EkuboCoreAddress: string, provider: Provider) { + constructor(ERC1155Address: string, WERC20Address: string, ERC20Address: string, EkuboPositionAddress: string, EkuboCoreAddress: string, QuoterAddress: string, provider: Provider) { Wrap.ERC1155Contract = new Contract(ERC1155, ERC1155Address, provider); Wrap.WERC20Contract = new Contract(WERC20, WERC20Address, provider); Wrap.ERC20Contract = new Contract(ERC20, ERC20Address, provider); Wrap.EkuboPosition = new Contract(EkuboPosition, EkuboPositionAddress, provider); Wrap.EkuboCoreContract = new Contract(EkuboCore, EkuboCoreAddress, provider); + Wrap.QuoterContract = new Contract(Quoter, QuoterAddress, provider); } // public deposit = async (amount: bigint) => { @@ -92,8 +95,8 @@ export class Wrap { Decimal.set({ precision: 78 }); let lowerSqrtRatioX128 = new Decimal(lowerPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); let upperSqrtRatioX128 = new Decimal(upperPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); - const lowerTick = TickMath.getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); - const upperTick = TickMath.getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); + const lowerTick = getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); + const upperTick = getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); if (lowerTick > upperTick) { throw new Error("lowerTick should be less than upperTick"); } @@ -165,6 +168,41 @@ export class Wrap { } + public static quoteSingle = async (fee: FeeAmount, specified_token: string, amount: bigint, account: AccountInterface): Promise => { + this.QuoterContract.connect(account); + const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + let tmp = { + amount: { + mag: amount, + sign: false + }, + specified_token: specified_token, + pool_key: { + token0: sortedTokens[0].address, + token1: sortedTokens[1].address, + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + }; + try { + const res = await Wrap.QuoterContract.quote_single(tmp); + return res; + } catch (error: any) { + let inputString = error.toString(); + const substringToFind = "0x3f532df6e73f94d604f4eb8c661635595c91adc1d387931451eacd418cfbd14"; + const substringStartIndex = inputString.indexOf(substringToFind); + + if (substringStartIndex !== -1) { + const startIndex = substringStartIndex + substringToFind.length + 2; // Skip the substring and the following comma and whitespace + const endIndex = inputString.indexOf(",", startIndex); + const extractedString = inputString.substring(startIndex, endIndex).trim(); + return extractedString; + } + return 0; + } + } + public swapFromERC1155ToERC20ByAVNU(erc1155AmountIn: BigNumberish, minERC20AmountOut: BigNumberish, aggregatorAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { // sort tokens // TODO check length @@ -385,19 +423,20 @@ export class Wrap { // TODO check length const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + let tmp = { + pool_key: { + token0: sortedTokens[0].address, + token1: sortedTokens[1].address, + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + initial_tick + }; const mayInitializePool: Call = { contractAddress: Wrap.EkuboCoreContract.address, entrypoint: "maybe_initialize_pool", - calldata: CallData.compile({ - pool_key: { - token0: sortedTokens[0].address, - token1: sortedTokens[1].address, - fee: Wrap.getFeeX128(fee), - tick_spacing: 200, - extension: 0, - }, - initial_tick - }) + calldata: CallData.compile(tmp) } return [mayInitializePool]; } From 02e8447d4dfd5659c87ee55a83688a64c4af7198 Mon Sep 17 00:00:00 2001 From: huyao Date: Wed, 11 Oct 2023 18:13:38 +0800 Subject: [PATCH 31/42] more refactor 1. moved types to standalone file 2. passed account to wrap function as parameters 3. removed some useless code --- examples/interface/package.json | 2 +- .../interface/src/components/ButtonClick.tsx | 44 ++-- sdk/packages/instaswap-core/src/constants.ts | 5 +- sdk/packages/instaswap-core/src/tickMath.ts | 1 - sdk/packages/instaswap-core/src/types.ts | 40 ++++ sdk/packages/instaswap-core/src/wrap.ts | 221 ++++++++---------- 6 files changed, 165 insertions(+), 148 deletions(-) create mode 100644 sdk/packages/instaswap-core/src/types.ts diff --git a/examples/interface/package.json b/examples/interface/package.json index 863c0ff..e419172 100644 --- a/examples/interface/package.json +++ b/examples/interface/package.json @@ -12,7 +12,7 @@ "@starknet-react/core": "^1.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "@bibliothecadao/instaswap-core": "link:@bibliothecadao/instaswap-core" + "@bibliothecadao/instaswap-core": "link:/instaswap/packages/instaswap-core" }, "devDependencies": { "@types/react": "^18.0.27", diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 907ccd4..685677e 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -34,11 +34,12 @@ const ButtonClick = () => { erc20Address:eth_address, ekuboPositionAddress:ekubo_position_address, ekuboCoreAddress:ekubo_core_address, - provider:provider + provider:provider, + account:account } - const wrap = new Wrap(config); + const wrap = new Wrap(config); const getERC1155Balance = useCallback(async () => { if (!address) return; @@ -60,7 +61,7 @@ const ButtonClick = () => { return () => clearInterval(interval); }, [getERC1155Balance]); - const handleAddLiquidity = useCallback(() => { + const handleAddLiquidity = useCallback(async () => { if (!account) return; @@ -73,14 +74,12 @@ const ButtonClick = () => { }; //add liquidity - account?.execute(wrap.addLiquidity(params)); + const { transaction_hash } = await wrap.addLiquidity(params); + console.log(transaction_hash); - // const realERC1155Amount = erc1155Amount; - // const realERC20Amount = ethAmount * (10 **18); - // account?.execute(wrap.addLiquidity(realERC1155Amount, realERC20Amount, FeeAmount.LOWEST, lowerBound, upperBound)) }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) - const handleSwapFromERC1155ToERC20ByAVNU = useCallback(() => { + const handleSwapFromERC1155ToERC20ByAVNU = useCallback(async () => { if (!account) return; const params = { @@ -92,14 +91,11 @@ const ButtonClick = () => { slippage: 0.99, currentPrice: currentPrice, } - - account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(params)); - // - // const realERC1155Amount = erc1155AmountForSwap; - // account?.execute(wrap.swapFromERC1155ToERC20ByAVNU(realERC1155Amount, 1313331313, avnu_address, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) + const { transaction_hash } = await wrap.swapFromERC1155ToERC20ByAVNU(params); + console.log(transaction_hash); }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) - const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(() => { + const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(async () => { if (!account) return; const params = { @@ -110,12 +106,12 @@ const ButtonClick = () => { fee: FeeAmount.LOWEST, slippage: 0.99, } - account?.execute(wrap.swapBySimple(SwapDirection.ERC1155_TO_ERC20,params)) - // const realERC1155Amount = erc1155AmountForSwap; - // account?.execute(wrap.swapFromERC1155ToERC20BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) + + const { transaction_hash } = await wrap.swapSimple(SwapDirection.ERC1155_TO_ERC20,params); + console.log(transaction_hash); }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) - const handleSwapFromERC20ToERC1155BySimpleSwap = useCallback(() => { + const handleSwapFromERC20ToERC1155BySimpleSwap = useCallback(async () => { if (!account) return; // debugger; const params = { @@ -126,17 +122,19 @@ const ButtonClick = () => { fee: FeeAmount.LOWEST, slippage: 0.99, } - account?.execute(wrap.swapBySimple(SwapDirection.ERC20_TO_ERC1155,params)); - // const realERC1155Amount = erc20AmountForSwap * (10 **18); - // account?.execute(wrap.swapFromERC20ToERC1155BySimpleSwapper(realERC1155Amount, 1313331313, simple_swapper, account.address, FeeAmount.LOWEST, 0.99, currentPrice)) + + const { transaction_hash } = await wrap.swapSimple(SwapDirection.ERC20_TO_ERC1155,params); + console.log(transaction_hash); }, [account, erc20AmountForSwap, currentPrice, avnu_address]) - const mayInitializePool = useCallback(() => { + const mayInitializePool = useCallback(async () => { const initialize_tick = { mag: 0n, sign: false } - account?.execute(wrap.mayInitializePool(FeeAmount.LOWEST, initialize_tick)) + + const { transaction_hash } = await wrap.mayInitializePool(FeeAmount.LOWEST, initialize_tick); + console.log(transaction_hash); }, [account, lowerBound, upperBound]) const mintERC1155Token = useCallback(async () => { diff --git a/sdk/packages/instaswap-core/src/constants.ts b/sdk/packages/instaswap-core/src/constants.ts index 4617717..c9916e4 100644 --- a/sdk/packages/instaswap-core/src/constants.ts +++ b/sdk/packages/instaswap-core/src/constants.ts @@ -1,5 +1,6 @@ -export const MAX_SQRT_RATIO = 6277100250585753475930931601400621808602321654880405518632n; -export const MIN_SQRT_RATIO = 18446748437148339061n; +export const MAX_SQRT_RATIO = 6277100250585753475930931601400621808602321654880405518632n; +export const MIN_SQRT_RATIO = 18446748437148339061n; +export const AVNU_SQRT_RATIO = 363034526046013994104916607590000000000000000000001n; /** * The default factory enabled fee amounts, denominated in hundredths of bips. diff --git a/sdk/packages/instaswap-core/src/tickMath.ts b/sdk/packages/instaswap-core/src/tickMath.ts index 4e6afaa..677b77f 100644 --- a/sdk/packages/instaswap-core/src/tickMath.ts +++ b/sdk/packages/instaswap-core/src/tickMath.ts @@ -1,5 +1,4 @@ import { Decimal } from 'decimal.js-light'; -// import JSBI from 'jsbi'; export abstract class TickMath { diff --git a/sdk/packages/instaswap-core/src/types.ts b/sdk/packages/instaswap-core/src/types.ts new file mode 100644 index 0000000..2233bc9 --- /dev/null +++ b/sdk/packages/instaswap-core/src/types.ts @@ -0,0 +1,40 @@ +import {AccountInterface, BigNumberish, Provider} from "starknet"; +import {FeeAmount} from "./constants"; + +export type Config = { + erc1155Address: string; + werc20Address:string; + erc20Address:string; + ekuboPositionAddress:string; + ekuboCoreAddress:string; + account:AccountInterface | undefined; + provider?:Provider; +}; + + +export type LiquidityParams = { + erc1155Amount: BigNumberish; + erc20Amount: BigNumberish; + fee: FeeAmount; + lowerPrice: number; + upperPrice: number; +} + + +export type AVNUSwapParams = SwapParams & { + erc1155AmountIn: BigNumberish; + aggregatorAddress: string; +} + +export type SimpleSwapParams = SwapParams & { + simpleSwapperAddress: string; + amountIn: BigNumberish; +} + + +type SwapParams = { + minERC20AmountOut: BigNumberish; + userAddress: string; + fee: FeeAmount; + slippage: number; +} \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 8680b72..9ade675 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -1,95 +1,64 @@ -import {BigNumberish, cairo, Call, CallData, constants, Contract, num, Provider} from 'starknet' - +import {BigNumberish, cairo, Call, CallData, constants, Contract, num, Provider,AccountInterface,InvokeFunctionResponse} from 'starknet'; import ERC1155 from "./abi/erc1155-abi.json"; -import WERC20 from "./abi/werc20-abi.json"; -import ERC20 from "./abi/erc20-abi.json"; -import EkuboPosition from "./abi/ekubo-position-abi.json"; -import EkuboCore from "./abi/ekubo-core-abi.json"; -import {FeeAmount, MAX_SQRT_RATIO, MIN_SQRT_RATIO, SwapDirection} from './constants'; +import {FeeAmount, MAX_SQRT_RATIO, MIN_SQRT_RATIO, SwapDirection,AVNU_SQRT_RATIO} from './constants'; import {TickMath} from './tickMath'; +import {Config,SimpleSwapParams,AVNUSwapParams,LiquidityParams} from './types'; import {Decimal} from 'decimal.js-light'; -type Config = { - erc1155Address: string; - werc20Address:string; - erc20Address:string; - ekuboPositionAddress:string; - ekuboCoreAddress:string; - provider?:Provider; -}; - - -type LiquidityParams = { - erc1155Amount: BigNumberish; - erc20Amount: BigNumberish; - fee: FeeAmount; - lowerPrice: number; - upperPrice: number; -} - - -type AVNUSwapParams = SwapParams & { - erc1155AmountIn: BigNumberish; - aggregatorAddress: string; -} - -type SimpleSwapParams = SwapParams & { - simpleSwapperAddress: string; - amountIn: BigNumberish; -} - - -type SwapParams = { - minERC20AmountOut: BigNumberish; - userAddress: string; - fee: FeeAmount; - slippage: number; -} +export class Wrap { + public static ERC1155Address: string; + public static WERC20Address: string; + public static ERC20Address: string; + public static EkuboPositionAddress: string; + public static EkuboCoreAddress: string; -export class Wrap { - public static ERC1155Contract: Contract; - public static WERC20Contract: Contract; - public static ERC20Contract: Contract; - public static EkuboPosition: Contract; - public static EkuboCoreContract: Contract; - public static SortedTokens:Contract[]; + + public static SortedTokens:string[]; public static ERC1155ApproveCall:Call; public static CancelERC1155ApproveCall:Call; + private static account:AccountInterface; + constructor(config:Config) { //default provider - const provider = config.provider ? config.provider : new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); + const provider = config.provider ? config.provider : new Provider({ sequencer: { network: constants.NetworkName.SN_MAIN } }); Wrap.ERC1155Contract = new Contract(ERC1155, config.erc1155Address, provider); - Wrap.WERC20Contract = new Contract(WERC20, config.werc20Address, provider); - Wrap.ERC20Contract = new Contract(ERC20, config.erc20Address, provider); - Wrap.EkuboPosition = new Contract(EkuboPosition, config.ekuboPositionAddress, provider); - Wrap.EkuboCoreContract = new Contract(EkuboCore, config.ekuboCoreAddress, provider); - Wrap.SortedTokens = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + + //addresses + Wrap.ERC1155Address = config.erc1155Address; + Wrap.WERC20Address = config.werc20Address; + Wrap.ERC20Address = config.erc20Address; + Wrap.EkuboPositionAddress = config.ekuboPositionAddress; + Wrap.EkuboCoreAddress = config.ekuboCoreAddress; + + + Wrap.SortedTokens = [Wrap.ERC20Address, Wrap.WERC20Address].sort((a, b) => a.localeCompare(b)); Wrap.ERC1155ApproveCall = { - contractAddress: Wrap.ERC1155Contract.address, + contractAddress: Wrap.ERC1155Address, entrypoint: "setApprovalForAll", calldata: CallData.compile({ - operator: Wrap.WERC20Contract.address, + operator: Wrap.WERC20Address, approved: num.toCairoBool(true) }) }; Wrap.CancelERC1155ApproveCall = { - contractAddress: Wrap.ERC1155Contract.address, + contractAddress: Wrap.ERC1155Address, entrypoint: "setApprovalForAll", calldata: CallData.compile({ - operator: Wrap.WERC20Contract.address, + operator: Wrap.WERC20Address, approved: num.toCairoBool(false) }) }; - - + if ( config.account ){ + Wrap.account = config.account; + } Decimal.set({ precision: 78 }); } @@ -128,7 +97,7 @@ export class Wrap { private static createWERC20ApproveCall(spender:string,amount:BigNumberish):Call{ return { - contractAddress: Wrap.WERC20Contract.address, + contractAddress: Wrap.WERC20Address, entrypoint: "approve", calldata: CallData.compile({ spender: spender, @@ -137,17 +106,23 @@ export class Wrap { } } + private static checkAccount(){ + if (!Wrap.account){ + throw new Error("slippage should be between 0 and 1"); + } + } + - public mayInitializePool(fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { + public mayInitializePool = (fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }):Promise => { const mayInitializePool: Call = { - contractAddress: Wrap.EkuboCoreContract.address, + contractAddress: Wrap.EkuboCoreAddress, entrypoint: "maybe_initialize_pool", calldata: CallData.compile({ pool_key: { - token0: Wrap.SortedTokens[0].address, - token1: Wrap.SortedTokens[1].address, + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], fee: Wrap.getFeeX128(fee), tick_spacing: 200, extension: 0, @@ -156,16 +131,19 @@ export class Wrap { }) } - return [mayInitializePool]; + return Wrap.account.execute([mayInitializePool]); } - public addLiquidity(params:LiquidityParams): Call[] { + + + public addLiquidity = async (params:LiquidityParams): Promise =>{ + + Wrap.checkAccount(); const lowerSqrtRatioX128 = new Decimal(params.lowerPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); const upperSqrtRatioX128 = new Decimal(params.upperPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); const lowerTick = TickMath.getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); const upperTick = TickMath.getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); - if (lowerTick > upperTick) { throw new Error("lowerTick should be less than upperTick"); } @@ -175,13 +153,13 @@ export class Wrap { * mint_and_deposit */ const mintAndDeposit: Call = { - contractAddress: Wrap.EkuboPosition.address, + contractAddress: Wrap.EkuboPositionAddress, entrypoint: "mint_and_deposit", calldata: CallData.compile( { pool_key: { - token0: Wrap.SortedTokens[0].address, - token1: Wrap.SortedTokens[1].address, + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], fee: Wrap.getFeeX128(params.fee), tick_spacing: 200, extension: 0, @@ -202,17 +180,17 @@ export class Wrap { } - return [ + return Wrap.account.execute([ Wrap.ERC1155ApproveCall, - Wrap.createDepositCall(Wrap.WERC20Contract.address,params.erc1155Amount), - Wrap.createTransferCall(Wrap.WERC20Contract.address,Wrap.EkuboPosition.address, + Wrap.createDepositCall(Wrap.WERC20Address,params.erc1155Amount), + Wrap.createTransferCall(Wrap.WERC20Address,Wrap.EkuboPositionAddress, BigInt(params.erc1155Amount) * (BigInt(10) ** BigInt(18))), - Wrap.createTransferCall(Wrap.ERC20Contract.address,Wrap.EkuboPosition.address,BigInt(params.erc20Amount)), + Wrap.createTransferCall(Wrap.ERC20Address,Wrap.EkuboPositionAddress,BigInt(params.erc20Amount)), mintAndDeposit, - Wrap.createClearCall(Wrap.EkuboPosition.address,Wrap.WERC20Contract.address), - Wrap.createClearCall(Wrap.EkuboPosition.address,Wrap.ERC20Contract.address), + Wrap.createClearCall(Wrap.EkuboPositionAddress,Wrap.WERC20Address), + Wrap.createClearCall(Wrap.EkuboPositionAddress,Wrap.ERC20Address), Wrap.CancelERC1155ApproveCall - ]; + ]); } public withdraw(id: number):Call[]{ @@ -220,15 +198,15 @@ export class Wrap { } - public swapBySimple(direction:SwapDirection,params:SimpleSwapParams){ + public swapSimple = async (direction:SwapDirection,params:SimpleSwapParams): Promise => { if (direction == SwapDirection.ERC1155_TO_ERC20){ - return this.swapFromERC1155ToERC20BySimpleSwapper(params); + return await this.swapFromERC1155ToERC20(params); } - return this.swapFromERC20ToERC1155BySimpleSwapper(params); + return await this.swapFromERC20ToERC1155(params); } - public swapFromERC1155ToERC20ByAVNU(params:AVNUSwapParams):Call[] { + public swapFromERC1155ToERC20ByAVNU = async (params:AVNUSwapParams): Promise => { if (params.slippage < 0 || params.slippage > 1) { throw new Error("slippage should be between 0 and 1"); @@ -244,9 +222,9 @@ export class Wrap { contractAddress: params.aggregatorAddress, entrypoint: "multi_route_swap", calldata: CallData.compile({ - token_from_address: Wrap.WERC20Contract.address, + token_from_address: Wrap.WERC20Address, token_from_amount: cairo.uint256(werc20AmountIn), - token_to_address: Wrap.ERC20Contract.address, + token_to_address: Wrap.ERC20Address, token_to_amount: cairo.uint256(params.minERC20AmountOut), // this is useless in avnu contract token_to_min_amount: cairo.uint256(params.minERC20AmountOut), beneficiary: params.userAddress, @@ -254,32 +232,32 @@ export class Wrap { integrator_fee_recipient: 0, routes: [ { - token_from: Wrap.WERC20Contract.address, - token_to: Wrap.ERC20Contract.address, - exchange_address: Wrap.EkuboCoreContract.address, + token_from: Wrap.WERC20Address, + token_to: Wrap.ERC20Address, + exchange_address: Wrap.EkuboCoreAddress, percent: 100, additional_swap_params: [ - Wrap.SortedTokens[0].address, - Wrap.SortedTokens[1].address, + Wrap.SortedTokens[0], + Wrap.SortedTokens[1], Wrap.getFeeX128(params.fee), //fee for determin the pool_key 200, // tick_spacing for determin the pool_key 0, // extension for determin the pool_key - 363034526046013994104916607590000000000000000000001n//sqrt_ratio_limit + AVNU_SQRT_RATIO//sqrt_ratio_limit ], } ] }) } - return [ + return Wrap.account.execute( [ Wrap.ERC1155ApproveCall, - Wrap.createDepositCall(Wrap.WERC20Contract.address,params.erc1155AmountIn), + Wrap.createDepositCall(Wrap.WERC20Address,params.erc1155AmountIn), Wrap.createWERC20ApproveCall(params.aggregatorAddress,werc20AmountIn), multiRouteSwap - ]; - + ]); } - public swapFromERC1155ToERC20BySimpleSwapper(params:SimpleSwapParams):Call[] { + + public swapFromERC1155ToERC20 = async (params:SimpleSwapParams): Promise => { if (params.slippage < 0 || params.slippage > 1) { throw new Error("slippage should be between 0 and 1"); @@ -288,7 +266,7 @@ export class Wrap { const werc20AmountIn = BigInt(params.amountIn.toString()) * BigInt(10 ** 18); - const sqrt_ratio_limit = !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; + const sqrt_ratio_limit = !(Wrap.ERC20Address > Wrap.WERC20Address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; // swap const simpleSwap: Call = { @@ -296,8 +274,8 @@ export class Wrap { entrypoint: "swap", calldata: CallData.compile({ pool_key: { - token0: Wrap.SortedTokens[0].address, - token1: Wrap.SortedTokens[1].address, + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], fee: Wrap.getFeeX128(params.fee), tick_spacing: 200, extension: 0, @@ -307,7 +285,7 @@ export class Wrap { mag: werc20AmountIn, sign: false }, - is_token1: !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address), + is_token1: !(Wrap.ERC20Address > Wrap.WERC20Address), sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), skip_ahead: 4294967295, }, @@ -316,32 +294,33 @@ export class Wrap { }) } - return [ - Wrap.ERC1155ApproveCall, - Wrap.createDepositCall(Wrap.WERC20Contract.address,params.amountIn), - Wrap.createTransferCall(Wrap.WERC20Contract.address,params.simpleSwapperAddress, - BigInt(params.amountIn) * (BigInt(10 ** 18))), - simpleSwap, - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0].address), - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1].address), - ]; + return Wrap.account.execute( [ + Wrap.ERC1155ApproveCall, + Wrap.createDepositCall(Wrap.WERC20Address,params.amountIn), + Wrap.createTransferCall(Wrap.WERC20Address,params.simpleSwapperAddress, + BigInt(params.amountIn) * (BigInt(10 ** 18))), + simpleSwap, + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0]), + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1]), + ]); } - public swapFromERC20ToERC1155BySimpleSwapper(params:SimpleSwapParams):Call[] { + + public swapFromERC20ToERC1155 = async (params:SimpleSwapParams): Promise=> { if (params.slippage < 0 || params.slippage > 1) { throw new Error("slippage should be between 0 and 1"); } // let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address); - const sqrt_ratio_limit = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; + const sqrt_ratio_limit = (Wrap.ERC20Address > Wrap.WERC20Address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; // swap const simpleSwap: Call = { contractAddress: params.simpleSwapperAddress, entrypoint: "swap", calldata: CallData.compile({ pool_key: { - token0: Wrap.SortedTokens[0].address, - token1: Wrap.SortedTokens[1].address, + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], fee: Wrap.getFeeX128(params.fee), tick_spacing: 200, extension: 0, @@ -351,7 +330,7 @@ export class Wrap { mag: params.amountIn, sign: false }, - is_token1: Wrap.ERC20Contract.address > Wrap.WERC20Contract.address, + is_token1: Wrap.ERC20Address > Wrap.WERC20Address, sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), skip_ahead: 4294967295, }, @@ -361,12 +340,12 @@ export class Wrap { }; - return [ - Wrap.createTransferCall(Wrap.ERC20Contract.address,params.simpleSwapperAddress,params.amountIn), - simpleSwap, - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0].address), - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1].address), - ]; + return Wrap.account.execute([ + Wrap.createTransferCall(Wrap.ERC20Address,params.simpleSwapperAddress,params.amountIn), + simpleSwap, + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0]), + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1]), + ]); } From 51d3c51ed28f6b4cf5e74d4b5c03c88511922dac Mon Sep 17 00:00:00 2001 From: huyao Date: Wed, 11 Oct 2023 18:17:53 +0800 Subject: [PATCH 32/42] remove useless code --- examples/interface/.eslintrc.json | 2 -- examples/interface/package.json | 2 +- .../interface/src/components/ButtonClick.tsx | 27 +++---------------- 3 files changed, 4 insertions(+), 27 deletions(-) diff --git a/examples/interface/.eslintrc.json b/examples/interface/.eslintrc.json index 9b8544e..1d20679 100644 --- a/examples/interface/.eslintrc.json +++ b/examples/interface/.eslintrc.json @@ -14,7 +14,5 @@ "plugins": ["react", "@typescript-eslint"], "root": true, "rules": { - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": ["off"] } } diff --git a/examples/interface/package.json b/examples/interface/package.json index e419172..3963dee 100644 --- a/examples/interface/package.json +++ b/examples/interface/package.json @@ -12,7 +12,7 @@ "@starknet-react/core": "^1.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "@bibliothecadao/instaswap-core": "link:/instaswap/packages/instaswap-core" + "@bibliothecadao/instaswap-core": "link:instaswap/packages/instaswap-core" }, "devDependencies": { "@types/react": "^18.0.27", diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 685677e..9acd4da 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -1,6 +1,6 @@ -import { useAccount, useConnectors } from '@starknet-react/core' +import { useAccount } from '@starknet-react/core' import { useCallback, useMemo, useState, useEffect } from 'react' -import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' +import { CallData, Call } from 'starknet' import { Wrap } from '@bibliothecadao/instaswap-core' import { FeeAmount,SwapDirection } from '@bibliothecadao/instaswap-core' import { Provider, constants, cairo } from "starknet" @@ -11,7 +11,7 @@ const ButtonClick = () => { const [upperBound, setUpperBound] = useState(0); const { address, account } = useAccount() const [balance, setBalance] = useState("0"); - const [currentPrice, setCurrentPrice] = useState(0); + const [currentPrice] = useState(0); const [mintAmount, setMintAmount] = useState(0); const [erc1155Amount, setAddLiquidityERC1155Amount] = useState(0); const [ethAmount, setAddLiquidityEthAmount] = useState(0); @@ -47,12 +47,6 @@ const ButtonClick = () => { setBalance(b.toString()); }, [address, erc1155_address]); - const getCurrentPrice = useCallback(async () => { - if (!address) return; - // let p = await Wrap.getCurrentPrice(); - // setCurrentPrice(p); - }, [address, erc1155_address]); - useEffect(() => { getERC1155Balance(); const interval = setInterval(() => { @@ -79,21 +73,6 @@ const ButtonClick = () => { }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) - const handleSwapFromERC1155ToERC20ByAVNU = useCallback(async () => { - if (!account) return; - - const params = { - erc1155AmountIn: erc1155AmountForSwap, - minERC20AmountOut: 1313331313, - aggregatorAddress: avnu_address, - userAddress: account.address, - fee: FeeAmount.LOWEST, - slippage: 0.99, - currentPrice: currentPrice, - } - const { transaction_hash } = await wrap.swapFromERC1155ToERC20ByAVNU(params); - console.log(transaction_hash); - }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(async () => { if (!account) return; From 1a4a55580e85fd7cb6febc92c52230c503f1b970 Mon Sep 17 00:00:00 2001 From: huyao Date: Thu, 12 Oct 2023 17:04:37 +0800 Subject: [PATCH 33/42] merge new functions and refactor --- examples/interface/.eslintrc.json | 2 + examples/interface/bun.lockb | Bin 137778 -> 137778 bytes .../interface/src/components/ButtonClick.tsx | 42 ++- .../instaswap-core/src/abi/quoter-abi.json | 274 ++++++++++++++++++ sdk/packages/instaswap-core/src/tickMath.ts | 84 +++--- sdk/packages/instaswap-core/src/types.ts | 1 + sdk/packages/instaswap-core/src/wrap.ts | 63 +++- 7 files changed, 407 insertions(+), 59 deletions(-) create mode 100644 sdk/packages/instaswap-core/src/abi/quoter-abi.json diff --git a/examples/interface/.eslintrc.json b/examples/interface/.eslintrc.json index 1d20679..9b8544e 100644 --- a/examples/interface/.eslintrc.json +++ b/examples/interface/.eslintrc.json @@ -14,5 +14,7 @@ "plugins": ["react", "@typescript-eslint"], "root": true, "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["off"] } } diff --git a/examples/interface/bun.lockb b/examples/interface/bun.lockb index 064671edec69221eeef69c95d718bef9b659d4c3..618a2ab4157220c85a1adc69054081e87668a4c8 100755 GIT binary patch delta 1024 zcmdnAg=5nejtv50lM^%)CKrfFZ1xa4!8AEgLw|C;80TgW$+~-!qcqfjG9r^jeuzvC z*U$v31gVB#;mHkRER(kYs2QY)<)_HxPz`OM zVZ2~|$WIM0A7L2GQ2ca(7$;c2$!~~x#ON;&V+HFu@`rdm2^x|RcmBiXaqMm^5Mu}H znerdq9$Aq1R1-#YaqQ+0<0oV_z%XTGnLJTk9~inkAe*L#Fe6!2FUC5339s@ z1c!tQHzRoojhKJ|g{%u7Qcy!Q$xgo@#K^)iBbI?d6qE-*ISOGM#9b}?7}^kt0h&ps eTL=IhkD2Wd3K6CfCk9NR?LfC}zaYev#0~%gB|7W? delta 4641 zcmdnAg=5nejtv50dTI=)UK(iTG3*85npN7#fmuGWD{GC$IY%)Um4fk6sr&M_b@2c$uI@rW4`s}Qbkx&k+&$n*uwj4abtxETdTS)*Yvnhu6o zUJwCgU5)yp)Z+Y{vQ&mWzKF&l9mVPg%3`R!(8eJheT?d1VB>rsgP);(fZ`n%3iaU1 ziJHL=Y3=6cnF1@li&2n@6;uIc6=M^t$0kTyF<=LeVMZ(igD9|OzF3dsLbxCu#h{&o z)Z%2ItCSNUjUylv7+iD_tEaogp!9J8=vzo9d%BYVqg?&*6b1%h#|YZ#26>->fsSJJ s17$JPUQiE(zCK3vaQ(mre}f@pu!V$BnC>aS=-hrmh;jP`A*LjD0I1gHCjbBd diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 9acd4da..5f51d30 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -1,6 +1,6 @@ -import { useAccount } from '@starknet-react/core' +import { useAccount, useConnectors } from '@starknet-react/core' import { useCallback, useMemo, useState, useEffect } from 'react' -import { CallData, Call } from 'starknet' +import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' import { Wrap } from '@bibliothecadao/instaswap-core' import { FeeAmount,SwapDirection } from '@bibliothecadao/instaswap-core' import { Provider, constants, cairo } from "starknet" @@ -11,7 +11,7 @@ const ButtonClick = () => { const [upperBound, setUpperBound] = useState(0); const { address, account } = useAccount() const [balance, setBalance] = useState("0"); - const [currentPrice] = useState(0); + const [currentPrice, setCurrentPrice] = useState(0); const [mintAmount, setMintAmount] = useState(0); const [erc1155Amount, setAddLiquidityERC1155Amount] = useState(0); const [ethAmount, setAddLiquidityEthAmount] = useState(0); @@ -25,6 +25,7 @@ const ButtonClick = () => { const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) const avnu_address = useMemo(() => "0x07e36202ace0ab52bf438bd8a8b64b3731c48d09f0d8879f5b006384c2f35032", []) const simple_swapper = useMemo(() => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", []) + const quoter = useMemo(() => "0x042aa743335663ed9c7b52b331ab7f81cc8d65280d311506653f9b5cc22be7cb", []) const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); @@ -34,6 +35,7 @@ const ButtonClick = () => { erc20Address:eth_address, ekuboPositionAddress:ekubo_position_address, ekuboCoreAddress:ekubo_core_address, + quoterAddress:quoter, provider:provider, account:account } @@ -47,6 +49,15 @@ const ButtonClick = () => { setBalance(b.toString()); }, [address, erc1155_address]); + + +const getCurrentPrice = useCallback(async () => { + if (!address) return; + const p = await wrap.quoteSingle(FeeAmount.LOWEST, eth_address, BigInt(10** 7)); + const realPrice = p / (10 ** 7); + setCurrentPrice(realPrice); +}, [address, erc1155_address, account]); + useEffect(() => { getERC1155Balance(); const interval = setInterval(() => { @@ -55,6 +66,14 @@ const ButtonClick = () => { return () => clearInterval(interval); }, [getERC1155Balance]); + useEffect(() => { + getCurrentPrice(); + const interval = setInterval(() => { + getCurrentPrice(); + }, 3000); + return () => clearInterval(interval); + }, [getCurrentPrice]); + const handleAddLiquidity = useCallback(async () => { if (!account) return; @@ -73,6 +92,21 @@ const ButtonClick = () => { }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) + const handleSwapFromERC1155ToERC20ByAVNU = useCallback(async () => { + if (!account) return; + + const params = { + erc1155AmountIn: erc1155AmountForSwap, + minERC20AmountOut: 1313331313, + aggregatorAddress: avnu_address, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + currentPrice: currentPrice, + } + const { transaction_hash } = await wrap.swapFromERC1155ToERC20ByAVNU(params); + console.log(transaction_hash); + }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(async () => { if (!account) return; @@ -141,7 +175,7 @@ const ButtonClick = () => {

ERC1155 Balance: {balance}

-

Current Price : {currentPrice}

+

Current Price : 1 ETH = {currentPrice} WERC20

Mint ERC1155

diff --git a/sdk/packages/instaswap-core/src/abi/quoter-abi.json b/sdk/packages/instaswap-core/src/abi/quoter-abi.json new file mode 100644 index 0000000..c7c5f69 --- /dev/null +++ b/sdk/packages/instaswap-core/src/abi/quoter-abi.json @@ -0,0 +1,274 @@ +[ + { + "type": "impl", + "name": "QuoterLockerImpl", + "interface_name": "ekubo::interfaces::core::ILocker" + }, + { + "type": "interface", + "name": "ekubo::interfaces::core::ILocker", + "items": [ + { + "type": "function", + "name": "locked", + "inputs": [ + { + "name": "id", + "type": "core::integer::u32" + }, + { + "name": "data", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::array::Array::" + } + ], + "state_mutability": "external" + } + ] + }, + { + "type": "impl", + "name": "QuoterImpl", + "interface_name": "ekubo::quoter::IQuoter" + }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "type": "struct", + "name": "ekubo::types::i129::i129", + "members": [ + { + "name": "mag", + "type": "core::integer::u128" + }, + { + "name": "sign", + "type": "core::bool" + } + ] + }, + { + "type": "struct", + "name": "ekubo::types::keys::PoolKey", + "members": [ + { + "name": "token0", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token1", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "fee", + "type": "core::integer::u128" + }, + { + "name": "tick_spacing", + "type": "core::integer::u128" + }, + { + "name": "extension", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [ + { + "name": "snapshot", + "type": "@core::array::Array::" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::Route", + "members": [ + { + "name": "pool_keys", + "type": "core::array::Span::" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::QuoteParameters", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "specified_token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "route", + "type": "ekubo::quoter::Route" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::QuoteResult", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "other_token", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "struct", + "name": "ekubo::quoter::QuoteSingleParameters", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "specified_token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ] + }, + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "type": "struct", + "name": "ekubo::types::delta::Delta", + "members": [ + { + "name": "amount0", + "type": "ekubo::types::i129::i129" + }, + { + "name": "amount1", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "type": "interface", + "name": "ekubo::quoter::IQuoter", + "items": [ + { + "type": "function", + "name": "quote", + "inputs": [ + { + "name": "params", + "type": "ekubo::quoter::QuoteParameters" + } + ], + "outputs": [ + { + "type": "ekubo::quoter::QuoteResult" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "quote_single", + "inputs": [ + { + "name": "params", + "type": "ekubo::quoter::QuoteSingleParameters" + } + ], + "outputs": [ + { + "type": "ekubo::quoter::QuoteResult" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "delta_to_sqrt_ratio", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "sqrt_ratio", + "type": "core::integer::u256" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "view" + } + ] + }, + { + "type": "struct", + "name": "ekubo::interfaces::core::ICoreDispatcher", + "members": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "core", + "type": "ekubo::interfaces::core::ICoreDispatcher" + } + ] + }, + { + "type": "event", + "name": "ekubo::quoter::Quoter::Event", + "kind": "enum", + "variants": [] + } +] \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/tickMath.ts b/sdk/packages/instaswap-core/src/tickMath.ts index 677b77f..97b43b3 100644 --- a/sdk/packages/instaswap-core/src/tickMath.ts +++ b/sdk/packages/instaswap-core/src/tickMath.ts @@ -1,52 +1,42 @@ import { Decimal } from 'decimal.js-light'; +export function getTickAtSqrtRatio(sqrt_ratio_x128: bigint): number { + // A fixed point .128 number has at most 128 bits after the decimal, + // which translates to about 10**38.5 in decimal. + // That means ~78 decimals of precision should be able to represent + // any price with full precision. + // Note there can be loss of precision for intermediate calculations, + // but this should be sufficient for just computing the price. + Decimal.set({ precision: 78 }); + + const sqrt_ratio = new Decimal(sqrt_ratio_x128.toString()).div(new Decimal(2).pow(128)); + const tick = sqrt_ratio + .div(new Decimal('1.000001').sqrt()) + .log() + .div(new Decimal('2').log()) + .toFixed(0); + return Number(tick); -export abstract class TickMath { - - /** - * Cannot be constructed. - */ - private constructor() { } - - public static getTickAtSqrtRatio(sqrt_ratio_x128: bigint): number { - // A fixed point .128 number has at most 128 bits after the decimal, - // which translates to about 10**38.5 in decimal. - // That means ~78 decimals of precision should be able to represent - // any price with full precision. - // Note there can be loss of precision for intermediate calculations, - // but this should be sufficient for just computing the price. - Decimal.set({ precision: 78 }); - - const sqrt_ratio = new Decimal(sqrt_ratio_x128.toString()).div(new Decimal(2).pow(128)); - const tick = sqrt_ratio - .div(new Decimal('1.000001').sqrt()) - .log() - .div(new Decimal('2').log()) - .toFixed(0); - return Number(tick); - - } - - public static getSqrtRatioAtTick(tick: number): bigint { - // A fixed point .128 number has at most 128 bits after the decimal, - // which translates to about 10**38.5 in decimal. - // That means ~78 decimals of precision should be able to represent - // any price with full precision. - // Note there can be loss of precision for intermediate calculations, - // but this should be sufficient for just computing the price. - Decimal.set({ precision: 78 }); - - const sqrt_ratio_x128 = - new Decimal('1.000001') - .sqrt() - .pow(tick) - .mul(new Decimal(2).pow(128)); - return BigInt(sqrt_ratio_x128.toFixed(0)); - } - - public static tryParseTick(): number | undefined { - // TODO - return undefined; - } +} +export function getSqrtRatioAtTick(tick: number): bigint { + // A fixed point .128 number has at most 128 bits after the decimal, + // which translates to about 10**38.5 in decimal. + // That means ~78 decimals of precision should be able to represent + // any price with full precision. + // Note there can be loss of precision for intermediate calculations, + // but this should be sufficient for just computing the price. + Decimal.set({ precision: 78 }); + + const sqrt_ratio_x128 = + new Decimal('1.000001') + .sqrt() + .pow(tick) + .mul(new Decimal(2).pow(128)); + return BigInt(sqrt_ratio_x128.toFixed(0)); } + +export function tryParseTick(): number | undefined { + // TODO + return undefined; +} \ No newline at end of file diff --git a/sdk/packages/instaswap-core/src/types.ts b/sdk/packages/instaswap-core/src/types.ts index 2233bc9..40054b0 100644 --- a/sdk/packages/instaswap-core/src/types.ts +++ b/sdk/packages/instaswap-core/src/types.ts @@ -7,6 +7,7 @@ export type Config = { erc20Address:string; ekuboPositionAddress:string; ekuboCoreAddress:string; + quoterAddress:string; account:AccountInterface | undefined; provider?:Provider; }; diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 9ade675..1ed9cd1 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -1,10 +1,21 @@ -import {BigNumberish, cairo, Call, CallData, constants, Contract, num, Provider,AccountInterface,InvokeFunctionResponse} from 'starknet'; +import { + AccountInterface, + BigNumberish, + cairo, + Call, + CallData, + constants, + Contract, + InvokeFunctionResponse, + num, + Provider +} from 'starknet'; import ERC1155 from "./abi/erc1155-abi.json"; -import {FeeAmount, MAX_SQRT_RATIO, MIN_SQRT_RATIO, SwapDirection,AVNU_SQRT_RATIO} from './constants'; -import {TickMath} from './tickMath'; -import {Config,SimpleSwapParams,AVNUSwapParams,LiquidityParams} from './types'; +import Quoter from "./abi/quoter-abi.json"; +import {AVNU_SQRT_RATIO, FeeAmount, MAX_SQRT_RATIO, MIN_SQRT_RATIO, SwapDirection} from './constants'; +import {AVNUSwapParams, Config, LiquidityParams, SimpleSwapParams} from './types'; import {Decimal} from 'decimal.js-light'; - +import {getTickAtSqrtRatio } from './tickMath'; export class Wrap { @@ -14,8 +25,8 @@ export class Wrap { public static EkuboPositionAddress: string; public static EkuboCoreAddress: string; - public static ERC1155Contract: Contract; + public static QuoterContract: Contract; public static SortedTokens:string[]; public static ERC1155ApproveCall:Call; @@ -28,6 +39,7 @@ export class Wrap { //default provider const provider = config.provider ? config.provider : new Provider({ sequencer: { network: constants.NetworkName.SN_MAIN } }); Wrap.ERC1155Contract = new Contract(ERC1155, config.erc1155Address, provider); + Wrap.QuoterContract = new Contract(Quoter, config.quoterAddress, provider); //addresses Wrap.ERC1155Address = config.erc1155Address; @@ -142,8 +154,8 @@ export class Wrap { Wrap.checkAccount(); const lowerSqrtRatioX128 = new Decimal(params.lowerPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); const upperSqrtRatioX128 = new Decimal(params.upperPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); - const lowerTick = TickMath.getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); - const upperTick = TickMath.getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); + const lowerTick = getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); + const upperTick = getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); if (lowerTick > upperTick) { throw new Error("lowerTick should be less than upperTick"); } @@ -197,6 +209,41 @@ export class Wrap { return []; } + public quoteSingle = async (fee: FeeAmount, specified_token: string, amount: bigint): Promise => { + + try { + + return await Wrap.QuoterContract.quote_single({ + amount: { + mag: amount, + sign: false + }, + specified_token: specified_token, + pool_key: { + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + }); + } catch (error: any) { + let inputString = error.toString(); + const substringToFind = "0x3f532df6e73f94d604f4eb8c661635595c91adc1d387931451eacd418cfbd14"; + const substringStartIndex = inputString.indexOf(substringToFind); + + if (substringStartIndex !== -1) { + const startIndex = substringStartIndex + substringToFind.length + 2; // Skip the substring and the following comma and whitespace + const endIndex = inputString.indexOf(",", startIndex); + return inputString.substring(startIndex, endIndex).trim(); + } + + return 0; + } + } + + + public swapSimple = async (direction:SwapDirection,params:SimpleSwapParams): Promise => { if (direction == SwapDirection.ERC1155_TO_ERC20){ From 64f9e2272687757119340fa670a2883f62a67627 Mon Sep 17 00:00:00 2001 From: huyao Date: Tue, 31 Oct 2023 18:25:54 +0800 Subject: [PATCH 34/42] graphql-index --- graphql/.env.example | 1 + graphql/.gitignore | 1 + graphql/README.md | 26 + graphql/go.mod | 37 + graphql/go.sum | 210 + graphql/gqlgen.yml | 87 + graphql/graph/db.go | 19 + graphql/graph/generated.go | 6105 +++++++++++++++++++++++++++++ graphql/graph/model/models_gen.go | 51 + graphql/graph/resolver.go | 11 + graphql/graph/schema.graphqls | 67 + graphql/graph/schema.resolvers.go | 92 + graphql/server.go | 33 + graphql/tool.go | 3 + 14 files changed, 6743 insertions(+) create mode 100644 graphql/.env.example create mode 100644 graphql/.gitignore create mode 100644 graphql/README.md create mode 100644 graphql/go.mod create mode 100644 graphql/go.sum create mode 100644 graphql/gqlgen.yml create mode 100644 graphql/graph/db.go create mode 100644 graphql/graph/generated.go create mode 100644 graphql/graph/model/models_gen.go create mode 100644 graphql/graph/resolver.go create mode 100644 graphql/graph/schema.graphqls create mode 100644 graphql/graph/schema.resolvers.go create mode 100644 graphql/server.go create mode 100644 graphql/tool.go diff --git a/graphql/.env.example b/graphql/.env.example new file mode 100644 index 0000000..6b56427 --- /dev/null +++ b/graphql/.env.example @@ -0,0 +1 @@ +DB_URL=postgresql://[user]:[password]@[host]:[port]/[database]?sslmode=require diff --git a/graphql/.gitignore b/graphql/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/graphql/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/graphql/README.md b/graphql/README.md new file mode 100644 index 0000000..d7de409 --- /dev/null +++ b/graphql/README.md @@ -0,0 +1,26 @@ +# indexer-graphql + +## How to start + +### step 1 + +copy the config example file,then replace the database information +```cmd + cp .env.example .env +``` + + +### step 2 +```cmd + go mod tidy +``` + +### step 3 +```cmd + go run server.go +``` + +then visit http://localhost:8088/ for GraphQL playground + + + diff --git a/graphql/go.mod b/graphql/go.mod new file mode 100644 index 0000000..9b7fabf --- /dev/null +++ b/graphql/go.mod @@ -0,0 +1,37 @@ +module github.com/metaforo/indexer-graphql + +go 1.18 + +require ( + github.com/99designs/gqlgen v0.17.40 + github.com/go-pg/pg/v10 v10.11.1 + github.com/joho/godotenv v1.5.1 + github.com/vektah/gqlparser/v2 v2.5.10 +) + +require ( + github.com/agnivade/levenshtein v1.1.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/go-pg/zerochecker v0.2.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.3 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sosodev/duration v1.1.0 // indirect + github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect + github.com/urfave/cli/v2 v2.25.5 // indirect + github.com/vmihailenco/bufpool v0.1.11 // indirect + github.com/vmihailenco/msgpack/v5 v5.3.4 // indirect + github.com/vmihailenco/tagparser v0.1.2 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + golang.org/x/crypto v0.1.0 // indirect + golang.org/x/mod v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + golang.org/x/tools v0.9.3 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + mellium.im/sasl v0.3.1 // indirect +) diff --git a/graphql/go.sum b/graphql/go.sum new file mode 100644 index 0000000..9886366 --- /dev/null +++ b/graphql/go.sum @@ -0,0 +1,210 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/99designs/gqlgen v0.17.40 h1:/l8JcEVQ93wqIfmH9VS1jsAkwm6eAF1NwQn3N+SDqBY= +github.com/99designs/gqlgen v0.17.40/go.mod h1:b62q1USk82GYIVjC60h02YguAZLqYZtvWml8KkhJps4= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= +github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= +github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-pg/pg/v10 v10.11.1 h1:vYwbFpqoMpTDphnzIPshPPepdy3VpzD8qo29OFKp4vo= +github.com/go-pg/pg/v10 v10.11.1/go.mod h1:ExJWndhDNNftBdw1Ow83xqpSf4WMSJK8urmXD5VXS1I= +github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU= +github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= +github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sosodev/duration v1.1.0 h1:kQcaiGbJaIsRqgQy7VGlZrVw1giWO+lDoX3MCPnpVO4= +github.com/sosodev/duration v1.1.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= +github.com/urfave/cli/v2 v2.25.5 h1:d0NIAyhh5shGscroL7ek/Ya9QYQE0KNabJgiUinIQkc= +github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/vektah/gqlparser/v2 v2.5.10 h1:6zSM4azXC9u4Nxy5YmdmGu4uKamfwsdKTwp5zsEealU= +github.com/vektah/gqlparser/v2 v2.5.10/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= +github.com/vmihailenco/bufpool v0.1.11 h1:gOq2WmBrq0i2yW5QJ16ykccQ4wH9UyEsgLm6czKAd94= +github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ= +github.com/vmihailenco/msgpack/v5 v5.3.4 h1:qMKAwOV+meBw2Y8k9cVwAy7qErtYCwBzZ2ellBfvnqc= +github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= +mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= diff --git a/graphql/gqlgen.yml b/graphql/gqlgen.yml new file mode 100644 index 0000000..a5c1dc3 --- /dev/null +++ b/graphql/gqlgen.yml @@ -0,0 +1,87 @@ +# Where are all the schema files located? globs are supported eg src/**/*.graphqls +schema: + - graph/*.graphqls + +# Where should the generated server code go? +exec: + filename: graph/generated.go + package: graph + +# Uncomment to enable federation +# federation: +# filename: graph/federation.go +# package: graph + +# Where should any generated models go? +model: + filename: graph/model/models_gen.go + package: model + +# Where should the resolver implementations go? +resolver: + layout: follow-schema + dir: graph + package: graph + filename_template: "{name}.resolvers.go" + # Optional: turn on to not generate template comments above resolvers + # omit_template_comment: false + +# Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models +# struct_tag: json + +# Optional: turn on to use []Thing instead of []*Thing +# omit_slice_element_pointers: false + +# Optional: turn on to omit Is() methods to interface and unions +# omit_interface_checks : true + +# Optional: turn on to skip generation of ComplexityRoot struct content and Complexity function +# omit_complexity: false + +# Optional: turn on to not generate any file notice comments in generated files +# omit_gqlgen_file_notice: false + +# Optional: turn on to exclude the gqlgen version in the generated file notice. No effect if `omit_gqlgen_file_notice` is true. +# omit_gqlgen_version_in_file_notice: false + +# Optional: turn off to make struct-type struct fields not use pointers +# e.g. type Thing struct { FieldA OtherThing } instead of { FieldA *OtherThing } +# struct_fields_always_pointers: true + +# Optional: turn off to make resolvers return values instead of pointers for structs +# resolvers_always_return_pointers: true + +# Optional: turn on to return pointers instead of values in unmarshalInput +# return_pointers_in_unmarshalinput: false + +# Optional: wrap nullable input fields with Omittable +# nullable_input_omittable: true + +# Optional: set to speed up generation time by not performing a final validation pass. +# skip_validation: true + +# Optional: set to skip running `go mod tidy` when generating server code +# skip_mod_tidy: true + +# gqlgen will search for any type names in the schema in these go packages +# if they match it will use them, otherwise it will generate them. +autobind: +# - "github.com/metaforo/indexer-graphql/graph/model" + +# This section declares type mapping between the GraphQL and go type systems +# +# The first line in each type will be used as defaults for resolver arguments and +# modelgen, the others will be allowed when binding to fields. Configure them to +# your liking +models: + ID: + model: + - github.com/99designs/gqlgen/graphql.ID + - github.com/99designs/gqlgen/graphql.Int + - github.com/99designs/gqlgen/graphql.Int64 + - github.com/99designs/gqlgen/graphql.Int32 + Int: + model: + - github.com/99designs/gqlgen/graphql.Int + - github.com/99designs/gqlgen/graphql.Int64 + - github.com/99designs/gqlgen/graphql.Int32 diff --git a/graphql/graph/db.go b/graphql/graph/db.go new file mode 100644 index 0000000..1d736b3 --- /dev/null +++ b/graphql/graph/db.go @@ -0,0 +1,19 @@ +package graph + +import ( + "os" + "github.com/go-pg/pg/v10" +) + +func Connect() *pg.DB { + connStr := os.Getenv("DB_URL") + opt, err := pg.ParseURL(connStr) + if err != nil { + panic(err) + } + db := pg.Connect(opt) + if _, DBStatus := db.Exec("SELECT 1"); DBStatus != nil { + panic(DBStatus) + } + return db +} diff --git a/graphql/graph/generated.go b/graphql/graph/generated.go new file mode 100644 index 0000000..9af4aad --- /dev/null +++ b/graphql/graph/generated.go @@ -0,0 +1,6105 @@ +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. + +package graph + +import ( + "bytes" + "context" + "embed" + "errors" + "fmt" + "strconv" + "sync" + "sync/atomic" + + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/introspection" + "github.com/metaforo/indexer-graphql/graph/model" + gqlparser "github.com/vektah/gqlparser/v2" + "github.com/vektah/gqlparser/v2/ast" +) + +// region ************************** generated!.gotpl ************************** + +// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + schema: cfg.Schema, + resolvers: cfg.Resolvers, + directives: cfg.Directives, + complexity: cfg.Complexity, + } +} + +type Config struct { + Schema *ast.Schema + Resolvers ResolverRoot + Directives DirectiveRoot + Complexity ComplexityRoot +} + +type ResolverRoot interface { + Query() QueryResolver +} + +type DirectiveRoot struct { +} + +type ComplexityRoot struct { + PoolKey struct { + Extension func(childComplexity int) int + Fee func(childComplexity int) int + KeyHash func(childComplexity int) int + TickSpacing func(childComplexity int) int + Token0 func(childComplexity int) int + Token1 func(childComplexity int) int + } + + PositionDeposit struct { + BlockNumber func(childComplexity int) int + Delta0 func(childComplexity int) int + Delta1 func(childComplexity int) int + EventIndex func(childComplexity int) int + Liquidity func(childComplexity int) int + LowerBound func(childComplexity int) int + PoolKeyHash func(childComplexity int) int + TokenID func(childComplexity int) int + TransactionHash func(childComplexity int) int + TransactionIndex func(childComplexity int) int + UpperBound func(childComplexity int) int + } + + PositionTransfer struct { + BlockNumber func(childComplexity int) int + EventIndex func(childComplexity int) int + FromAddress func(childComplexity int) int + ToAddress func(childComplexity int) int + TokenID func(childComplexity int) int + TransactionHash func(childComplexity int) int + TransactionIndex func(childComplexity int) int + } + + Query struct { + PoolKey func(childComplexity int, keyHash string) int + PoolKeys func(childComplexity int) int + PositionDeposit func(childComplexity int, transactionHash string) int + PositionDeposits func(childComplexity int) int + PositionTransfer func(childComplexity int, transactionHash string) int + PositionTransfers func(childComplexity int) int + Swap func(childComplexity int, transactionHash string) int + } + + Swap struct { + BlockNumber func(childComplexity int) int + Delta0 func(childComplexity int) int + Delta1 func(childComplexity int) int + EventIndex func(childComplexity int) int + LiquidityAfter func(childComplexity int) int + Locker func(childComplexity int) int + PoolKeyHash func(childComplexity int) int + SqrtRatioAfter func(childComplexity int) int + TickAfter func(childComplexity int) int + TransactionHash func(childComplexity int) int + TransactionIndex func(childComplexity int) int + } +} + +type QueryResolver interface { + PoolKeys(ctx context.Context) ([]*model.PoolKey, error) + PoolKey(ctx context.Context, keyHash string) (*model.PoolKey, error) + PositionTransfers(ctx context.Context) ([]*model.PositionTransfer, error) + PositionTransfer(ctx context.Context, transactionHash string) (*model.PositionTransfer, error) + PositionDeposits(ctx context.Context) ([]*model.PositionDeposit, error) + PositionDeposit(ctx context.Context, transactionHash string) (*model.PositionDeposit, error) + Swap(ctx context.Context, transactionHash string) (*model.Swap, error) +} + +type executableSchema struct { + schema *ast.Schema + resolvers ResolverRoot + directives DirectiveRoot + complexity ComplexityRoot +} + +func (e *executableSchema) Schema() *ast.Schema { + if e.schema != nil { + return e.schema + } + return parsedSchema +} + +func (e *executableSchema) Complexity(typeName, field string, childComplexity int, rawArgs map[string]interface{}) (int, bool) { + ec := executionContext{nil, e, 0, 0, nil} + _ = ec + switch typeName + "." + field { + + case "PoolKey.extension": + if e.complexity.PoolKey.Extension == nil { + break + } + + return e.complexity.PoolKey.Extension(childComplexity), true + + case "PoolKey.fee": + if e.complexity.PoolKey.Fee == nil { + break + } + + return e.complexity.PoolKey.Fee(childComplexity), true + + case "PoolKey.key_hash": + if e.complexity.PoolKey.KeyHash == nil { + break + } + + return e.complexity.PoolKey.KeyHash(childComplexity), true + + case "PoolKey.tick_spacing": + if e.complexity.PoolKey.TickSpacing == nil { + break + } + + return e.complexity.PoolKey.TickSpacing(childComplexity), true + + case "PoolKey.token0": + if e.complexity.PoolKey.Token0 == nil { + break + } + + return e.complexity.PoolKey.Token0(childComplexity), true + + case "PoolKey.token1": + if e.complexity.PoolKey.Token1 == nil { + break + } + + return e.complexity.PoolKey.Token1(childComplexity), true + + case "PositionDeposit.block_number": + if e.complexity.PositionDeposit.BlockNumber == nil { + break + } + + return e.complexity.PositionDeposit.BlockNumber(childComplexity), true + + case "PositionDeposit.delta0": + if e.complexity.PositionDeposit.Delta0 == nil { + break + } + + return e.complexity.PositionDeposit.Delta0(childComplexity), true + + case "PositionDeposit.delta1": + if e.complexity.PositionDeposit.Delta1 == nil { + break + } + + return e.complexity.PositionDeposit.Delta1(childComplexity), true + + case "PositionDeposit.event_index": + if e.complexity.PositionDeposit.EventIndex == nil { + break + } + + return e.complexity.PositionDeposit.EventIndex(childComplexity), true + + case "PositionDeposit.liquidity": + if e.complexity.PositionDeposit.Liquidity == nil { + break + } + + return e.complexity.PositionDeposit.Liquidity(childComplexity), true + + case "PositionDeposit.lower_bound": + if e.complexity.PositionDeposit.LowerBound == nil { + break + } + + return e.complexity.PositionDeposit.LowerBound(childComplexity), true + + case "PositionDeposit.pool_key_hash": + if e.complexity.PositionDeposit.PoolKeyHash == nil { + break + } + + return e.complexity.PositionDeposit.PoolKeyHash(childComplexity), true + + case "PositionDeposit.token_id": + if e.complexity.PositionDeposit.TokenID == nil { + break + } + + return e.complexity.PositionDeposit.TokenID(childComplexity), true + + case "PositionDeposit.transaction_hash": + if e.complexity.PositionDeposit.TransactionHash == nil { + break + } + + return e.complexity.PositionDeposit.TransactionHash(childComplexity), true + + case "PositionDeposit.transaction_index": + if e.complexity.PositionDeposit.TransactionIndex == nil { + break + } + + return e.complexity.PositionDeposit.TransactionIndex(childComplexity), true + + case "PositionDeposit.upper_bound": + if e.complexity.PositionDeposit.UpperBound == nil { + break + } + + return e.complexity.PositionDeposit.UpperBound(childComplexity), true + + case "PositionTransfer.block_number": + if e.complexity.PositionTransfer.BlockNumber == nil { + break + } + + return e.complexity.PositionTransfer.BlockNumber(childComplexity), true + + case "PositionTransfer.event_index": + if e.complexity.PositionTransfer.EventIndex == nil { + break + } + + return e.complexity.PositionTransfer.EventIndex(childComplexity), true + + case "PositionTransfer.from_address": + if e.complexity.PositionTransfer.FromAddress == nil { + break + } + + return e.complexity.PositionTransfer.FromAddress(childComplexity), true + + case "PositionTransfer.to_address": + if e.complexity.PositionTransfer.ToAddress == nil { + break + } + + return e.complexity.PositionTransfer.ToAddress(childComplexity), true + + case "PositionTransfer.token_id": + if e.complexity.PositionTransfer.TokenID == nil { + break + } + + return e.complexity.PositionTransfer.TokenID(childComplexity), true + + case "PositionTransfer.transaction_hash": + if e.complexity.PositionTransfer.TransactionHash == nil { + break + } + + return e.complexity.PositionTransfer.TransactionHash(childComplexity), true + + case "PositionTransfer.transaction_index": + if e.complexity.PositionTransfer.TransactionIndex == nil { + break + } + + return e.complexity.PositionTransfer.TransactionIndex(childComplexity), true + + case "Query.pool_key": + if e.complexity.Query.PoolKey == nil { + break + } + + args, err := ec.field_Query_pool_key_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.PoolKey(childComplexity, args["key_hash"].(string)), true + + case "Query.pool_keys": + if e.complexity.Query.PoolKeys == nil { + break + } + + return e.complexity.Query.PoolKeys(childComplexity), true + + case "Query.position_deposit": + if e.complexity.Query.PositionDeposit == nil { + break + } + + args, err := ec.field_Query_position_deposit_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.PositionDeposit(childComplexity, args["transaction_hash"].(string)), true + + case "Query.position_deposits": + if e.complexity.Query.PositionDeposits == nil { + break + } + + return e.complexity.Query.PositionDeposits(childComplexity), true + + case "Query.position_transfer": + if e.complexity.Query.PositionTransfer == nil { + break + } + + args, err := ec.field_Query_position_transfer_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.PositionTransfer(childComplexity, args["transaction_hash"].(string)), true + + case "Query.position_transfers": + if e.complexity.Query.PositionTransfers == nil { + break + } + + return e.complexity.Query.PositionTransfers(childComplexity), true + + case "Query.swap": + if e.complexity.Query.Swap == nil { + break + } + + args, err := ec.field_Query_swap_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.Swap(childComplexity, args["transaction_hash"].(string)), true + + case "Swap.block_number": + if e.complexity.Swap.BlockNumber == nil { + break + } + + return e.complexity.Swap.BlockNumber(childComplexity), true + + case "Swap.delta0": + if e.complexity.Swap.Delta0 == nil { + break + } + + return e.complexity.Swap.Delta0(childComplexity), true + + case "Swap.delta1": + if e.complexity.Swap.Delta1 == nil { + break + } + + return e.complexity.Swap.Delta1(childComplexity), true + + case "Swap.event_index": + if e.complexity.Swap.EventIndex == nil { + break + } + + return e.complexity.Swap.EventIndex(childComplexity), true + + case "Swap.liquidity_after": + if e.complexity.Swap.LiquidityAfter == nil { + break + } + + return e.complexity.Swap.LiquidityAfter(childComplexity), true + + case "Swap.locker": + if e.complexity.Swap.Locker == nil { + break + } + + return e.complexity.Swap.Locker(childComplexity), true + + case "Swap.pool_key_hash": + if e.complexity.Swap.PoolKeyHash == nil { + break + } + + return e.complexity.Swap.PoolKeyHash(childComplexity), true + + case "Swap.sqrt_ratio_after": + if e.complexity.Swap.SqrtRatioAfter == nil { + break + } + + return e.complexity.Swap.SqrtRatioAfter(childComplexity), true + + case "Swap.tick_after": + if e.complexity.Swap.TickAfter == nil { + break + } + + return e.complexity.Swap.TickAfter(childComplexity), true + + case "Swap.transaction_hash": + if e.complexity.Swap.TransactionHash == nil { + break + } + + return e.complexity.Swap.TransactionHash(childComplexity), true + + case "Swap.transaction_index": + if e.complexity.Swap.TransactionIndex == nil { + break + } + + return e.complexity.Swap.TransactionIndex(childComplexity), true + + } + return 0, false +} + +func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { + rc := graphql.GetOperationContext(ctx) + ec := executionContext{rc, e, 0, 0, make(chan graphql.DeferredResult)} + inputUnmarshalMap := graphql.BuildUnmarshalerMap() + first := true + + switch rc.Operation.Operation { + case ast.Query: + return func(ctx context.Context) *graphql.Response { + var response graphql.Response + var data graphql.Marshaler + if first { + first = false + ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap) + data = ec._Query(ctx, rc.Operation.SelectionSet) + } else { + if atomic.LoadInt32(&ec.pendingDeferred) > 0 { + result := <-ec.deferredResults + atomic.AddInt32(&ec.pendingDeferred, -1) + data = result.Result + response.Path = result.Path + response.Label = result.Label + response.Errors = result.Errors + } else { + return nil + } + } + var buf bytes.Buffer + data.MarshalGQL(&buf) + response.Data = buf.Bytes() + if atomic.LoadInt32(&ec.deferred) > 0 { + hasNext := atomic.LoadInt32(&ec.pendingDeferred) > 0 + response.HasNext = &hasNext + } + + return &response + } + + default: + return graphql.OneShot(graphql.ErrorResponse(ctx, "unsupported GraphQL operation")) + } +} + +type executionContext struct { + *graphql.OperationContext + *executableSchema + deferred int32 + pendingDeferred int32 + deferredResults chan graphql.DeferredResult +} + +func (ec *executionContext) processDeferredGroup(dg graphql.DeferredGroup) { + atomic.AddInt32(&ec.pendingDeferred, 1) + go func() { + ctx := graphql.WithFreshResponseContext(dg.Context) + dg.FieldSet.Dispatch(ctx) + ds := graphql.DeferredResult{ + Path: dg.Path, + Label: dg.Label, + Result: dg.FieldSet, + Errors: graphql.GetErrors(ctx), + } + // null fields should bubble up + if dg.FieldSet.Invalids > 0 { + ds.Result = graphql.Null + } + ec.deferredResults <- ds + }() +} + +func (ec *executionContext) introspectSchema() (*introspection.Schema, error) { + if ec.DisableIntrospection { + return nil, errors.New("introspection disabled") + } + return introspection.WrapSchema(ec.Schema()), nil +} + +func (ec *executionContext) introspectType(name string) (*introspection.Type, error) { + if ec.DisableIntrospection { + return nil, errors.New("introspection disabled") + } + return introspection.WrapTypeFromDef(ec.Schema(), ec.Schema().Types[name]), nil +} + +//go:embed "schema.graphqls" +var sourcesFS embed.FS + +func sourceData(filename string) string { + data, err := sourcesFS.ReadFile(filename) + if err != nil { + panic(fmt.Sprintf("codegen problem: %s not available", filename)) + } + return string(data) +} + +var sources = []*ast.Source{ + {Name: "schema.graphqls", Input: sourceData("schema.graphqls"), BuiltIn: false}, +} +var parsedSchema = gqlparser.MustLoadSchema(sources...) + +// endregion ************************** generated!.gotpl ************************** + +// region ***************************** args.gotpl ***************************** + +func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["name"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["name"] = arg0 + return args, nil +} + +func (ec *executionContext) field_Query_pool_key_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["key_hash"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("key_hash")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["key_hash"] = arg0 + return args, nil +} + +func (ec *executionContext) field_Query_position_deposit_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["transaction_hash"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("transaction_hash")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["transaction_hash"] = arg0 + return args, nil +} + +func (ec *executionContext) field_Query_position_transfer_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["transaction_hash"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("transaction_hash")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["transaction_hash"] = arg0 + return args, nil +} + +func (ec *executionContext) field_Query_swap_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["transaction_hash"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("transaction_hash")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["transaction_hash"] = arg0 + return args, nil +} + +func (ec *executionContext) field___Type_enumValues_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 bool + if tmp, ok := rawArgs["includeDeprecated"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + arg0, err = ec.unmarshalOBoolean2bool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDeprecated"] = arg0 + return args, nil +} + +func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 bool + if tmp, ok := rawArgs["includeDeprecated"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + arg0, err = ec.unmarshalOBoolean2bool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDeprecated"] = arg0 + return args, nil +} + +// endregion ***************************** args.gotpl ***************************** + +// region ************************** directives.gotpl ************************** + +// endregion ************************** directives.gotpl ************************** + +// region **************************** field.gotpl ***************************** + +func (ec *executionContext) _PoolKey_key_hash(ctx context.Context, field graphql.CollectedField, obj *model.PoolKey) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PoolKey_key_hash(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.KeyHash, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PoolKey_key_hash(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PoolKey", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PoolKey_token0(ctx context.Context, field graphql.CollectedField, obj *model.PoolKey) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PoolKey_token0(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Token0, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PoolKey_token0(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PoolKey", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PoolKey_token1(ctx context.Context, field graphql.CollectedField, obj *model.PoolKey) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PoolKey_token1(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Token1, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PoolKey_token1(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PoolKey", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PoolKey_fee(ctx context.Context, field graphql.CollectedField, obj *model.PoolKey) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PoolKey_fee(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Fee, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PoolKey_fee(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PoolKey", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PoolKey_tick_spacing(ctx context.Context, field graphql.CollectedField, obj *model.PoolKey) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PoolKey_tick_spacing(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TickSpacing, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PoolKey_tick_spacing(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PoolKey", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PoolKey_extension(ctx context.Context, field graphql.CollectedField, obj *model.PoolKey) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PoolKey_extension(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Extension, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PoolKey_extension(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PoolKey", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_block_number(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_block_number(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.BlockNumber, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_block_number(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_transaction_index(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_transaction_index(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TransactionIndex, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_transaction_index(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_event_index(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_event_index(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.EventIndex, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_event_index(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_transaction_hash(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_transaction_hash(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TransactionHash, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_transaction_hash(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_token_id(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_token_id(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TokenID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_token_id(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_lower_bound(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_lower_bound(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.LowerBound, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_lower_bound(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_upper_bound(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_upper_bound(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.UpperBound, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_upper_bound(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_pool_key_hash(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_pool_key_hash(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.PoolKeyHash, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_pool_key_hash(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_liquidity(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_liquidity(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Liquidity, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_liquidity(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_delta0(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_delta0(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Delta0, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_delta0(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionDeposit_delta1(ctx context.Context, field graphql.CollectedField, obj *model.PositionDeposit) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionDeposit_delta1(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Delta1, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionDeposit_delta1(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionDeposit", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionTransfer_block_number(ctx context.Context, field graphql.CollectedField, obj *model.PositionTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionTransfer_block_number(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.BlockNumber, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionTransfer_block_number(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionTransfer", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionTransfer_transaction_index(ctx context.Context, field graphql.CollectedField, obj *model.PositionTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionTransfer_transaction_index(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TransactionIndex, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionTransfer_transaction_index(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionTransfer", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionTransfer_event_index(ctx context.Context, field graphql.CollectedField, obj *model.PositionTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionTransfer_event_index(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.EventIndex, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionTransfer_event_index(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionTransfer", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionTransfer_transaction_hash(ctx context.Context, field graphql.CollectedField, obj *model.PositionTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionTransfer_transaction_hash(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TransactionHash, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionTransfer_transaction_hash(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionTransfer", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionTransfer_token_id(ctx context.Context, field graphql.CollectedField, obj *model.PositionTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionTransfer_token_id(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TokenID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionTransfer_token_id(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionTransfer", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionTransfer_from_address(ctx context.Context, field graphql.CollectedField, obj *model.PositionTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionTransfer_from_address(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.FromAddress, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionTransfer_from_address(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionTransfer", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _PositionTransfer_to_address(ctx context.Context, field graphql.CollectedField, obj *model.PositionTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PositionTransfer_to_address(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.ToAddress, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PositionTransfer_to_address(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PositionTransfer", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_pool_keys(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_pool_keys(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().PoolKeys(rctx) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*model.PoolKey) + fc.Result = res + return ec.marshalNPoolKey2ᚕᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPoolKeyᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_pool_keys(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "key_hash": + return ec.fieldContext_PoolKey_key_hash(ctx, field) + case "token0": + return ec.fieldContext_PoolKey_token0(ctx, field) + case "token1": + return ec.fieldContext_PoolKey_token1(ctx, field) + case "fee": + return ec.fieldContext_PoolKey_fee(ctx, field) + case "tick_spacing": + return ec.fieldContext_PoolKey_tick_spacing(ctx, field) + case "extension": + return ec.fieldContext_PoolKey_extension(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PoolKey", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_pool_key(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_pool_key(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().PoolKey(rctx, fc.Args["key_hash"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*model.PoolKey) + fc.Result = res + return ec.marshalNPoolKey2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPoolKey(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_pool_key(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "key_hash": + return ec.fieldContext_PoolKey_key_hash(ctx, field) + case "token0": + return ec.fieldContext_PoolKey_token0(ctx, field) + case "token1": + return ec.fieldContext_PoolKey_token1(ctx, field) + case "fee": + return ec.fieldContext_PoolKey_fee(ctx, field) + case "tick_spacing": + return ec.fieldContext_PoolKey_tick_spacing(ctx, field) + case "extension": + return ec.fieldContext_PoolKey_extension(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PoolKey", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_pool_key_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query_position_transfers(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_position_transfers(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().PositionTransfers(rctx) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*model.PositionTransfer) + fc.Result = res + return ec.marshalNPositionTransfer2ᚕᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionTransferᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_position_transfers(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "block_number": + return ec.fieldContext_PositionTransfer_block_number(ctx, field) + case "transaction_index": + return ec.fieldContext_PositionTransfer_transaction_index(ctx, field) + case "event_index": + return ec.fieldContext_PositionTransfer_event_index(ctx, field) + case "transaction_hash": + return ec.fieldContext_PositionTransfer_transaction_hash(ctx, field) + case "token_id": + return ec.fieldContext_PositionTransfer_token_id(ctx, field) + case "from_address": + return ec.fieldContext_PositionTransfer_from_address(ctx, field) + case "to_address": + return ec.fieldContext_PositionTransfer_to_address(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PositionTransfer", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_position_transfer(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_position_transfer(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().PositionTransfer(rctx, fc.Args["transaction_hash"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*model.PositionTransfer) + fc.Result = res + return ec.marshalOPositionTransfer2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionTransfer(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_position_transfer(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "block_number": + return ec.fieldContext_PositionTransfer_block_number(ctx, field) + case "transaction_index": + return ec.fieldContext_PositionTransfer_transaction_index(ctx, field) + case "event_index": + return ec.fieldContext_PositionTransfer_event_index(ctx, field) + case "transaction_hash": + return ec.fieldContext_PositionTransfer_transaction_hash(ctx, field) + case "token_id": + return ec.fieldContext_PositionTransfer_token_id(ctx, field) + case "from_address": + return ec.fieldContext_PositionTransfer_from_address(ctx, field) + case "to_address": + return ec.fieldContext_PositionTransfer_to_address(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PositionTransfer", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_position_transfer_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query_position_deposits(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_position_deposits(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().PositionDeposits(rctx) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*model.PositionDeposit) + fc.Result = res + return ec.marshalNPositionDeposit2ᚕᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionDepositᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_position_deposits(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "block_number": + return ec.fieldContext_PositionDeposit_block_number(ctx, field) + case "transaction_index": + return ec.fieldContext_PositionDeposit_transaction_index(ctx, field) + case "event_index": + return ec.fieldContext_PositionDeposit_event_index(ctx, field) + case "transaction_hash": + return ec.fieldContext_PositionDeposit_transaction_hash(ctx, field) + case "token_id": + return ec.fieldContext_PositionDeposit_token_id(ctx, field) + case "lower_bound": + return ec.fieldContext_PositionDeposit_lower_bound(ctx, field) + case "upper_bound": + return ec.fieldContext_PositionDeposit_upper_bound(ctx, field) + case "pool_key_hash": + return ec.fieldContext_PositionDeposit_pool_key_hash(ctx, field) + case "liquidity": + return ec.fieldContext_PositionDeposit_liquidity(ctx, field) + case "delta0": + return ec.fieldContext_PositionDeposit_delta0(ctx, field) + case "delta1": + return ec.fieldContext_PositionDeposit_delta1(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PositionDeposit", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_position_deposit(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_position_deposit(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().PositionDeposit(rctx, fc.Args["transaction_hash"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*model.PositionDeposit) + fc.Result = res + return ec.marshalOPositionDeposit2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionDeposit(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_position_deposit(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "block_number": + return ec.fieldContext_PositionDeposit_block_number(ctx, field) + case "transaction_index": + return ec.fieldContext_PositionDeposit_transaction_index(ctx, field) + case "event_index": + return ec.fieldContext_PositionDeposit_event_index(ctx, field) + case "transaction_hash": + return ec.fieldContext_PositionDeposit_transaction_hash(ctx, field) + case "token_id": + return ec.fieldContext_PositionDeposit_token_id(ctx, field) + case "lower_bound": + return ec.fieldContext_PositionDeposit_lower_bound(ctx, field) + case "upper_bound": + return ec.fieldContext_PositionDeposit_upper_bound(ctx, field) + case "pool_key_hash": + return ec.fieldContext_PositionDeposit_pool_key_hash(ctx, field) + case "liquidity": + return ec.fieldContext_PositionDeposit_liquidity(ctx, field) + case "delta0": + return ec.fieldContext_PositionDeposit_delta0(ctx, field) + case "delta1": + return ec.fieldContext_PositionDeposit_delta1(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PositionDeposit", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_position_deposit_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query_swap(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_swap(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().Swap(rctx, fc.Args["transaction_hash"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*model.Swap) + fc.Result = res + return ec.marshalNSwap2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐSwap(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_swap(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "block_number": + return ec.fieldContext_Swap_block_number(ctx, field) + case "transaction_index": + return ec.fieldContext_Swap_transaction_index(ctx, field) + case "event_index": + return ec.fieldContext_Swap_event_index(ctx, field) + case "transaction_hash": + return ec.fieldContext_Swap_transaction_hash(ctx, field) + case "locker": + return ec.fieldContext_Swap_locker(ctx, field) + case "pool_key_hash": + return ec.fieldContext_Swap_pool_key_hash(ctx, field) + case "delta0": + return ec.fieldContext_Swap_delta0(ctx, field) + case "delta1": + return ec.fieldContext_Swap_delta1(ctx, field) + case "sqrt_ratio_after": + return ec.fieldContext_Swap_sqrt_ratio_after(ctx, field) + case "tick_after": + return ec.fieldContext_Swap_tick_after(ctx, field) + case "liquidity_after": + return ec.fieldContext_Swap_liquidity_after(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Swap", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_swap_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.introspectType(fc.Args["name"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___schema(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.introspectSchema() + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) + fc.Result = res + return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query___schema(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "description": + return ec.fieldContext___Schema_description(ctx, field) + case "types": + return ec.fieldContext___Schema_types(ctx, field) + case "queryType": + return ec.fieldContext___Schema_queryType(ctx, field) + case "mutationType": + return ec.fieldContext___Schema_mutationType(ctx, field) + case "subscriptionType": + return ec.fieldContext___Schema_subscriptionType(ctx, field) + case "directives": + return ec.fieldContext___Schema_directives(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_block_number(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_block_number(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.BlockNumber, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_block_number(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_transaction_index(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_transaction_index(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TransactionIndex, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_transaction_index(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_event_index(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_event_index(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.EventIndex, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_event_index(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_transaction_hash(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_transaction_hash(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TransactionHash, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_transaction_hash(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_locker(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_locker(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Locker, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_locker(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_pool_key_hash(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_pool_key_hash(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.PoolKeyHash, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_pool_key_hash(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_delta0(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_delta0(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Delta0, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_delta0(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_delta1(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_delta1(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Delta1, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_delta1(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_sqrt_ratio_after(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_sqrt_ratio_after(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.SqrtRatioAfter, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_sqrt_ratio_after(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_tick_after(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_tick_after(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.TickAfter, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_tick_after(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Swap_liquidity_after(ctx context.Context, field graphql.CollectedField, obj *model.Swap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Swap_liquidity_after(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.LiquidityAfter, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Swap_liquidity_after(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Swap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_description(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_locations(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]string) + fc.Result = res + return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_locations(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type __DirectiveLocation does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_args(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_isRepeatable(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsRepeatable, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_description(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_description(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_args(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_isDeprecated(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_deprecationReason(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_description(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_defaultValue(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_description(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_types(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_types(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_queryType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_queryType(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_mutationType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_mutationType(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_subscriptionType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_directives(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.Directive) + fc.Result = res + return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_directives(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Directive_name(ctx, field) + case "description": + return ec.fieldContext___Directive_description(ctx, field) + case "locations": + return ec.fieldContext___Directive_locations(ctx, field) + case "args": + return ec.fieldContext___Directive_args(ctx, field) + case "isRepeatable": + return ec.fieldContext___Directive_isRepeatable(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_kind(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalN__TypeKind2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_kind(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type __TypeKind does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_name(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_description(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_fields(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Fields(fc.Args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) + fc.Result = res + return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Field_name(ctx, field) + case "description": + return ec.fieldContext___Field_description(ctx, field) + case "args": + return ec.fieldContext___Field_args(ctx, field) + case "type": + return ec.fieldContext___Field_type(ctx, field) + case "isDeprecated": + return ec.fieldContext___Field_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___Field_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_interfaces(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_interfaces(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_possibleTypes(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_possibleTypes(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_enumValues(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.EnumValues(fc.Args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) + fc.Result = res + return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___EnumValue_name(ctx, field) + case "description": + return ec.fieldContext___EnumValue_description(ctx, field) + case "isDeprecated": + return ec.fieldContext___EnumValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___EnumValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_inputFields(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_inputFields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_ofType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_ofType(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_specifiedByURL(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.SpecifiedByURL(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +// endregion **************************** field.gotpl ***************************** + +// region **************************** input.gotpl ***************************** + +// endregion **************************** input.gotpl ***************************** + +// region ************************** interface.gotpl *************************** + +// endregion ************************** interface.gotpl *************************** + +// region **************************** object.gotpl **************************** + +var poolKeyImplementors = []string{"PoolKey"} + +func (ec *executionContext) _PoolKey(ctx context.Context, sel ast.SelectionSet, obj *model.PoolKey) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, poolKeyImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("PoolKey") + case "key_hash": + out.Values[i] = ec._PoolKey_key_hash(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "token0": + out.Values[i] = ec._PoolKey_token0(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "token1": + out.Values[i] = ec._PoolKey_token1(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "fee": + out.Values[i] = ec._PoolKey_fee(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "tick_spacing": + out.Values[i] = ec._PoolKey_tick_spacing(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "extension": + out.Values[i] = ec._PoolKey_extension(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var positionDepositImplementors = []string{"PositionDeposit"} + +func (ec *executionContext) _PositionDeposit(ctx context.Context, sel ast.SelectionSet, obj *model.PositionDeposit) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, positionDepositImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("PositionDeposit") + case "block_number": + out.Values[i] = ec._PositionDeposit_block_number(ctx, field, obj) + case "transaction_index": + out.Values[i] = ec._PositionDeposit_transaction_index(ctx, field, obj) + case "event_index": + out.Values[i] = ec._PositionDeposit_event_index(ctx, field, obj) + case "transaction_hash": + out.Values[i] = ec._PositionDeposit_transaction_hash(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "token_id": + out.Values[i] = ec._PositionDeposit_token_id(ctx, field, obj) + case "lower_bound": + out.Values[i] = ec._PositionDeposit_lower_bound(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "upper_bound": + out.Values[i] = ec._PositionDeposit_upper_bound(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "pool_key_hash": + out.Values[i] = ec._PositionDeposit_pool_key_hash(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "liquidity": + out.Values[i] = ec._PositionDeposit_liquidity(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "delta0": + out.Values[i] = ec._PositionDeposit_delta0(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "delta1": + out.Values[i] = ec._PositionDeposit_delta1(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var positionTransferImplementors = []string{"PositionTransfer"} + +func (ec *executionContext) _PositionTransfer(ctx context.Context, sel ast.SelectionSet, obj *model.PositionTransfer) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, positionTransferImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("PositionTransfer") + case "block_number": + out.Values[i] = ec._PositionTransfer_block_number(ctx, field, obj) + case "transaction_index": + out.Values[i] = ec._PositionTransfer_transaction_index(ctx, field, obj) + case "event_index": + out.Values[i] = ec._PositionTransfer_event_index(ctx, field, obj) + case "transaction_hash": + out.Values[i] = ec._PositionTransfer_transaction_hash(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "token_id": + out.Values[i] = ec._PositionTransfer_token_id(ctx, field, obj) + case "from_address": + out.Values[i] = ec._PositionTransfer_from_address(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "to_address": + out.Values[i] = ec._PositionTransfer_to_address(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var queryImplementors = []string{"Query"} + +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors) + ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{ + Object: "Query", + }) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ + Object: field.Name, + Field: field, + }) + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Query") + case "pool_keys": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_pool_keys(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "pool_key": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_pool_key(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "position_transfers": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_position_transfers(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "position_transfer": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_position_transfer(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "position_deposits": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_position_deposits(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "position_deposit": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_position_deposit(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "swap": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_swap(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "__type": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Query___type(ctx, field) + }) + case "__schema": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Query___schema(ctx, field) + }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var swapImplementors = []string{"Swap"} + +func (ec *executionContext) _Swap(ctx context.Context, sel ast.SelectionSet, obj *model.Swap) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, swapImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Swap") + case "block_number": + out.Values[i] = ec._Swap_block_number(ctx, field, obj) + case "transaction_index": + out.Values[i] = ec._Swap_transaction_index(ctx, field, obj) + case "event_index": + out.Values[i] = ec._Swap_event_index(ctx, field, obj) + case "transaction_hash": + out.Values[i] = ec._Swap_transaction_hash(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "locker": + out.Values[i] = ec._Swap_locker(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "pool_key_hash": + out.Values[i] = ec._Swap_pool_key_hash(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "delta0": + out.Values[i] = ec._Swap_delta0(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "delta1": + out.Values[i] = ec._Swap_delta1(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "sqrt_ratio_after": + out.Values[i] = ec._Swap_sqrt_ratio_after(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "tick_after": + out.Values[i] = ec._Swap_tick_after(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "liquidity_after": + out.Values[i] = ec._Swap_liquidity_after(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __DirectiveImplementors = []string{"__Directive"} + +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Directive") + case "name": + out.Values[i] = ec.___Directive_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___Directive_description(ctx, field, obj) + case "locations": + out.Values[i] = ec.___Directive_locations(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "args": + out.Values[i] = ec.___Directive_args(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "isRepeatable": + out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __EnumValueImplementors = []string{"__EnumValue"} + +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__EnumValue") + case "name": + out.Values[i] = ec.___EnumValue_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___EnumValue_description(ctx, field, obj) + case "isDeprecated": + out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __FieldImplementors = []string{"__Field"} + +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Field") + case "name": + out.Values[i] = ec.___Field_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___Field_description(ctx, field, obj) + case "args": + out.Values[i] = ec.___Field_args(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "type": + out.Values[i] = ec.___Field_type(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "isDeprecated": + out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __InputValueImplementors = []string{"__InputValue"} + +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__InputValue") + case "name": + out.Values[i] = ec.___InputValue_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___InputValue_description(ctx, field, obj) + case "type": + out.Values[i] = ec.___InputValue_type(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "defaultValue": + out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __SchemaImplementors = []string{"__Schema"} + +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Schema") + case "description": + out.Values[i] = ec.___Schema_description(ctx, field, obj) + case "types": + out.Values[i] = ec.___Schema_types(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "queryType": + out.Values[i] = ec.___Schema_queryType(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "mutationType": + out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) + case "subscriptionType": + out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) + case "directives": + out.Values[i] = ec.___Schema_directives(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __TypeImplementors = []string{"__Type"} + +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Type") + case "kind": + out.Values[i] = ec.___Type_kind(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "name": + out.Values[i] = ec.___Type_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___Type_description(ctx, field, obj) + case "fields": + out.Values[i] = ec.___Type_fields(ctx, field, obj) + case "interfaces": + out.Values[i] = ec.___Type_interfaces(ctx, field, obj) + case "possibleTypes": + out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) + case "enumValues": + out.Values[i] = ec.___Type_enumValues(ctx, field, obj) + case "inputFields": + out.Values[i] = ec.___Type_inputFields(ctx, field, obj) + case "ofType": + out.Values[i] = ec.___Type_ofType(ctx, field, obj) + case "specifiedByURL": + out.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +// endregion **************************** object.gotpl **************************** + +// region ***************************** type.gotpl ***************************** + +func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v interface{}) (bool, error) { + res, err := graphql.UnmarshalBoolean(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { + res := graphql.MarshalBoolean(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) marshalNPoolKey2githubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPoolKey(ctx context.Context, sel ast.SelectionSet, v model.PoolKey) graphql.Marshaler { + return ec._PoolKey(ctx, sel, &v) +} + +func (ec *executionContext) marshalNPoolKey2ᚕᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPoolKeyᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.PoolKey) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNPoolKey2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPoolKey(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalNPoolKey2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPoolKey(ctx context.Context, sel ast.SelectionSet, v *model.PoolKey) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._PoolKey(ctx, sel, v) +} + +func (ec *executionContext) marshalNPositionDeposit2ᚕᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionDepositᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.PositionDeposit) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNPositionDeposit2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionDeposit(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalNPositionDeposit2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionDeposit(ctx context.Context, sel ast.SelectionSet, v *model.PositionDeposit) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._PositionDeposit(ctx, sel, v) +} + +func (ec *executionContext) marshalNPositionTransfer2ᚕᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionTransferᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.PositionTransfer) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNPositionTransfer2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionTransfer(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalNPositionTransfer2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionTransfer(ctx context.Context, sel ast.SelectionSet, v *model.PositionTransfer) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._PositionTransfer(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNString2string(ctx context.Context, v interface{}) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) marshalNSwap2githubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐSwap(ctx context.Context, sel ast.SelectionSet, v model.Swap) graphql.Marshaler { + return ec._Swap(ctx, sel, &v) +} + +func (ec *executionContext) marshalNSwap2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐSwap(ctx context.Context, sel ast.SelectionSet, v *model.Swap) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._Swap(ctx, sel, v) +} + +func (ec *executionContext) marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx context.Context, sel ast.SelectionSet, v introspection.Directive) graphql.Marshaler { + return ec.___Directive(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Directive) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) unmarshalN__DirectiveLocation2string(ctx context.Context, v interface{}) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalN__DirectiveLocation2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, v interface{}) ([]string, error) { + var vSlice []interface{} + if v != nil { + vSlice = graphql.CoerceList(v) + } + var err error + res := make([]string, len(vSlice)) + for i := range vSlice { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) + res[i], err = ec.unmarshalN__DirectiveLocation2string(ctx, vSlice[i]) + if err != nil { + return nil, err + } + } + return res, nil +} + +func (ec *executionContext) marshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__DirectiveLocation2string(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx context.Context, sel ast.SelectionSet, v introspection.EnumValue) graphql.Marshaler { + return ec.___EnumValue(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx context.Context, sel ast.SelectionSet, v introspection.Field) graphql.Marshaler { + return ec.___Field(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx context.Context, sel ast.SelectionSet, v introspection.InputValue) graphql.Marshaler { + return ec.___InputValue(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v introspection.Type) graphql.Marshaler { + return ec.___Type(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec.___Type(ctx, sel, v) +} + +func (ec *executionContext) unmarshalN__TypeKind2string(ctx context.Context, v interface{}) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalOBoolean2bool(ctx context.Context, v interface{}) (bool, error) { + res, err := graphql.UnmarshalBoolean(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { + res := graphql.MarshalBoolean(v) + return res +} + +func (ec *executionContext) unmarshalOBoolean2ᚖbool(ctx context.Context, v interface{}) (*bool, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalBoolean(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast.SelectionSet, v *bool) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalBoolean(*v) + return res +} + +func (ec *executionContext) unmarshalOInt2ᚖint(ctx context.Context, v interface{}) (*int, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalInt(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOInt2ᚖint(ctx context.Context, sel ast.SelectionSet, v *int) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalInt(*v) + return res +} + +func (ec *executionContext) marshalOPositionDeposit2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionDeposit(ctx context.Context, sel ast.SelectionSet, v *model.PositionDeposit) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._PositionDeposit(ctx, sel, v) +} + +func (ec *executionContext) marshalOPositionTransfer2ᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionTransfer(ctx context.Context, sel ast.SelectionSet, v *model.PositionTransfer) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._PositionTransfer(ctx, sel, v) +} + +func (ec *executionContext) unmarshalOString2ᚖstring(ctx context.Context, v interface{}) (*string, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalString(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOString2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalString(*v) + return res +} + +func (ec *executionContext) marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Field) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx context.Context, sel ast.SelectionSet, v *introspection.Schema) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec.___Schema(ctx, sel, v) +} + +func (ec *executionContext) marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec.___Type(ctx, sel, v) +} + +// endregion ***************************** type.gotpl ***************************** diff --git a/graphql/graph/model/models_gen.go b/graphql/graph/model/models_gen.go new file mode 100644 index 0000000..48d0c12 --- /dev/null +++ b/graphql/graph/model/models_gen.go @@ -0,0 +1,51 @@ +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. + +package model + +type PoolKey struct { + KeyHash string `json:"key_hash"` + Token0 string `json:"token0"` + Token1 string `json:"token1"` + Fee string `json:"fee"` + TickSpacing string `json:"tick_spacing"` + Extension string `json:"extension"` +} + +type PositionDeposit struct { + tableName struct{} `pg:"position_deposit"` + BlockNumber *int `json:"block_number,omitempty"` + TransactionIndex *int `json:"transaction_index,omitempty"` + EventIndex *int `json:"event_index,omitempty"` + TransactionHash string `json:"transaction_hash"` + TokenID *int `json:"token_id,omitempty"` + LowerBound string `json:"lower_bound"` + UpperBound string `json:"upper_bound"` + PoolKeyHash string `json:"pool_key_hash"` + Liquidity string `json:"liquidity"` + Delta0 string `json:"delta0"` + Delta1 string `json:"delta1"` +} + +type PositionTransfer struct { + BlockNumber *int `json:"block_number,omitempty"` + TransactionIndex *int `json:"transaction_index,omitempty"` + EventIndex *int `json:"event_index,omitempty"` + TransactionHash string `json:"transaction_hash"` + TokenID *int `json:"token_id,omitempty"` + FromAddress string `json:"from_address"` + ToAddress string `json:"to_address"` +} + +type Swap struct { + BlockNumber *int `json:"block_number,omitempty"` + TransactionIndex *int `json:"transaction_index,omitempty"` + EventIndex *int `json:"event_index,omitempty"` + TransactionHash string `json:"transaction_hash"` + Locker string `json:"locker"` + PoolKeyHash string `json:"pool_key_hash"` + Delta0 string `json:"delta0"` + Delta1 string `json:"delta1"` + SqrtRatioAfter string `json:"sqrt_ratio_after"` + TickAfter string `json:"tick_after"` + LiquidityAfter string `json:"liquidity_after"` +} diff --git a/graphql/graph/resolver.go b/graphql/graph/resolver.go new file mode 100644 index 0000000..95861ab --- /dev/null +++ b/graphql/graph/resolver.go @@ -0,0 +1,11 @@ +package graph + +import "github.com/go-pg/pg/v10" + +// This file will not be regenerated automatically. +// +// It serves as dependency injection for your app, add any dependencies you require here. + +type Resolver struct{ + DB *pg.DB +} diff --git a/graphql/graph/schema.graphqls b/graphql/graph/schema.graphqls new file mode 100644 index 0000000..b36a360 --- /dev/null +++ b/graphql/graph/schema.graphqls @@ -0,0 +1,67 @@ +# GraphQL schema example +# +# https://gqlgen.com/getting-started/ + + +type PoolKey { + key_hash: String! + token0: String! + token1: String! + fee: String! + tick_spacing: String! + extension: String! +} + +type PositionDeposit{ + block_number:Int + transaction_index:Int + event_index:Int + transaction_hash: String! + token_id:Int + lower_bound: String! + upper_bound: String! + pool_key_hash: String! + liquidity: String! + delta0: String! + delta1: String! +} + + +type PositionTransfer { + block_number:Int + transaction_index:Int + event_index:Int + transaction_hash: String! + token_id:Int + from_address: String! + to_address: String! +} + + +type Swap{ + block_number:Int + transaction_index:Int + event_index:Int + transaction_hash: String! + locker:String! + pool_key_hash: String! + delta0: String! + delta1: String! + sqrt_ratio_after: String! + tick_after: String! + liquidity_after: String! +} + + +type Query { + pool_keys: [PoolKey!]! + pool_key(key_hash: String!): PoolKey! + position_transfers:[PositionTransfer!]! + position_transfer(transaction_hash: String!):PositionTransfer + position_deposits:[PositionDeposit!]! + position_deposit(transaction_hash: String!): PositionDeposit + swap(transaction_hash: String!):Swap! +} + + + diff --git a/graphql/graph/schema.resolvers.go b/graphql/graph/schema.resolvers.go new file mode 100644 index 0000000..c60918d --- /dev/null +++ b/graphql/graph/schema.resolvers.go @@ -0,0 +1,92 @@ +package graph + +// This file will be automatically regenerated based on the schema, any resolver implementations +// will be copied through when generating and any unknown code will be moved to the end. +// Code generated by github.com/99designs/gqlgen version v0.17.40 + +import ( + "context" + "github.com/metaforo/indexer-graphql/graph/model" +) + +// PoolKeys is the resolver for the pool_keys field. +func (r *queryResolver) PoolKeys(ctx context.Context) ([]*model.PoolKey, error) { + var pool_keys []*model.PoolKey + + err := r.DB.Model(&pool_keys).Select() + if err != nil { + return nil, err + } + return pool_keys, nil +} + +// PoolKey is the resolver for the pool_key field. +func (r *queryResolver) PoolKey(ctx context.Context, keyHash string) (*model.PoolKey, error) { + pool_key := &model.PoolKey{} + + err := r.DB.Model(pool_key).Where("key_hash=?", keyHash).Select() + if err != nil { + return nil, err + } + return pool_key, nil +} + +// PositionTransfers is the resolver for the position_transfers field. +func (r *queryResolver) PositionTransfers(ctx context.Context) ([]*model.PositionTransfer, error) { + var position_transfers []*model.PositionTransfer + + err := r.DB.Model(&position_transfers).Select() + if err != nil { + return nil, err + } + return position_transfers, nil +} + +// PositionTransfer is the resolver for the position_transfer field. +func (r *queryResolver) PositionTransfer(ctx context.Context, transactionHash string) (*model.PositionTransfer, error) { + position_transfer := &model.PositionTransfer{} + + err := r.DB.Model(position_transfer).Where("transaction_hash=?", transactionHash).Select() + if err != nil { + return nil, err + } + return position_transfer, nil +} + +// PositionDeposits is the resolver for the position_deposits field. +func (r *queryResolver) PositionDeposits(ctx context.Context) ([]*model.PositionDeposit, error) { + var position_deposits []*model.PositionDeposit + + err := r.DB.Model(&position_deposits).Select() + if err != nil { + return nil, err + } + return position_deposits, nil +} + +// PositionDeposit is the resolver for the position_deposit field. +func (r *queryResolver) PositionDeposit(ctx context.Context, transactionHash string) (*model.PositionDeposit, error) { + position_deposit := &model.PositionDeposit{} + + err := r.DB.Model(position_deposit).Where("transaction_hash=?", transactionHash).Select() + if err != nil { + return nil, err + } + return position_deposit, nil +} + +// Swap is the resolver for the swap field. +func (r *queryResolver) Swap(ctx context.Context, transactionHash string) (*model.Swap, error) { + swap := &model.Swap{} + + err := r.DB.Model(swap).Where("transaction_hash=?", transactionHash).Select() + if err != nil { + return nil, err + } + return swap, nil +} + +// Query returns QueryResolver implementation. +func (r *Resolver) Query() QueryResolver { return &queryResolver{r} } + +type queryResolver struct{ *Resolver } diff --git a/graphql/server.go b/graphql/server.go new file mode 100644 index 0000000..578c60e --- /dev/null +++ b/graphql/server.go @@ -0,0 +1,33 @@ +package main + +import ( + "log" + "net/http" + "os" + + "github.com/99designs/gqlgen/graphql/handler" + "github.com/99designs/gqlgen/graphql/playground" + "github.com/metaforo/indexer-graphql/graph" + "github.com/joho/godotenv" + +) + +const defaultPort = "8088" + +func main() { + port := os.Getenv("PORT") + if port == "" { + port = defaultPort + } + err := godotenv.Load(); if err != nil { + log.Fatal("Error loading .env file") + } + Database := graph.Connect() + srv := handler.NewDefaultServer(graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{DB: Database}})) + + http.Handle("/", playground.Handler("GraphQL playground", "/query")) + http.Handle("/query", srv) + + log.Printf("connect to http://localhost:%s/ for GraphQL playground", port) + log.Fatal(http.ListenAndServe(":"+port, nil)) +} diff --git a/graphql/tool.go b/graphql/tool.go new file mode 100644 index 0000000..8b50b9e --- /dev/null +++ b/graphql/tool.go @@ -0,0 +1,3 @@ +package tools + +import _ "github.com/99designs/gqlgen" \ No newline at end of file From 396683a0e7dd1b8bdf63ca01f6593b71ad783a16 Mon Sep 17 00:00:00 2001 From: huyao Date: Fri, 3 Nov 2023 17:53:54 +0800 Subject: [PATCH 35/42] linting by prettier --- contracts/deploy/starknet-devnet.md | 17 +- examples/interface/.gitignore | 1 - examples/interface/index.html | 2 +- examples/interface/src/App.tsx | 16 +- .../interface/src/components/ButtonClick.tsx | 372 ++- .../interface/src/components/WalletBar.tsx | 28 +- examples/interface/src/main.tsx | 20 +- examples/interface/vite.config.ts | 8 +- examples/vanilla/index.ts | 2 +- examples/vanilla/package.json | 2 +- sdk/package.json | 2 +- sdk/packages/instaswap-core/global.d.ts | 2 +- sdk/packages/instaswap-core/jest.config.js | 6 +- sdk/packages/instaswap-core/package.json | 2 +- sdk/packages/instaswap-core/readme.md | 2 +- .../src/abi/ekubo-core-abi.json | 2262 ++++++++--------- .../src/abi/ekubo-position-abi.json | 2 +- .../instaswap-core/src/abi/erc1155-abi.json | 4 +- .../instaswap-core/src/abi/erc20-abi.json | 2 +- .../instaswap-core/src/abi/quoter-abi.json | 2 +- .../instaswap-core/src/abi/werc20-abi.json | 2 +- .../src/abi/wrap_factory-abi.json | 182 +- sdk/packages/instaswap-core/src/constants.ts | 40 +- sdk/packages/instaswap-core/src/index.ts | 4 +- sdk/packages/instaswap-core/src/tickMath.ts | 64 +- sdk/packages/instaswap-core/src/types.ts | 57 +- sdk/packages/instaswap-core/src/wrap.test.ts | 11 +- sdk/packages/instaswap-core/src/wrap.ts | 844 +++--- sdk/packages/instaswap-core/tsconfig.json | 17 +- sdk/readme.md | 4 +- 30 files changed, 2065 insertions(+), 1914 deletions(-) diff --git a/contracts/deploy/starknet-devnet.md b/contracts/deploy/starknet-devnet.md index 472cf91..2af4c87 100644 --- a/contracts/deploy/starknet-devnet.md +++ b/contracts/deploy/starknet-devnet.md @@ -1,29 +1,34 @@ ### Export ENV -``` bash + +```bash export STARKNET_NETWORK=alpha-goerli export STARKNET_WALLET=starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount ``` ### Setup accounts -``` bash + +```bash starknet new_account --account with_testnet_eth --gateway_url http://localhost:5050 --feeder_gateway_url http://localhost:5050 starknet deploy_account --gateway_url http://localhost:5050 --feeder_gateway_url http://localhost:5050 --account with_testnet_eth ``` ### Check txn status + ps. replace with your own hash -``` bash +```bash starknet tx_status --hash 0x2b221bc1aab675e99189692fd530003d269eb099abba70ebd29c3fb5ab10187 --gateway_url http://localhost:5050 --feeder_gateway_url http://localhost:5050 ``` ### Declare contracts on dev-net -``` bash + +```bash starknet declare --contract target/dev/instaswap_InstaSwapPair.sierra.json --account devnet_account1 --max_fee 10000000000000000 --gateway_url http://localhost:5050 --feeder_gateway_url http://localhost:5050 ``` ### Deploy contracts on dev-net -``` bash + +```bash starknet deploy --class_hash 0x11e3711dbd08dd49631efa3a80faa28457cc193d1c620708331e1780e4b6b6e --account devnet_account1 --max_fee 100000000000000000 --gateway_url http://localhost:5050 --feeder_gateway_url http://localhost:5050 -``` \ No newline at end of file +``` diff --git a/examples/interface/.gitignore b/examples/interface/.gitignore index 289e710..a547bf3 100644 --- a/examples/interface/.gitignore +++ b/examples/interface/.gitignore @@ -10,7 +10,6 @@ lerna-debug.log* node_modules dist dist-ssr -.vite *.local # Editor directories and files diff --git a/examples/interface/index.html b/examples/interface/index.html index 0be6e26..058f6da 100644 --- a/examples/interface/index.html +++ b/examples/interface/index.html @@ -1,4 +1,4 @@ - + diff --git a/examples/interface/src/App.tsx b/examples/interface/src/App.tsx index 7eacf70..b521476 100644 --- a/examples/interface/src/App.tsx +++ b/examples/interface/src/App.tsx @@ -1,13 +1,13 @@ -import { useBlock } from '@starknet-react/core' -import WalletBar from './components/WalletBar' -import { BlockNumber, BlockTag } from 'starknet'; +import { useBlock } from "@starknet-react/core"; +import WalletBar from "./components/WalletBar"; +import { BlockNumber, BlockTag } from "starknet"; function App() { const latestBlockNumber: BlockNumber = BlockTag.latest; const { data, isLoading, isError } = useBlock({ refetchInterval: 3000, blockIdentifier: latestBlockNumber, - }) + }); return (
@@ -17,14 +17,14 @@ function App() {

{isLoading - ? 'Loading...' + ? "Loading..." : isError - ? 'Error while fetching the latest block hash' + ? "Error while fetching the latest block hash" : `Latest block hash: ${data?.block_hash}`}
- ) + ); } -export default App +export default App; diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 5f51d30..a01afc9 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -1,15 +1,14 @@ -import { useAccount, useConnectors } from '@starknet-react/core' -import { useCallback, useMemo, useState, useEffect } from 'react' -import { Contract, uint256, CallData, RawArgs, Call, num } from 'starknet' -import { Wrap } from '@bibliothecadao/instaswap-core' -import { FeeAmount,SwapDirection } from '@bibliothecadao/instaswap-core' -import { Provider, constants, cairo } from "starknet" - +import { useAccount, useConnectors } from "@starknet-react/core"; +import { useCallback, useMemo, useState, useEffect } from "react"; +import { Contract, uint256, CallData, RawArgs, Call, num } from "starknet"; +import { Wrap } from "@bibliothecadao/instaswap-core"; +import { FeeAmount, SwapDirection } from "@bibliothecadao/instaswap-core"; +import { Provider, constants, cairo } from "starknet"; const ButtonClick = () => { const [lowerBound, setLowerBound] = useState(0); const [upperBound, setUpperBound] = useState(0); - const { address, account } = useAccount() + const { address, account } = useAccount(); const [balance, setBalance] = useState("0"); const [currentPrice, setCurrentPrice] = useState(0); const [mintAmount, setMintAmount] = useState(0); @@ -17,31 +16,59 @@ const ButtonClick = () => { const [ethAmount, setAddLiquidityEthAmount] = useState(0); const [erc1155AmountForSwap, setERC1155AmountForSwap] = useState(0); const [erc20AmountForSwap, setERC20AmountForSwap] = useState(0); - - const erc1155_address = useMemo(() => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", []) - const werc20_address = useMemo(() => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", []) - const eth_address = useMemo(() => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", []) - const ekubo_position_address = useMemo(() => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", []) - const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) - const avnu_address = useMemo(() => "0x07e36202ace0ab52bf438bd8a8b64b3731c48d09f0d8879f5b006384c2f35032", []) - const simple_swapper = useMemo(() => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", []) - const quoter = useMemo(() => "0x042aa743335663ed9c7b52b331ab7f81cc8d65280d311506653f9b5cc22be7cb", []) - const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); - + const [wGoldForSwap, setWGoldForSwap] = useState(0); + const [nftForWithdraw, setNftForWithdraw] = useState(0); + + const erc1155_address = useMemo( + () => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", + [], + ); + + const werc20_address = useMemo( + () => "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", + [], + ); + const eth_address = useMemo( + () => "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + [], + ); + + const ekubo_position_address = useMemo( + () => "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", + [], + ); + const ekubo_core_address = useMemo( + () => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", + [], + ); + const avnu_address = useMemo( + () => "0x07e36202ace0ab52bf438bd8a8b64b3731c48d09f0d8879f5b006384c2f35032", + [], + ); + const simple_swapper = useMemo( + () => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", + [], + ); + const quoter = useMemo( + () => "0x042aa743335663ed9c7b52b331ab7f81cc8d65280d311506653f9b5cc22be7cb", + [], + ); + const provider = new Provider({ + sequencer: { network: constants.NetworkName.SN_GOERLI }, + }); const config = { - erc1155Address: erc1155_address, - werc20Address:werc20_address, - erc20Address:eth_address, - ekuboPositionAddress:ekubo_position_address, - ekuboCoreAddress:ekubo_core_address, - quoterAddress:quoter, - provider:provider, - account:account - } - - - const wrap = new Wrap(config); + erc1155Address: erc1155_address, + werc20Address: werc20_address, + erc20Address: eth_address, + ekuboPositionAddress: ekubo_position_address, + ekuboCoreAddress: ekubo_core_address, + quoterAddress: quoter, + provider: provider, + account: account, + }; + + const wrap = new Wrap(config); const getERC1155Balance = useCallback(async () => { if (!address) return; @@ -49,14 +76,16 @@ const ButtonClick = () => { setBalance(b.toString()); }, [address, erc1155_address]); - - -const getCurrentPrice = useCallback(async () => { + const getCurrentPrice = useCallback(async () => { if (!address) return; - const p = await wrap.quoteSingle(FeeAmount.LOWEST, eth_address, BigInt(10** 7)); - const realPrice = p / (10 ** 7); + const p = await wrap.quoteSingle( + FeeAmount.LOWEST, + eth_address, + BigInt(10 ** 7), + ); + const realPrice = p / 10 ** 7; setCurrentPrice(realPrice); -}, [address, erc1155_address, account]); + }, [address, erc1155_address, account]); useEffect(() => { getERC1155Balance(); @@ -66,89 +95,130 @@ const getCurrentPrice = useCallback(async () => { return () => clearInterval(interval); }, [getERC1155Balance]); - useEffect(() => { - getCurrentPrice(); - const interval = setInterval(() => { - getCurrentPrice(); - }, 3000); - return () => clearInterval(interval); - }, [getCurrentPrice]); + useEffect(() => { + getCurrentPrice(); + const interval = setInterval(() => { + getCurrentPrice(); + }, 3000); + return () => clearInterval(interval); + }, [getCurrentPrice]); const handleAddLiquidity = useCallback(async () => { + if (!account) return; + + const params = { + erc1155Amount: erc1155Amount, + erc20Amount: ethAmount * 10 ** 18, + fee: FeeAmount.LOWEST, + lowerPrice: lowerBound, + upperPrice: upperBound, + }; + + //add liquidity + const { transaction_hash } = await wrap.addLiquidity(params); + console.log(transaction_hash); + }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]); + - if (!account) return; - const params = { - erc1155Amount: erc1155Amount, - erc20Amount: ethAmount * (10 **18), - fee: FeeAmount.LOWEST, - lowerPrice: lowerBound, - upperPrice:upperBound, - }; + const withdraw = useCallback(async () => { + const { transaction_hash } = await wrap.withdraw(nftForWithdraw); + console.log(transaction_hash); + + }, [account,nftForWithdraw]); - //add liquidity - const { transaction_hash } = await wrap.addLiquidity(params); - console.log(transaction_hash); - }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]) const handleSwapFromERC1155ToERC20ByAVNU = useCallback(async () => { if (!account) return; const params = { - erc1155AmountIn: erc1155AmountForSwap, - minERC20AmountOut: 1313331313, - aggregatorAddress: avnu_address, - userAddress: account.address, - fee: FeeAmount.LOWEST, - slippage: 0.99, - currentPrice: currentPrice, - } - const { transaction_hash } = await wrap.swapFromERC1155ToERC20ByAVNU(params); - console.log(transaction_hash); - }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) - - const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(async () => { - if (!account) return; + erc1155AmountIn: erc1155AmountForSwap, + minERC20AmountOut: 1313331313, + aggregatorAddress: avnu_address, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + currentPrice: currentPrice, + }; + const { transaction_hash } = + await wrap.swapFromERC1155ToERC20ByAVNU(params); + console.log(transaction_hash); + }, [account, erc1155AmountForSwap, currentPrice, avnu_address]); - const params = { - amountIn: erc1155AmountForSwap, - minERC20AmountOut: 1313331313, - simpleSwapperAddress: simple_swapper, - userAddress: account.address, - fee: FeeAmount.LOWEST, - slippage: 0.99, - } + const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(async () => { + if (!account) return; - const { transaction_hash } = await wrap.swapSimple(SwapDirection.ERC1155_TO_ERC20,params); - console.log(transaction_hash); - }, [account, erc1155AmountForSwap, currentPrice, avnu_address]) + const params = { + amountIn: erc1155AmountForSwap, + minERC20AmountOut: 1313331313, + simpleSwapperAddress: simple_swapper, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + }; + + const { transaction_hash } = await wrap.swapSimple( + SwapDirection.ERC1155_TO_ERC20, + params, + ); + console.log(transaction_hash); + }, [account, erc1155AmountForSwap, currentPrice, avnu_address]); const handleSwapFromERC20ToERC1155BySimpleSwap = useCallback(async () => { if (!account) return; // debugger; - const params = { - amountIn: erc20AmountForSwap * (10 **18), - minERC20AmountOut: 1313331313, - simpleSwapperAddress: simple_swapper, - userAddress: account.address, - fee: FeeAmount.LOWEST, - slippage: 0.99, - } - - const { transaction_hash } = await wrap.swapSimple(SwapDirection.ERC20_TO_ERC1155,params); - console.log(transaction_hash); - }, [account, erc20AmountForSwap, currentPrice, avnu_address]) + const params = { + amountIn: erc20AmountForSwap * 10 ** 18, + minERC20AmountOut: 1313331313, + simpleSwapperAddress: simple_swapper, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + }; + + const { transaction_hash } = await wrap.swapSimple( + SwapDirection.ERC20_TO_ERC1155, + params, + ); + console.log(transaction_hash); + }, [account, erc20AmountForSwap, currentPrice, avnu_address]); + + const handleSwapFromWGoldToWSliverBySimpleSwap = useCallback(async () => { + if (!account) return; + // debugger; + const params = { + amountIn: 0.001 * 10 ** 18, + minERC20AmountOut: 1313331313, + simpleSwapperAddress: simple_swapper, + userAddress: account.address, + fee: FeeAmount.LOWEST, + slippage: 0.99, + }; + + const { transaction_hash } = await wrap.swapSimple( + SwapDirection.ERC20_TO_ERC1155, + params, + ); + console.log(transaction_hash); + }, [account, wGoldForSwap, currentPrice, avnu_address]); const mayInitializePool = useCallback(async () => { const initialize_tick = { mag: 0n, - sign: false - } + sign: false, + }; - const { transaction_hash } = await wrap.mayInitializePool(FeeAmount.LOWEST, initialize_tick); + const { transaction_hash } = await wrap.mayInitializePool( + FeeAmount.LOWEST, + initialize_tick, + ); console.log(transaction_hash); - }, [account, lowerBound, upperBound]) + }, [account, lowerBound, upperBound]); + + + + const mintERC1155Token = useCallback(async () => { if (!address) return; @@ -156,14 +226,12 @@ const getCurrentPrice = useCallback(async () => { contractAddress: Wrap.ERC1155Contract.address, entrypoint: "mint", calldata: CallData.compile({ - to: address, - id: cairo.uint256(1), - amount: cairo.uint256(mintAmount), - }) - } - account?.execute( - call - ) + to: address, + id: cairo.uint256(1), + amount: cairo.uint256(mintAmount), + }), + }; + account?.execute(call); }, [address, erc1155_address, getERC1155Balance, mintAmount]); return ( @@ -175,14 +243,19 @@ const getCurrentPrice = useCallback(async () => {

ERC1155 Balance: {balance}

-

Current Price : 1 ETH = {currentPrice} WERC20

+

Current Price : 1 ETH = {currentPrice} WERC20

Mint ERC1155

- setMintAmount(parseFloat(e.target.value))} /> + setMintAmount(parseFloat(e.target.value))} + />
@@ -192,41 +265,68 @@ const getCurrentPrice = useCallback(async () => {
- setLowerBound(parseFloat(e.target.value))} /> + setLowerBound(parseFloat(e.target.value))} + />
- setUpperBound(parseFloat(e.target.value))} /> + setUpperBound(parseFloat(e.target.value))} + />
- setAddLiquidityEthAmount(parseFloat(e.target.value))} /> + setAddLiquidityEthAmount(parseFloat(e.target.value))} + />
- setAddLiquidityERC1155Amount(parseFloat(e.target.value))} /> + + setAddLiquidityERC1155Amount(parseFloat(e.target.value)) + } + />
- {/*
*/} - {/*

Swap From ERC1155 to ERC20 By AVNU

*/} - {/*
*/} - {/*
*/} - {/* */} - {/* setERC1155AmountForSwap(parseFloat(e.target.value))} />*/} - {/*
*/} - {/*
*/} - {/* */} - {/*
*/} + {/*
*/} + {/*

Swap From ERC1155 to ERC20 By AVNU

*/} + {/*
*/} + {/*
*/} + {/* */} + {/* setERC1155AmountForSwap(parseFloat(e.target.value))} />*/} + {/*
*/} + {/*
*/} + {/* */} + {/*
*/}

Swap From ERC1155 to ERC20 By SimpleSwapper

- setERC1155AmountForSwap(parseFloat(e.target.value))} /> + setERC1155AmountForSwap(parseFloat(e.target.value))} + />
@@ -236,14 +336,34 @@ const getCurrentPrice = useCallback(async () => {
- setERC20AmountForSwap(parseFloat(e.target.value))} /> + setERC20AmountForSwap(parseFloat(e.target.value))} + />
+
+

Withdraw

+
+
+ + setNftForWithdraw(parseFloat(e.target.value))} + /> +
+
+ +
- ) -} + ); +}; -export default ButtonClick \ No newline at end of file +export default ButtonClick; diff --git a/examples/interface/src/components/WalletBar.tsx b/examples/interface/src/components/WalletBar.tsx index dc4d9c1..80b112d 100644 --- a/examples/interface/src/components/WalletBar.tsx +++ b/examples/interface/src/components/WalletBar.tsx @@ -1,15 +1,15 @@ -import { useAccount, useConnectors } from '@starknet-react/core' -import { useMemo } from 'react' -import ButtonClick from './ButtonClick' +import { useAccount, useConnectors } from "@starknet-react/core"; +import { useMemo } from "react"; +import ButtonClick from "./ButtonClick"; function WalletConnected() { - const { address } = useAccount() - const { disconnect } = useConnectors() + const { address } = useAccount(); + const { disconnect } = useConnectors(); const shortenedAddress = useMemo(() => { - if (!address) return '' - return `${address.slice(0, 6)}...${address.slice(-4)}` - }, [address]) + if (!address) return ""; + return `${address.slice(0, 6)}...${address.slice(-4)}`; + }, [address]); return (
@@ -17,11 +17,11 @@ function WalletConnected() {
- ) + ); } function ConnectWallet() { - const { connectors, connect } = useConnectors() + const { connectors, connect } = useConnectors(); return (
@@ -31,14 +31,14 @@ function ConnectWallet() { - ) + ); })}
- ) + ); } export default function WalletBar() { - const { address } = useAccount() + const { address } = useAccount(); - return address ? : + return address ? : ; } diff --git a/examples/interface/src/main.tsx b/examples/interface/src/main.tsx index 3349801..ca94add 100644 --- a/examples/interface/src/main.tsx +++ b/examples/interface/src/main.tsx @@ -1,17 +1,17 @@ -import { InjectedConnector, StarknetConfig } from '@starknet-react/core' -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' +import { InjectedConnector, StarknetConfig } from "@starknet-react/core"; +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; const connectors = [ - new InjectedConnector({ options: { id: 'braavos' } }), - new InjectedConnector({ options: { id: 'argentX' } }), -] + new InjectedConnector({ options: { id: "braavos" } }), + new InjectedConnector({ options: { id: "argentX" } }), +]; -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - -) + , +); diff --git a/examples/interface/vite.config.ts b/examples/interface/vite.config.ts index 48b0012..21e2d55 100644 --- a/examples/interface/vite.config.ts +++ b/examples/interface/vite.config.ts @@ -1,6 +1,6 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import checker from 'vite-plugin-checker' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import checker from "vite-plugin-checker"; // https://vitejs.dev/config/ export default defineConfig({ @@ -13,4 +13,4 @@ export default defineConfig({ }, }), ], -}) +}); diff --git a/examples/vanilla/index.ts b/examples/vanilla/index.ts index 6aba5fd..7e44977 100644 --- a/examples/vanilla/index.ts +++ b/examples/vanilla/index.ts @@ -1 +1 @@ -import { Wrap } from '@bibliothecadao/instaswap-core' \ No newline at end of file +import { Wrap } from "@bibliothecadao/instaswap-core"; diff --git a/examples/vanilla/package.json b/examples/vanilla/package.json index 8137fed..f59f439 100644 --- a/examples/vanilla/package.json +++ b/examples/vanilla/package.json @@ -11,4 +11,4 @@ "peerDependencies": { "typescript": "^5.0.0" } -} \ No newline at end of file +} diff --git a/sdk/package.json b/sdk/package.json index fc1f5b5..5658f10 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -4,4 +4,4 @@ "workspaces": [ "packages/instaswap-core" ] -} \ No newline at end of file +} diff --git a/sdk/packages/instaswap-core/global.d.ts b/sdk/packages/instaswap-core/global.d.ts index a0f27c3..eea2b27 100644 --- a/sdk/packages/instaswap-core/global.d.ts +++ b/sdk/packages/instaswap-core/global.d.ts @@ -1 +1 @@ -import '@types/jest'; \ No newline at end of file +import "@types/jest"; diff --git a/sdk/packages/instaswap-core/jest.config.js b/sdk/packages/instaswap-core/jest.config.js index 05ca416..f456d7f 100644 --- a/sdk/packages/instaswap-core/jest.config.js +++ b/sdk/packages/instaswap-core/jest.config.js @@ -1,5 +1,5 @@ // jest.config.js module.exports = { - preset: "ts-jest", - testEnvironment: "node", - }; \ No newline at end of file + preset: "ts-jest", + testEnvironment: "node", +}; diff --git a/sdk/packages/instaswap-core/package.json b/sdk/packages/instaswap-core/package.json index 2c25578..003638a 100644 --- a/sdk/packages/instaswap-core/package.json +++ b/sdk/packages/instaswap-core/package.json @@ -27,4 +27,4 @@ "decimal.js-light": "^2.5.1", "jsbi": "^4.3.0" } -} \ No newline at end of file +} diff --git a/sdk/packages/instaswap-core/readme.md b/sdk/packages/instaswap-core/readme.md index 217ed3a..f8cbc2d 100644 --- a/sdk/packages/instaswap-core/readme.md +++ b/sdk/packages/instaswap-core/readme.md @@ -1 +1 @@ -## Instaswap Core \ No newline at end of file +## Instaswap Core diff --git a/sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json b/sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json index 719f53e..2c2be37 100644 --- a/sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json +++ b/sdk/packages/instaswap-core/src/abi/ekubo-core-abi.json @@ -1,1132 +1,1132 @@ [ - { - "name": "Upgradeable", - "type": "impl", - "interface_name": "ekubo::interfaces::upgradeable::IUpgradeable" - }, - { - "name": "ekubo::interfaces::upgradeable::IUpgradeable", - "type": "interface", - "items": [ - { - "name": "replace_class_hash", - "type": "function", - "inputs": [ - { - "name": "class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ], - "outputs": [], - "state_mutability": "external" - } - ] - }, - { - "name": "Core", - "type": "impl", - "interface_name": "ekubo::interfaces::core::ICore" - }, - { - "name": "core::bool", - "type": "enum", - "variants": [ - { - "name": "False", - "type": "()" - }, - { - "name": "True", - "type": "()" - } - ] - }, - { - "name": "ekubo::interfaces::core::LockerState", - "type": "struct", - "members": [ - { - "name": "address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "nonzero_delta_count", - "type": "core::integer::u32" - } - ] - }, - { - "name": "ekubo::types::keys::PoolKey", - "type": "struct", - "members": [ - { - "name": "token0", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "token1", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "fee", - "type": "core::integer::u128" - }, - { - "name": "tick_spacing", - "type": "core::integer::u128" - }, - { - "name": "extension", - "type": "core::starknet::contract_address::ContractAddress" - } - ] - }, - { - "name": "core::integer::u256", - "type": "struct", - "members": [ - { - "name": "low", - "type": "core::integer::u128" - }, - { - "name": "high", - "type": "core::integer::u128" - } - ] - }, - { - "name": "ekubo::types::i129::i129", - "type": "struct", - "members": [ - { - "name": "mag", - "type": "core::integer::u128" - }, - { - "name": "sign", - "type": "core::bool" - } - ] - }, - { - "name": "ekubo::types::call_points::CallPoints", - "type": "struct", - "members": [ - { - "name": "after_initialize_pool", - "type": "core::bool" - }, - { - "name": "before_swap", - "type": "core::bool" - }, - { - "name": "after_swap", - "type": "core::bool" - }, - { - "name": "before_update_position", - "type": "core::bool" - }, - { - "name": "after_update_position", - "type": "core::bool" - } - ] - }, - { - "name": "ekubo::types::pool_price::PoolPrice", - "type": "struct", - "members": [ - { - "name": "sqrt_ratio", - "type": "core::integer::u256" - }, - { - "name": "tick", - "type": "ekubo::types::i129::i129" - }, - { - "name": "call_points", - "type": "ekubo::types::call_points::CallPoints" - } - ] - }, - { - "name": "ekubo::types::fees_per_liquidity::FeesPerLiquidity", - "type": "struct", - "members": [ - { - "name": "value0", - "type": "core::felt252" - }, - { - "name": "value1", - "type": "core::felt252" - } - ] - }, - { - "name": "ekubo::types::bounds::Bounds", - "type": "struct", - "members": [ - { - "name": "lower", - "type": "ekubo::types::i129::i129" - }, - { - "name": "upper", - "type": "ekubo::types::i129::i129" - } - ] - }, - { - "name": "ekubo::types::keys::PositionKey", - "type": "struct", - "members": [ - { - "name": "salt", - "type": "core::integer::u64" - }, - { - "name": "owner", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "bounds", - "type": "ekubo::types::bounds::Bounds" - } - ] - }, - { - "name": "ekubo::types::position::Position", - "type": "struct", - "members": [ - { - "name": "liquidity", - "type": "core::integer::u128" - }, - { - "name": "fees_per_liquidity_inside_last", - "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" - } - ] - }, - { - "name": "ekubo::interfaces::core::GetPositionWithFeesResult", - "type": "struct", - "members": [ - { - "name": "position", - "type": "ekubo::types::position::Position" - }, - { - "name": "fees0", - "type": "core::integer::u128" - }, - { - "name": "fees1", - "type": "core::integer::u128" - }, - { - "name": "fees_per_liquidity_inside_current", - "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" - } - ] - }, - { - "name": "ekubo::types::keys::SavedBalanceKey", - "type": "struct", - "members": [ - { - "name": "owner", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "token", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "salt", - "type": "core::integer::u64" - } - ] - }, - { - "name": "core::option::Option::", - "type": "enum", - "variants": [ - { - "name": "Some", - "type": "core::integer::u256" - }, - { - "name": "None", - "type": "()" - } - ] - }, - { - "name": "ekubo::interfaces::core::UpdatePositionParameters", - "type": "struct", - "members": [ - { - "name": "salt", - "type": "core::integer::u64" - }, - { - "name": "bounds", - "type": "ekubo::types::bounds::Bounds" - }, - { - "name": "liquidity_delta", - "type": "ekubo::types::i129::i129" - } - ] - }, - { - "name": "ekubo::types::delta::Delta", - "type": "struct", - "members": [ - { - "name": "amount0", - "type": "ekubo::types::i129::i129" - }, - { - "name": "amount1", - "type": "ekubo::types::i129::i129" - } - ] - }, - { - "name": "ekubo::interfaces::core::SwapParameters", - "type": "struct", - "members": [ - { - "name": "amount", - "type": "ekubo::types::i129::i129" - }, - { - "name": "is_token1", - "type": "core::bool" - }, - { - "name": "sqrt_ratio_limit", - "type": "core::integer::u256" - }, - { - "name": "skip_ahead", - "type": "core::integer::u32" - } - ] - }, - { - "name": "ekubo::interfaces::core::ICore", - "type": "interface", - "items": [ - { - "name": "set_withdrawal_only_mode", - "type": "function", - "inputs": [], - "outputs": [], - "state_mutability": "external" - }, - { - "name": "get_withdrawal_only_mode", - "type": "function", - "inputs": [], - "outputs": [ - { - "type": "core::bool" - } - ], - "state_mutability": "view" - }, - { - "name": "get_protocol_fees_collected", - "type": "function", - "inputs": [ - { - "name": "token", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [ - { - "type": "core::integer::u128" - } - ], - "state_mutability": "view" - }, - { - "name": "get_locker_state", - "type": "function", - "inputs": [ - { - "name": "id", - "type": "core::integer::u32" - } - ], - "outputs": [ - { - "type": "ekubo::interfaces::core::LockerState" - } - ], - "state_mutability": "view" - }, - { - "name": "get_pool_price", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - } - ], - "outputs": [ - { - "type": "ekubo::types::pool_price::PoolPrice" - } - ], - "state_mutability": "view" - }, - { - "name": "get_pool_liquidity", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - } - ], - "outputs": [ - { - "type": "core::integer::u128" - } - ], - "state_mutability": "view" - }, - { - "name": "get_pool_fees_per_liquidity", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - } - ], - "outputs": [ - { - "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" - } - ], - "state_mutability": "view" - }, - { - "name": "get_pool_fees_per_liquidity_inside", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "bounds", - "type": "ekubo::types::bounds::Bounds" - } - ], - "outputs": [ - { - "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" - } - ], - "state_mutability": "view" - }, - { - "name": "get_pool_tick_liquidity_delta", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "index", - "type": "ekubo::types::i129::i129" - } - ], - "outputs": [ - { - "type": "ekubo::types::i129::i129" - } - ], - "state_mutability": "view" - }, - { - "name": "get_pool_tick_liquidity_net", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "index", - "type": "ekubo::types::i129::i129" - } - ], - "outputs": [ - { - "type": "core::integer::u128" - } - ], - "state_mutability": "view" - }, - { - "name": "get_pool_tick_fees_outside", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "index", - "type": "ekubo::types::i129::i129" - } - ], - "outputs": [ - { - "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" - } - ], - "state_mutability": "view" - }, - { - "name": "get_position", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "position_key", - "type": "ekubo::types::keys::PositionKey" - } - ], - "outputs": [ - { - "type": "ekubo::types::position::Position" - } - ], - "state_mutability": "view" - }, - { - "name": "get_position_with_fees", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "position_key", - "type": "ekubo::types::keys::PositionKey" - } - ], - "outputs": [ - { - "type": "ekubo::interfaces::core::GetPositionWithFeesResult" - } - ], - "state_mutability": "view" - }, - { - "name": "get_reserves", - "type": "function", - "inputs": [ - { - "name": "token", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [ - { - "type": "core::integer::u256" - } - ], - "state_mutability": "view" - }, - { - "name": "get_saved_balance", - "type": "function", - "inputs": [ - { - "name": "key", - "type": "ekubo::types::keys::SavedBalanceKey" - } - ], - "outputs": [ - { - "type": "core::integer::u128" - } - ], - "state_mutability": "view" - }, - { - "name": "next_initialized_tick", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "from", - "type": "ekubo::types::i129::i129" - }, - { - "name": "skip_ahead", - "type": "core::integer::u32" - } - ], - "outputs": [ - { - "type": "(ekubo::types::i129::i129, core::bool)" - } - ], - "state_mutability": "view" - }, - { - "name": "prev_initialized_tick", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "from", - "type": "ekubo::types::i129::i129" - }, - { - "name": "skip_ahead", - "type": "core::integer::u32" - } - ], - "outputs": [ - { - "type": "(ekubo::types::i129::i129, core::bool)" - } - ], - "state_mutability": "view" - }, - { - "name": "withdraw_protocol_fees", - "type": "function", - "inputs": [ - { - "name": "recipient", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "token", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "amount", - "type": "core::integer::u128" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "name": "lock", - "type": "function", - "inputs": [ - { - "name": "data", - "type": "core::array::Array::" - } - ], - "outputs": [ - { - "type": "core::array::Array::" - } - ], - "state_mutability": "external" - }, - { - "name": "withdraw", - "type": "function", - "inputs": [ - { - "name": "token_address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "recipient", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "amount", - "type": "core::integer::u128" - } - ], - "outputs": [], - "state_mutability": "external" - }, - { - "name": "save", - "type": "function", - "inputs": [ - { - "name": "key", - "type": "ekubo::types::keys::SavedBalanceKey" - }, - { - "name": "amount", - "type": "core::integer::u128" - } - ], - "outputs": [ - { - "type": "core::integer::u128" - } - ], - "state_mutability": "external" - }, - { - "name": "deposit", - "type": "function", - "inputs": [ - { - "name": "token_address", - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "outputs": [ - { - "type": "core::integer::u128" - } - ], - "state_mutability": "external" - }, - { - "name": "load", - "type": "function", - "inputs": [ - { - "name": "token", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "salt", - "type": "core::integer::u64" - }, - { - "name": "amount", - "type": "core::integer::u128" - } - ], - "outputs": [ - { - "type": "core::integer::u128" - } - ], - "state_mutability": "external" - }, - { - "name": "initialize_pool", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "initial_tick", - "type": "ekubo::types::i129::i129" - } - ], - "outputs": [ - { - "type": "core::integer::u256" - } - ], - "state_mutability": "external" - }, - { - "name": "maybe_initialize_pool", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "initial_tick", - "type": "ekubo::types::i129::i129" - } - ], - "outputs": [ - { - "type": "core::option::Option::" - } - ], - "state_mutability": "external" - }, - { - "name": "update_position", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "params", - "type": "ekubo::interfaces::core::UpdatePositionParameters" - } - ], - "outputs": [ - { - "type": "ekubo::types::delta::Delta" - } - ], - "state_mutability": "external" - }, - { - "name": "collect_fees", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "salt", - "type": "core::integer::u64" - }, - { - "name": "bounds", - "type": "ekubo::types::bounds::Bounds" - } - ], - "outputs": [ - { - "type": "ekubo::types::delta::Delta" - } - ], - "state_mutability": "external" - }, - { - "name": "swap", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "params", - "type": "ekubo::interfaces::core::SwapParameters" - } - ], - "outputs": [ - { - "type": "ekubo::types::delta::Delta" - } - ], - "state_mutability": "external" - }, - { - "name": "accumulate_as_fees", - "type": "function", - "inputs": [ - { - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "name": "amount0", - "type": "core::integer::u128" - }, - { - "name": "amount1", - "type": "core::integer::u128" - } - ], - "outputs": [ - { - "type": "ekubo::types::delta::Delta" - } - ], - "state_mutability": "external" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::ClassHashReplaced", - "type": "event", - "members": [ - { - "kind": "data", - "name": "new_class_hash", - "type": "core::starknet::class_hash::ClassHash" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::ProtocolFeesPaid", - "type": "event", - "members": [ - { - "kind": "data", - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "kind": "data", - "name": "position_key", - "type": "ekubo::types::keys::PositionKey" - }, - { - "kind": "data", - "name": "delta", - "type": "ekubo::types::delta::Delta" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::ProtocolFeesWithdrawn", - "type": "event", - "members": [ - { - "kind": "data", - "name": "recipient", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "kind": "data", - "name": "token", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "kind": "data", - "name": "amount", - "type": "core::integer::u128" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::PoolInitialized", - "type": "event", - "members": [ - { - "kind": "data", - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "kind": "data", - "name": "initial_tick", - "type": "ekubo::types::i129::i129" - }, - { - "kind": "data", - "name": "sqrt_ratio", - "type": "core::integer::u256" - }, - { - "kind": "data", - "name": "call_points", - "type": "core::integer::u8" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::PositionUpdated", - "type": "event", - "members": [ - { - "kind": "data", - "name": "locker", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "kind": "data", - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "kind": "data", - "name": "params", - "type": "ekubo::interfaces::core::UpdatePositionParameters" - }, - { - "kind": "data", - "name": "delta", - "type": "ekubo::types::delta::Delta" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::PositionFeesCollected", - "type": "event", - "members": [ - { - "kind": "data", - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "kind": "data", - "name": "position_key", - "type": "ekubo::types::keys::PositionKey" - }, - { - "kind": "data", - "name": "delta", - "type": "ekubo::types::delta::Delta" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::Swapped", - "type": "event", - "members": [ - { - "kind": "data", - "name": "locker", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "kind": "data", - "name": "pool_key", - "type": "ekubo::types::keys::PoolKey" - }, - { - "kind": "data", - "name": "params", - "type": "ekubo::interfaces::core::SwapParameters" - }, - { - "kind": "data", - "name": "delta", - "type": "ekubo::types::delta::Delta" - }, - { - "kind": "data", - "name": "sqrt_ratio_after", - "type": "core::integer::u256" - }, - { - "kind": "data", - "name": "tick_after", - "type": "ekubo::types::i129::i129" - }, - { - "kind": "data", - "name": "liquidity_after", - "type": "core::integer::u128" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::SavedBalance", - "type": "event", - "members": [ - { - "kind": "data", - "name": "key", - "type": "ekubo::types::keys::SavedBalanceKey" - }, - { - "kind": "data", - "name": "amount", - "type": "core::integer::u128" - } - ] - }, - { - "kind": "struct", - "name": "ekubo::core::Core::LoadedBalance", - "type": "event", - "members": [ - { - "kind": "data", - "name": "key", - "type": "ekubo::types::keys::SavedBalanceKey" - }, - { - "kind": "data", - "name": "amount", - "type": "core::integer::u128" - } - ] - }, - { - "kind": "enum", - "name": "ekubo::core::Core::Event", - "type": "event", - "variants": [ - { - "kind": "nested", - "name": "ClassHashReplaced", - "type": "ekubo::core::Core::ClassHashReplaced" - }, - { - "kind": "nested", - "name": "ProtocolFeesPaid", - "type": "ekubo::core::Core::ProtocolFeesPaid" - }, - { - "kind": "nested", - "name": "ProtocolFeesWithdrawn", - "type": "ekubo::core::Core::ProtocolFeesWithdrawn" - }, - { - "kind": "nested", - "name": "PoolInitialized", - "type": "ekubo::core::Core::PoolInitialized" - }, - { - "kind": "nested", - "name": "PositionUpdated", - "type": "ekubo::core::Core::PositionUpdated" - }, - { - "kind": "nested", - "name": "PositionFeesCollected", - "type": "ekubo::core::Core::PositionFeesCollected" - }, - { - "kind": "nested", - "name": "Swapped", - "type": "ekubo::core::Core::Swapped" - }, - { - "kind": "nested", - "name": "SavedBalance", - "type": "ekubo::core::Core::SavedBalance" - }, - { - "kind": "nested", - "name": "LoadedBalance", - "type": "ekubo::core::Core::LoadedBalance" - } - ] - } - ] \ No newline at end of file + { + "name": "Upgradeable", + "type": "impl", + "interface_name": "ekubo::interfaces::upgradeable::IUpgradeable" + }, + { + "name": "ekubo::interfaces::upgradeable::IUpgradeable", + "type": "interface", + "items": [ + { + "name": "replace_class_hash", + "type": "function", + "inputs": [ + { + "name": "class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "name": "Core", + "type": "impl", + "interface_name": "ekubo::interfaces::core::ICore" + }, + { + "name": "core::bool", + "type": "enum", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, + { + "name": "ekubo::interfaces::core::LockerState", + "type": "struct", + "members": [ + { + "name": "address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "nonzero_delta_count", + "type": "core::integer::u32" + } + ] + }, + { + "name": "ekubo::types::keys::PoolKey", + "type": "struct", + "members": [ + { + "name": "token0", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token1", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "fee", + "type": "core::integer::u128" + }, + { + "name": "tick_spacing", + "type": "core::integer::u128" + }, + { + "name": "extension", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "name": "core::integer::u256", + "type": "struct", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "name": "ekubo::types::i129::i129", + "type": "struct", + "members": [ + { + "name": "mag", + "type": "core::integer::u128" + }, + { + "name": "sign", + "type": "core::bool" + } + ] + }, + { + "name": "ekubo::types::call_points::CallPoints", + "type": "struct", + "members": [ + { + "name": "after_initialize_pool", + "type": "core::bool" + }, + { + "name": "before_swap", + "type": "core::bool" + }, + { + "name": "after_swap", + "type": "core::bool" + }, + { + "name": "before_update_position", + "type": "core::bool" + }, + { + "name": "after_update_position", + "type": "core::bool" + } + ] + }, + { + "name": "ekubo::types::pool_price::PoolPrice", + "type": "struct", + "members": [ + { + "name": "sqrt_ratio", + "type": "core::integer::u256" + }, + { + "name": "tick", + "type": "ekubo::types::i129::i129" + }, + { + "name": "call_points", + "type": "ekubo::types::call_points::CallPoints" + } + ] + }, + { + "name": "ekubo::types::fees_per_liquidity::FeesPerLiquidity", + "type": "struct", + "members": [ + { + "name": "value0", + "type": "core::felt252" + }, + { + "name": "value1", + "type": "core::felt252" + } + ] + }, + { + "name": "ekubo::types::bounds::Bounds", + "type": "struct", + "members": [ + { + "name": "lower", + "type": "ekubo::types::i129::i129" + }, + { + "name": "upper", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "name": "ekubo::types::keys::PositionKey", + "type": "struct", + "members": [ + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "owner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ] + }, + { + "name": "ekubo::types::position::Position", + "type": "struct", + "members": [ + { + "name": "liquidity", + "type": "core::integer::u128" + }, + { + "name": "fees_per_liquidity_inside_last", + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ] + }, + { + "name": "ekubo::interfaces::core::GetPositionWithFeesResult", + "type": "struct", + "members": [ + { + "name": "position", + "type": "ekubo::types::position::Position" + }, + { + "name": "fees0", + "type": "core::integer::u128" + }, + { + "name": "fees1", + "type": "core::integer::u128" + }, + { + "name": "fees_per_liquidity_inside_current", + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ] + }, + { + "name": "ekubo::types::keys::SavedBalanceKey", + "type": "struct", + "members": [ + { + "name": "owner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "salt", + "type": "core::integer::u64" + } + ] + }, + { + "name": "core::option::Option::", + "type": "enum", + "variants": [ + { + "name": "Some", + "type": "core::integer::u256" + }, + { + "name": "None", + "type": "()" + } + ] + }, + { + "name": "ekubo::interfaces::core::UpdatePositionParameters", + "type": "struct", + "members": [ + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + }, + { + "name": "liquidity_delta", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "name": "ekubo::types::delta::Delta", + "type": "struct", + "members": [ + { + "name": "amount0", + "type": "ekubo::types::i129::i129" + }, + { + "name": "amount1", + "type": "ekubo::types::i129::i129" + } + ] + }, + { + "name": "ekubo::interfaces::core::SwapParameters", + "type": "struct", + "members": [ + { + "name": "amount", + "type": "ekubo::types::i129::i129" + }, + { + "name": "is_token1", + "type": "core::bool" + }, + { + "name": "sqrt_ratio_limit", + "type": "core::integer::u256" + }, + { + "name": "skip_ahead", + "type": "core::integer::u32" + } + ] + }, + { + "name": "ekubo::interfaces::core::ICore", + "type": "interface", + "items": [ + { + "name": "set_withdrawal_only_mode", + "type": "function", + "inputs": [], + "outputs": [], + "state_mutability": "external" + }, + { + "name": "get_withdrawal_only_mode", + "type": "function", + "inputs": [], + "outputs": [ + { + "type": "core::bool" + } + ], + "state_mutability": "view" + }, + { + "name": "get_protocol_fees_collected", + "type": "function", + "inputs": [ + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "get_locker_state", + "type": "function", + "inputs": [ + { + "name": "id", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "ekubo::interfaces::core::LockerState" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_price", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ], + "outputs": [ + { + "type": "ekubo::types::pool_price::PoolPrice" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_liquidity", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_fees_per_liquidity", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + } + ], + "outputs": [ + { + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_fees_per_liquidity_inside", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ], + "outputs": [ + { + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_tick_liquidity_delta", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "index", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "ekubo::types::i129::i129" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_tick_liquidity_net", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "index", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "get_pool_tick_fees_outside", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "index", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "ekubo::types::fees_per_liquidity::FeesPerLiquidity" + } + ], + "state_mutability": "view" + }, + { + "name": "get_position", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + } + ], + "outputs": [ + { + "type": "ekubo::types::position::Position" + } + ], + "state_mutability": "view" + }, + { + "name": "get_position_with_fees", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + } + ], + "outputs": [ + { + "type": "ekubo::interfaces::core::GetPositionWithFeesResult" + } + ], + "state_mutability": "view" + }, + { + "name": "get_reserves", + "type": "function", + "inputs": [ + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view" + }, + { + "name": "get_saved_balance", + "type": "function", + "inputs": [ + { + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, + { + "name": "next_initialized_tick", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "from", + "type": "ekubo::types::i129::i129" + }, + { + "name": "skip_ahead", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "(ekubo::types::i129::i129, core::bool)" + } + ], + "state_mutability": "view" + }, + { + "name": "prev_initialized_tick", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "from", + "type": "ekubo::types::i129::i129" + }, + { + "name": "skip_ahead", + "type": "core::integer::u32" + } + ], + "outputs": [ + { + "type": "(ekubo::types::i129::i129, core::bool)" + } + ], + "state_mutability": "view" + }, + { + "name": "withdraw_protocol_fees", + "type": "function", + "inputs": [ + { + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "name": "lock", + "type": "function", + "inputs": [ + { + "name": "data", + "type": "core::array::Array::" + } + ], + "outputs": [ + { + "type": "core::array::Array::" + } + ], + "state_mutability": "external" + }, + { + "name": "withdraw", + "type": "function", + "inputs": [ + { + "name": "token_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "name": "save", + "type": "function", + "inputs": [ + { + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "deposit", + "type": "function", + "inputs": [ + { + "name": "token_address", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "load", + "type": "function", + "inputs": [ + { + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "amount", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "external" + }, + { + "name": "initialize_pool", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "initial_tick", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "external" + }, + { + "name": "maybe_initialize_pool", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "initial_tick", + "type": "ekubo::types::i129::i129" + } + ], + "outputs": [ + { + "type": "core::option::Option::" + } + ], + "state_mutability": "external" + }, + { + "name": "update_position", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "params", + "type": "ekubo::interfaces::core::UpdatePositionParameters" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + }, + { + "name": "collect_fees", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "salt", + "type": "core::integer::u64" + }, + { + "name": "bounds", + "type": "ekubo::types::bounds::Bounds" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + }, + { + "name": "swap", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "params", + "type": "ekubo::interfaces::core::SwapParameters" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + }, + { + "name": "accumulate_as_fees", + "type": "function", + "inputs": [ + { + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "name": "amount0", + "type": "core::integer::u128" + }, + { + "name": "amount1", + "type": "core::integer::u128" + } + ], + "outputs": [ + { + "type": "ekubo::types::delta::Delta" + } + ], + "state_mutability": "external" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::ClassHashReplaced", + "type": "event", + "members": [ + { + "kind": "data", + "name": "new_class_hash", + "type": "core::starknet::class_hash::ClassHash" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::ProtocolFeesPaid", + "type": "event", + "members": [ + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::ProtocolFeesWithdrawn", + "type": "event", + "members": [ + { + "kind": "data", + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "token", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "amount", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::PoolInitialized", + "type": "event", + "members": [ + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "initial_tick", + "type": "ekubo::types::i129::i129" + }, + { + "kind": "data", + "name": "sqrt_ratio", + "type": "core::integer::u256" + }, + { + "kind": "data", + "name": "call_points", + "type": "core::integer::u8" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::PositionUpdated", + "type": "event", + "members": [ + { + "kind": "data", + "name": "locker", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "params", + "type": "ekubo::interfaces::core::UpdatePositionParameters" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::PositionFeesCollected", + "type": "event", + "members": [ + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "position_key", + "type": "ekubo::types::keys::PositionKey" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::Swapped", + "type": "event", + "members": [ + { + "kind": "data", + "name": "locker", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "pool_key", + "type": "ekubo::types::keys::PoolKey" + }, + { + "kind": "data", + "name": "params", + "type": "ekubo::interfaces::core::SwapParameters" + }, + { + "kind": "data", + "name": "delta", + "type": "ekubo::types::delta::Delta" + }, + { + "kind": "data", + "name": "sqrt_ratio_after", + "type": "core::integer::u256" + }, + { + "kind": "data", + "name": "tick_after", + "type": "ekubo::types::i129::i129" + }, + { + "kind": "data", + "name": "liquidity_after", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::SavedBalance", + "type": "event", + "members": [ + { + "kind": "data", + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + }, + { + "kind": "data", + "name": "amount", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "struct", + "name": "ekubo::core::Core::LoadedBalance", + "type": "event", + "members": [ + { + "kind": "data", + "name": "key", + "type": "ekubo::types::keys::SavedBalanceKey" + }, + { + "kind": "data", + "name": "amount", + "type": "core::integer::u128" + } + ] + }, + { + "kind": "enum", + "name": "ekubo::core::Core::Event", + "type": "event", + "variants": [ + { + "kind": "nested", + "name": "ClassHashReplaced", + "type": "ekubo::core::Core::ClassHashReplaced" + }, + { + "kind": "nested", + "name": "ProtocolFeesPaid", + "type": "ekubo::core::Core::ProtocolFeesPaid" + }, + { + "kind": "nested", + "name": "ProtocolFeesWithdrawn", + "type": "ekubo::core::Core::ProtocolFeesWithdrawn" + }, + { + "kind": "nested", + "name": "PoolInitialized", + "type": "ekubo::core::Core::PoolInitialized" + }, + { + "kind": "nested", + "name": "PositionUpdated", + "type": "ekubo::core::Core::PositionUpdated" + }, + { + "kind": "nested", + "name": "PositionFeesCollected", + "type": "ekubo::core::Core::PositionFeesCollected" + }, + { + "kind": "nested", + "name": "Swapped", + "type": "ekubo::core::Core::Swapped" + }, + { + "kind": "nested", + "name": "SavedBalance", + "type": "ekubo::core::Core::SavedBalance" + }, + { + "kind": "nested", + "name": "LoadedBalance", + "type": "ekubo::core::Core::LoadedBalance" + } + ] + } +] diff --git a/sdk/packages/instaswap-core/src/abi/ekubo-position-abi.json b/sdk/packages/instaswap-core/src/abi/ekubo-position-abi.json index 3b84162..9124147 100644 --- a/sdk/packages/instaswap-core/src/abi/ekubo-position-abi.json +++ b/sdk/packages/instaswap-core/src/abi/ekubo-position-abi.json @@ -654,4 +654,4 @@ } ] } -] \ No newline at end of file +] diff --git a/sdk/packages/instaswap-core/src/abi/erc1155-abi.json b/sdk/packages/instaswap-core/src/abi/erc1155-abi.json index f472490..f122e0e 100644 --- a/sdk/packages/instaswap-core/src/abi/erc1155-abi.json +++ b/sdk/packages/instaswap-core/src/abi/erc1155-abi.json @@ -175,7 +175,7 @@ "type": "function", "inputs": [ { - "name": "from", + "name": "from", "type": "core::starknet::contract_address::ContractAddress" }, { @@ -584,4 +584,4 @@ } ] } -] +] diff --git a/sdk/packages/instaswap-core/src/abi/erc20-abi.json b/sdk/packages/instaswap-core/src/abi/erc20-abi.json index a18744b..8332574 100644 --- a/sdk/packages/instaswap-core/src/abi/erc20-abi.json +++ b/sdk/packages/instaswap-core/src/abi/erc20-abi.json @@ -416,4 +416,4 @@ ], "outputs": [] } -] \ No newline at end of file +] diff --git a/sdk/packages/instaswap-core/src/abi/quoter-abi.json b/sdk/packages/instaswap-core/src/abi/quoter-abi.json index c7c5f69..fc4dea5 100644 --- a/sdk/packages/instaswap-core/src/abi/quoter-abi.json +++ b/sdk/packages/instaswap-core/src/abi/quoter-abi.json @@ -271,4 +271,4 @@ "kind": "enum", "variants": [] } -] \ No newline at end of file +] diff --git a/sdk/packages/instaswap-core/src/abi/werc20-abi.json b/sdk/packages/instaswap-core/src/abi/werc20-abi.json index 2be75ce..87652f9 100644 --- a/sdk/packages/instaswap-core/src/abi/werc20-abi.json +++ b/sdk/packages/instaswap-core/src/abi/werc20-abi.json @@ -365,4 +365,4 @@ "type": "event", "variants": [] } -] \ No newline at end of file +] diff --git a/sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json b/sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json index 2889d34..6f5fbf9 100644 --- a/sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json +++ b/sdk/packages/instaswap-core/src/abi/wrap_factory-abi.json @@ -1,104 +1,104 @@ [ { - "type": "struct", - "name": "core::integer::u256", - "members": [ - { - "name": "low", - "type": "core::integer::u128" - }, - { - "name": "high", - "type": "core::integer::u128" - } - ] + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] }, { - "type": "function", - "name": "create_wrap_address", - "inputs": [ - { - "name": "erc1155_address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "token_id", - "type": "core::integer::u256" - }, - { - "name": "name", - "type": "core::felt252" - }, - { - "name": "symbol", - "type": "core::felt252" - } - ], - "outputs": [], - "state_mutability": "external" + "type": "function", + "name": "create_wrap_address", + "inputs": [ + { + "name": "erc1155_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token_id", + "type": "core::integer::u256" + }, + { + "name": "name", + "type": "core::felt252" + }, + { + "name": "symbol", + "type": "core::felt252" + } + ], + "outputs": [], + "state_mutability": "external" }, { - "type": "function", - "name": "get_wrap_address", - "inputs": [ - { - "name": "erc1155_address", - "type": "core::starknet::contract_address::ContractAddress" - }, - { - "name": "token_id", - "type": "core::integer::u256" - } - ], - "outputs": [ - { - "type": "core::starknet::contract_address::ContractAddress" - } - ], - "state_mutability": "view" + "type": "function", + "name": "get_wrap_address", + "inputs": [ + { + "name": "erc1155_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "token_id", + "type": "core::integer::u256" + } + ], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "view" }, { - "type": "constructor", - "name": "constructor", - "inputs": [ - { - "name": "wrap_hash_", - "type": "core::felt252" - } - ] + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "wrap_hash_", + "type": "core::felt252" + } + ] }, { - "type": "event", - "name": "instaswap::wrap_factory::WrapFactory::CreateWrapAddress", - "kind": "struct", - "members": [ - { - "name": "erc1155_address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - }, - { - "name": "token_id", - "type": "core::integer::u256", - "kind": "data" - }, - { - "name": "wrap_address", - "type": "core::starknet::contract_address::ContractAddress", - "kind": "data" - } - ] + "type": "event", + "name": "instaswap::wrap_factory::WrapFactory::CreateWrapAddress", + "kind": "struct", + "members": [ + { + "name": "erc1155_address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "token_id", + "type": "core::integer::u256", + "kind": "data" + }, + { + "name": "wrap_address", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + } + ] }, { - "type": "event", - "name": "instaswap::wrap_factory::WrapFactory::Event", - "kind": "enum", - "variants": [ - { - "name": "CreateWrapAddress", - "type": "instaswap::wrap_factory::WrapFactory::CreateWrapAddress", - "kind": "nested" - } - ] + "type": "event", + "name": "instaswap::wrap_factory::WrapFactory::Event", + "kind": "enum", + "variants": [ + { + "name": "CreateWrapAddress", + "type": "instaswap::wrap_factory::WrapFactory::CreateWrapAddress", + "kind": "nested" + } + ] } -] \ No newline at end of file +] diff --git a/sdk/packages/instaswap-core/src/constants.ts b/sdk/packages/instaswap-core/src/constants.ts index c9916e4..f824225 100644 --- a/sdk/packages/instaswap-core/src/constants.ts +++ b/sdk/packages/instaswap-core/src/constants.ts @@ -1,35 +1,35 @@ -export const MAX_SQRT_RATIO = 6277100250585753475930931601400621808602321654880405518632n; -export const MIN_SQRT_RATIO = 18446748437148339061n; -export const AVNU_SQRT_RATIO = 363034526046013994104916607590000000000000000000001n; +export const MAX_SQRT_RATIO = + 6277100250585753475930931601400621808602321654880405518632n; +export const MIN_SQRT_RATIO = 18446748437148339061n; +export const AVNU_SQRT_RATIO = + 363034526046013994104916607590000000000000000000001n; /** * The default factory enabled fee amounts, denominated in hundredths of bips. */ export enum FeeAmount { - LOWEST = 100, - LOW = 500, - MEDIUM = 3000, - HIGH = 10000 + LOWEST = 100, + LOW = 500, + MEDIUM = 3000, + HIGH = 10000, } /** -* The default factory tick spacings by fee amount. -*/ + * The default factory tick spacings by fee amount. + */ export const TICK_SPACINGS: { [amount in FeeAmount]: number } = { - [FeeAmount.LOWEST]: 200, - [FeeAmount.LOW]: 1000, - [FeeAmount.MEDIUM]: 5096, - [FeeAmount.HIGH]: 10000 -} + [FeeAmount.LOWEST]: 200, + [FeeAmount.LOW]: 1000, + [FeeAmount.MEDIUM]: 5096, + [FeeAmount.HIGH]: 10000, +}; export enum SwapType { - AVNU = 'AVNU', - SIMPLE_SWAPPER = 'SIMPLE_SWAPPER' + AVNU = "AVNU", + SIMPLE_SWAPPER = "SIMPLE_SWAPPER", } export enum SwapDirection { - ERC1155_TO_ERC20, - ERC20_TO_ERC1155, + ERC1155_TO_ERC20, + ERC20_TO_ERC1155, } - - diff --git a/sdk/packages/instaswap-core/src/index.ts b/sdk/packages/instaswap-core/src/index.ts index 3ffd580..b782ba5 100644 --- a/sdk/packages/instaswap-core/src/index.ts +++ b/sdk/packages/instaswap-core/src/index.ts @@ -1,2 +1,2 @@ -export * from './wrap'; -export * from './constants'; \ No newline at end of file +export * from "./wrap"; +export * from "./constants"; diff --git a/sdk/packages/instaswap-core/src/tickMath.ts b/sdk/packages/instaswap-core/src/tickMath.ts index 97b43b3..2d3a37e 100644 --- a/sdk/packages/instaswap-core/src/tickMath.ts +++ b/sdk/packages/instaswap-core/src/tickMath.ts @@ -1,42 +1,42 @@ -import { Decimal } from 'decimal.js-light'; +import { Decimal } from "decimal.js-light"; export function getTickAtSqrtRatio(sqrt_ratio_x128: bigint): number { - // A fixed point .128 number has at most 128 bits after the decimal, - // which translates to about 10**38.5 in decimal. - // That means ~78 decimals of precision should be able to represent - // any price with full precision. - // Note there can be loss of precision for intermediate calculations, - // but this should be sufficient for just computing the price. - Decimal.set({ precision: 78 }); - - const sqrt_ratio = new Decimal(sqrt_ratio_x128.toString()).div(new Decimal(2).pow(128)); - const tick = sqrt_ratio - .div(new Decimal('1.000001').sqrt()) - .log() - .div(new Decimal('2').log()) - .toFixed(0); - return Number(tick); + // A fixed point .128 number has at most 128 bits after the decimal, + // which translates to about 10**38.5 in decimal. + // That means ~78 decimals of precision should be able to represent + // any price with full precision. + // Note there can be loss of precision for intermediate calculations, + // but this should be sufficient for just computing the price. + Decimal.set({ precision: 78 }); + const sqrt_ratio = new Decimal(sqrt_ratio_x128.toString()).div( + new Decimal(2).pow(128), + ); + const tick = sqrt_ratio + .div(new Decimal("1.000001").sqrt()) + .log() + .div(new Decimal("2").log()) + .toFixed(0); + return Number(tick); } export function getSqrtRatioAtTick(tick: number): bigint { - // A fixed point .128 number has at most 128 bits after the decimal, - // which translates to about 10**38.5 in decimal. - // That means ~78 decimals of precision should be able to represent - // any price with full precision. - // Note there can be loss of precision for intermediate calculations, - // but this should be sufficient for just computing the price. - Decimal.set({ precision: 78 }); + // A fixed point .128 number has at most 128 bits after the decimal, + // which translates to about 10**38.5 in decimal. + // That means ~78 decimals of precision should be able to represent + // any price with full precision. + // Note there can be loss of precision for intermediate calculations, + // but this should be sufficient for just computing the price. + Decimal.set({ precision: 78 }); - const sqrt_ratio_x128 = - new Decimal('1.000001') - .sqrt() - .pow(tick) - .mul(new Decimal(2).pow(128)); - return BigInt(sqrt_ratio_x128.toFixed(0)); + const sqrt_ratio_x128 = new Decimal("1.000001") + .sqrt() + .pow(tick) + .mul(new Decimal(2).pow(128)); + return BigInt(sqrt_ratio_x128.toFixed(0)); } export function tryParseTick(): number | undefined { - // TODO - return undefined; -} \ No newline at end of file + // TODO + return undefined; +} diff --git a/sdk/packages/instaswap-core/src/types.ts b/sdk/packages/instaswap-core/src/types.ts index 40054b0..6a25fab 100644 --- a/sdk/packages/instaswap-core/src/types.ts +++ b/sdk/packages/instaswap-core/src/types.ts @@ -1,41 +1,38 @@ -import {AccountInterface, BigNumberish, Provider} from "starknet"; -import {FeeAmount} from "./constants"; +import { AccountInterface, BigNumberish, Provider } from "starknet"; +import { FeeAmount } from "./constants"; export type Config = { - erc1155Address: string; - werc20Address:string; - erc20Address:string; - ekuboPositionAddress:string; - ekuboCoreAddress:string; - quoterAddress:string; - account:AccountInterface | undefined; - provider?:Provider; + erc1155Address: string; + werc20Address: string; + erc20Address: string; + ekuboPositionAddress: string; + ekuboCoreAddress: string; + quoterAddress: string; + account: AccountInterface | undefined; + provider?: Provider; }; - export type LiquidityParams = { - erc1155Amount: BigNumberish; - erc20Amount: BigNumberish; - fee: FeeAmount; - lowerPrice: number; - upperPrice: number; -} - + erc1155Amount: BigNumberish; + erc20Amount: BigNumberish; + fee: FeeAmount; + lowerPrice: number; + upperPrice: number; +}; export type AVNUSwapParams = SwapParams & { - erc1155AmountIn: BigNumberish; - aggregatorAddress: string; -} + erc1155AmountIn: BigNumberish; + aggregatorAddress: string; +}; export type SimpleSwapParams = SwapParams & { - simpleSwapperAddress: string; - amountIn: BigNumberish; -} - + simpleSwapperAddress: string; + amountIn: BigNumberish; +}; type SwapParams = { - minERC20AmountOut: BigNumberish; - userAddress: string; - fee: FeeAmount; - slippage: number; -} \ No newline at end of file + minERC20AmountOut: BigNumberish; + userAddress: string; + fee: FeeAmount; + slippage: number; +}; diff --git a/sdk/packages/instaswap-core/src/wrap.test.ts b/sdk/packages/instaswap-core/src/wrap.test.ts index 7a770f1..2c34004 100644 --- a/sdk/packages/instaswap-core/src/wrap.test.ts +++ b/sdk/packages/instaswap-core/src/wrap.test.ts @@ -1,5 +1,3 @@ - - // import { // Account, // Contract, @@ -22,14 +20,12 @@ // import {Wrap} from './wrap'; - // const { cleanHex, hexToDecimalString, toBigInt, toHex } = num; // const { encodeShortString } = shortString; // const { randomAddress } = stark; // const { uint256 } = cairo; // const { Signature } = ec.starkCurve; - // const DEFAULT_TEST_ACCOUNT_ADDRESS = // '0x41a44af91dce40db477e72b1c69ee440333b70acca5d973644ed2f9983d8990'; // const DEFAULT_TEST_ACCOUNT_PUBLIC_KEY = '0x61e0c11613e66dd0364c2fca21db1c728e8d6b4e8a57a8a128755dd17b4a9b2'; @@ -44,8 +40,6 @@ // let testAccountPrivateKey = DEFAULT_TEST_ACCOUNT_PRIVATE_KEY; // const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); // const account = new Account(provider, toHex(testAccountAddress), testAccountPrivateKey, '0'); - - // let wrap = new Wrap( // erc1155_address, @@ -54,11 +48,10 @@ // ekubo_nft_address // ); - // test('test add liquidity', async () => { // const { transaction_hash } = await account.execute(wrap.addLiquidity(1)); // const receipt = await account.waitForTransaction(transaction_hash); - + // }); -// }); \ No newline at end of file +// }); diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 1ed9cd1..3935d81 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -1,418 +1,462 @@ import { - AccountInterface, - BigNumberish, - cairo, - Call, - CallData, - constants, - Contract, - InvokeFunctionResponse, - num, - Provider -} from 'starknet'; + AccountInterface, + BigNumberish, + cairo, + Call, + CallData, + constants, + Contract, + InvokeFunctionResponse, + num, + Provider, +} from "starknet"; import ERC1155 from "./abi/erc1155-abi.json"; import Quoter from "./abi/quoter-abi.json"; -import {AVNU_SQRT_RATIO, FeeAmount, MAX_SQRT_RATIO, MIN_SQRT_RATIO, SwapDirection} from './constants'; -import {AVNUSwapParams, Config, LiquidityParams, SimpleSwapParams} from './types'; -import {Decimal} from 'decimal.js-light'; -import {getTickAtSqrtRatio } from './tickMath'; +import { + AVNU_SQRT_RATIO, + FeeAmount, + MAX_SQRT_RATIO, + MIN_SQRT_RATIO, + SwapDirection, +} from "./constants"; +import { + AVNUSwapParams, + Config, + LiquidityParams, + SimpleSwapParams, +} from "./types"; +import { Decimal } from "decimal.js-light"; +import { getTickAtSqrtRatio } from "./tickMath"; export class Wrap { - - public static ERC1155Address: string; - public static WERC20Address: string; - public static ERC20Address: string; - public static EkuboPositionAddress: string; - public static EkuboCoreAddress: string; - - public static ERC1155Contract: Contract; - public static QuoterContract: Contract; - - public static SortedTokens:string[]; - public static ERC1155ApproveCall:Call; - public static CancelERC1155ApproveCall:Call; - - private static account:AccountInterface; - - - constructor(config:Config) { - //default provider - const provider = config.provider ? config.provider : new Provider({ sequencer: { network: constants.NetworkName.SN_MAIN } }); - Wrap.ERC1155Contract = new Contract(ERC1155, config.erc1155Address, provider); - Wrap.QuoterContract = new Contract(Quoter, config.quoterAddress, provider); - - //addresses - Wrap.ERC1155Address = config.erc1155Address; - Wrap.WERC20Address = config.werc20Address; - Wrap.ERC20Address = config.erc20Address; - Wrap.EkuboPositionAddress = config.ekuboPositionAddress; - Wrap.EkuboCoreAddress = config.ekuboCoreAddress; - - - Wrap.SortedTokens = [Wrap.ERC20Address, Wrap.WERC20Address].sort((a, b) => a.localeCompare(b)); - - Wrap.ERC1155ApproveCall = { - contractAddress: Wrap.ERC1155Address, - entrypoint: "setApprovalForAll", - calldata: CallData.compile({ - operator: Wrap.WERC20Address, - approved: num.toCairoBool(true) - }) - }; - - Wrap.CancelERC1155ApproveCall = { - contractAddress: Wrap.ERC1155Address, - entrypoint: "setApprovalForAll", - calldata: CallData.compile({ - operator: Wrap.WERC20Address, - approved: num.toCairoBool(false) - }) - }; - if ( config.account ){ - Wrap.account = config.account; - } - Decimal.set({ precision: 78 }); + public static ERC1155Address: string; + public static WERC20Address: string; + public static ERC20Address: string; + public static EkuboPositionAddress: string; + public static EkuboCoreAddress: string; + + public static ERC1155Contract: Contract; + public static QuoterContract: Contract; + + public static SortedTokens: string[]; + public static ERC1155ApproveCall: Call; + public static CancelERC1155ApproveCall: Call; + + private static account: AccountInterface; + + constructor(config: Config) { + //default provider + const provider = config.provider + ? config.provider + : new Provider({ sequencer: { network: constants.NetworkName.SN_MAIN } }); + Wrap.ERC1155Contract = new Contract( + ERC1155, + config.erc1155Address, + provider, + ); + Wrap.QuoterContract = new Contract(Quoter, config.quoterAddress, provider); + + //addresses + Wrap.ERC1155Address = config.erc1155Address; + Wrap.WERC20Address = config.werc20Address; + Wrap.ERC20Address = config.erc20Address; + Wrap.EkuboPositionAddress = config.ekuboPositionAddress; + Wrap.EkuboCoreAddress = config.ekuboCoreAddress; + + Wrap.SortedTokens = [Wrap.ERC20Address, Wrap.WERC20Address].sort((a, b) => + a.localeCompare(b), + ); + + Wrap.ERC1155ApproveCall = { + contractAddress: Wrap.ERC1155Address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Address, + approved: num.toCairoBool(true), + }), + }; + + Wrap.CancelERC1155ApproveCall = { + contractAddress: Wrap.ERC1155Address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Address, + approved: num.toCairoBool(false), + }), + }; + if (config.account) { + Wrap.account = config.account; } - - private static createDepositCall(contract:string,amount:BigNumberish):Call{ - return { - contractAddress: contract, - entrypoint: "deposit", - calldata: CallData.compile({ - amount: cairo.uint256(amount) - }) - } + Decimal.set({ precision: 78 }); + } + + private static createDepositCall( + contract: string, + amount: BigNumberish, + ): Call { + return { + contractAddress: contract, + entrypoint: "deposit", + calldata: CallData.compile({ + amount: cairo.uint256(amount), + }), + }; + } + + private static createTransferCall( + contract: string, + recipient: string, + amount: BigNumberish, + ): Call { + return { + contractAddress: contract, + entrypoint: "transfer", + calldata: CallData.compile({ + recipient: recipient, + amount: cairo.uint256(amount), // wrap token has 18 decimals + }), + }; + } + + private static createClearCall(contract: string, token: string): Call { + return { + contractAddress: contract, + entrypoint: "clear", + calldata: CallData.compile({ + token: token, + }), + }; + } + + private static createWERC20ApproveCall( + spender: string, + amount: BigNumberish, + ): Call { + return { + contractAddress: Wrap.WERC20Address, + entrypoint: "approve", + calldata: CallData.compile({ + spender: spender, + amount: cairo.uint256(amount), + }), + }; + } + + private static checkAccount() { + if (!Wrap.account) { + throw new Error("slippage should be between 0 and 1"); } - - - private static createTransferCall(contract:string,recipient:string,amount:BigNumberish):Call{ - return { - contractAddress: contract, - entrypoint: "transfer", - calldata: CallData.compile({ - recipient: recipient, - amount: cairo.uint256(amount) // wrap token has 18 decimals - }) - } + } + + public mayInitializePool = ( + fee: FeeAmount, + initial_tick: { mag: BigNumberish; sign: boolean }, + ): Promise => { + const mayInitializePool: Call = { + contractAddress: Wrap.EkuboCoreAddress, + entrypoint: "maybe_initialize_pool", + calldata: CallData.compile({ + pool_key: { + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + initial_tick, + }), + }; + + return Wrap.account.execute([mayInitializePool]); + }; + + public addLiquidity = async ( + params: LiquidityParams, + ): Promise => { + Wrap.checkAccount(); + const lowerSqrtRatioX128 = new Decimal(params.lowerPrice) + .sqrt() + .mul(new Decimal(2).pow(128)) + .toFixed(0); + const upperSqrtRatioX128 = new Decimal(params.upperPrice) + .sqrt() + .mul(new Decimal(2).pow(128)) + .toFixed(0); + const lowerTick = getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); + const upperTick = getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); + if (lowerTick > upperTick) { + throw new Error("lowerTick should be less than upperTick"); } - - private static createClearCall(contract:string,token:string):Call{ - return { - contractAddress: contract, - entrypoint: "clear", - calldata: CallData.compile({ - token: token - }) - } + /** + * create needed contract calls + * mint_and_deposit + */ + const mintAndDeposit: Call = { + contractAddress: Wrap.EkuboPositionAddress, + entrypoint: "mint_and_deposit", + calldata: CallData.compile({ + pool_key: { + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], + fee: Wrap.getFeeX128(params.fee), + tick_spacing: 200, + extension: 0, + }, + bounds: { + lower: { + mag: 50000000n, + sign: lowerTick < 0, + }, + upper: { + mag: 50000000n, + sign: upperTick < 0, + }, + }, + min_liquidity: 2000, + }), + }; + + return Wrap.account.execute([ + Wrap.ERC1155ApproveCall, + Wrap.createDepositCall(Wrap.WERC20Address, params.erc1155Amount), + Wrap.createTransferCall( + Wrap.WERC20Address, + Wrap.EkuboPositionAddress, + BigInt(params.erc1155Amount) * BigInt(10) ** BigInt(18), + ), + Wrap.createTransferCall( + Wrap.ERC20Address, + Wrap.EkuboPositionAddress, + BigInt(params.erc20Amount), + ), + mintAndDeposit, + Wrap.createClearCall(Wrap.EkuboPositionAddress, Wrap.WERC20Address), + Wrap.createClearCall(Wrap.EkuboPositionAddress, Wrap.ERC20Address), + Wrap.CancelERC1155ApproveCall, + ]); + }; + + public withdraw = async (amount:BigNumberish): Promise => { + return Wrap.account.execute([ + { + contractAddress: Wrap.WERC20Address, + entrypoint: "withdraw", + calldata: CallData.compile({ + amount: cairo.uint256(amount), + }), + } + ]); + } + + public quoteSingle = async ( + fee: FeeAmount, + specified_token: string, + amount: bigint, + ): Promise => { + try { + return await Wrap.QuoterContract.quote_single({ + amount: { + mag: amount, + sign: false, + }, + specified_token: specified_token, + pool_key: { + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + }); + } catch (error: any) { + let inputString = error.toString(); + const substringToFind = + "0x3f532df6e73f94d604f4eb8c661635595c91adc1d387931451eacd418cfbd14"; + const substringStartIndex = inputString.indexOf(substringToFind); + + if (substringStartIndex !== -1) { + const startIndex = substringStartIndex + substringToFind.length + 2; // Skip the substring and the following comma and whitespace + const endIndex = inputString.indexOf(",", startIndex); + return inputString.substring(startIndex, endIndex).trim(); + } + + return 0; } - - private static createWERC20ApproveCall(spender:string,amount:BigNumberish):Call{ - return { - contractAddress: Wrap.WERC20Address, - entrypoint: "approve", - calldata: CallData.compile({ - spender: spender, - amount: cairo.uint256(amount) - }) - } + }; + + public swapSimple = async ( + direction: SwapDirection, + params: SimpleSwapParams, + ): Promise => { + if (direction == SwapDirection.ERC1155_TO_ERC20) { + return await this.swapFromERC1155ToERC20(params); } - - private static checkAccount(){ - if (!Wrap.account){ - throw new Error("slippage should be between 0 and 1"); - } + return await this.swapFromERC20ToERC1155(params); + }; + + public swapFromERC1155ToERC20ByAVNU = async ( + params: AVNUSwapParams, + ): Promise => { + if (params.slippage < 0 || params.slippage > 1) { + throw new Error("slippage should be between 0 and 1"); } - - - public mayInitializePool = (fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }):Promise => { - - const mayInitializePool: Call = { - contractAddress: Wrap.EkuboCoreAddress, - entrypoint: "maybe_initialize_pool", - calldata: CallData.compile({ - pool_key: { - token0: Wrap.SortedTokens[0], - token1: Wrap.SortedTokens[1], - fee: Wrap.getFeeX128(fee), - tick_spacing: 200, - extension: 0, - }, - initial_tick - }) - } - - return Wrap.account.execute([mayInitializePool]); - } - - - - - public addLiquidity = async (params:LiquidityParams): Promise =>{ - - Wrap.checkAccount(); - const lowerSqrtRatioX128 = new Decimal(params.lowerPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); - const upperSqrtRatioX128 = new Decimal(params.upperPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); - const lowerTick = getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); - const upperTick = getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); - if (lowerTick > upperTick) { - throw new Error("lowerTick should be less than upperTick"); - } - - /** - * create needed contract calls - * mint_and_deposit - */ - const mintAndDeposit: Call = { - contractAddress: Wrap.EkuboPositionAddress, - entrypoint: "mint_and_deposit", - calldata: CallData.compile( - { - pool_key: { - token0: Wrap.SortedTokens[0], - token1: Wrap.SortedTokens[1], - fee: Wrap.getFeeX128(params.fee), - tick_spacing: 200, - extension: 0, - }, - bounds: { - lower: { - mag: 50000000n, - sign: lowerTick < 0, - }, - upper: { - mag: 50000000n, - sign: upperTick < 0, - } - }, - min_liquidity: 2000, - } - ) - } - - - return Wrap.account.execute([ - Wrap.ERC1155ApproveCall, - Wrap.createDepositCall(Wrap.WERC20Address,params.erc1155Amount), - Wrap.createTransferCall(Wrap.WERC20Address,Wrap.EkuboPositionAddress, - BigInt(params.erc1155Amount) * (BigInt(10) ** BigInt(18))), - Wrap.createTransferCall(Wrap.ERC20Address,Wrap.EkuboPositionAddress,BigInt(params.erc20Amount)), - mintAndDeposit, - Wrap.createClearCall(Wrap.EkuboPositionAddress,Wrap.WERC20Address), - Wrap.createClearCall(Wrap.EkuboPositionAddress,Wrap.ERC20Address), - Wrap.CancelERC1155ApproveCall - ]); + const werc20AmountIn = + BigInt(params.erc1155AmountIn.toString()) * BigInt(10 ** 18); + + /** + * swap + */ + const multiRouteSwap: Call = { + contractAddress: params.aggregatorAddress, + entrypoint: "multi_route_swap", + calldata: CallData.compile({ + token_from_address: Wrap.WERC20Address, + token_from_amount: cairo.uint256(werc20AmountIn), + token_to_address: Wrap.ERC20Address, + token_to_amount: cairo.uint256(params.minERC20AmountOut), // this is useless in avnu contract + token_to_min_amount: cairo.uint256(params.minERC20AmountOut), + beneficiary: params.userAddress, + integrator_fee_amount_bps: 0, + integrator_fee_recipient: 0, + routes: [ + { + token_from: Wrap.WERC20Address, + token_to: Wrap.ERC20Address, + exchange_address: Wrap.EkuboCoreAddress, + percent: 100, + additional_swap_params: [ + Wrap.SortedTokens[0], + Wrap.SortedTokens[1], + Wrap.getFeeX128(params.fee), //fee for determin the pool_key + 200, // tick_spacing for determin the pool_key + 0, // extension for determin the pool_key + AVNU_SQRT_RATIO, //sqrt_ratio_limit + ], + }, + ], + }), + }; + return Wrap.account.execute([ + Wrap.ERC1155ApproveCall, + Wrap.createDepositCall(Wrap.WERC20Address, params.erc1155AmountIn), + Wrap.createWERC20ApproveCall(params.aggregatorAddress, werc20AmountIn), + multiRouteSwap, + ]); + }; + + public swapFromERC1155ToERC20 = async ( + params: SimpleSwapParams, + ): Promise => { + if (params.slippage < 0 || params.slippage > 1) { + throw new Error("slippage should be between 0 and 1"); } - public withdraw(id: number):Call[]{ - return []; + const werc20AmountIn = + BigInt(params.amountIn.toString()) * BigInt(10 ** 18); + + const sqrt_ratio_limit = !(Wrap.ERC20Address > Wrap.WERC20Address) + ? MAX_SQRT_RATIO + : MIN_SQRT_RATIO; + + // swap + const simpleSwap: Call = { + contractAddress: params.simpleSwapperAddress, + entrypoint: "swap", + calldata: CallData.compile({ + pool_key: { + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], + fee: Wrap.getFeeX128(params.fee), + tick_spacing: 200, + extension: 0, + }, + swap_params: { + amount: { + mag: werc20AmountIn, + sign: false, + }, + is_token1: !(Wrap.ERC20Address > Wrap.WERC20Address), + sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), + skip_ahead: 4294967295, + }, + recipient: params.userAddress, + calculated_amount_threshold: 0, + }), + }; + + return Wrap.account.execute([ + Wrap.ERC1155ApproveCall, + Wrap.createDepositCall(Wrap.WERC20Address, params.amountIn), + Wrap.createTransferCall( + Wrap.WERC20Address, + params.simpleSwapperAddress, + BigInt(params.amountIn) * BigInt(10 ** 18), + ), + simpleSwap, + Wrap.createClearCall(params.simpleSwapperAddress, Wrap.SortedTokens[0]), + Wrap.createClearCall(params.simpleSwapperAddress, Wrap.SortedTokens[1]), + ]); + }; + + public swapFromERC20ToERC1155 = async ( + params: SimpleSwapParams, + ): Promise => { + if (params.slippage < 0 || params.slippage > 1) { + throw new Error("slippage should be between 0 and 1"); } - public quoteSingle = async (fee: FeeAmount, specified_token: string, amount: bigint): Promise => { - - try { - - return await Wrap.QuoterContract.quote_single({ - amount: { - mag: amount, - sign: false - }, - specified_token: specified_token, - pool_key: { - token0: Wrap.SortedTokens[0], - token1: Wrap.SortedTokens[1], - fee: Wrap.getFeeX128(fee), - tick_spacing: 200, - extension: 0, - }, - }); - } catch (error: any) { - let inputString = error.toString(); - const substringToFind = "0x3f532df6e73f94d604f4eb8c661635595c91adc1d387931451eacd418cfbd14"; - const substringStartIndex = inputString.indexOf(substringToFind); - - if (substringStartIndex !== -1) { - const startIndex = substringStartIndex + substringToFind.length + 2; // Skip the substring and the following comma and whitespace - const endIndex = inputString.indexOf(",", startIndex); - return inputString.substring(startIndex, endIndex).trim(); - } - - return 0; - } - } - - - - - public swapSimple = async (direction:SwapDirection,params:SimpleSwapParams): Promise => { - if (direction == SwapDirection.ERC1155_TO_ERC20){ - return await this.swapFromERC1155ToERC20(params); - } - return await this.swapFromERC20ToERC1155(params); - } - - - public swapFromERC1155ToERC20ByAVNU = async (params:AVNUSwapParams): Promise => { - - if (params.slippage < 0 || params.slippage > 1) { - throw new Error("slippage should be between 0 and 1"); - } - - - const werc20AmountIn = BigInt(params.erc1155AmountIn.toString()) * BigInt(10 ** 18); - - /** - * swap - */ - const multiRouteSwap: Call = { - contractAddress: params.aggregatorAddress, - entrypoint: "multi_route_swap", - calldata: CallData.compile({ - token_from_address: Wrap.WERC20Address, - token_from_amount: cairo.uint256(werc20AmountIn), - token_to_address: Wrap.ERC20Address, - token_to_amount: cairo.uint256(params.minERC20AmountOut), // this is useless in avnu contract - token_to_min_amount: cairo.uint256(params.minERC20AmountOut), - beneficiary: params.userAddress, - integrator_fee_amount_bps: 0, - integrator_fee_recipient: 0, - routes: [ - { - token_from: Wrap.WERC20Address, - token_to: Wrap.ERC20Address, - exchange_address: Wrap.EkuboCoreAddress, - percent: 100, - additional_swap_params: [ - Wrap.SortedTokens[0], - Wrap.SortedTokens[1], - Wrap.getFeeX128(params.fee), //fee for determin the pool_key - 200, // tick_spacing for determin the pool_key - 0, // extension for determin the pool_key - AVNU_SQRT_RATIO//sqrt_ratio_limit - ], - } - ] - }) - } - return Wrap.account.execute( [ - Wrap.ERC1155ApproveCall, - Wrap.createDepositCall(Wrap.WERC20Address,params.erc1155AmountIn), - Wrap.createWERC20ApproveCall(params.aggregatorAddress,werc20AmountIn), - multiRouteSwap - ]); - } - - - public swapFromERC1155ToERC20 = async (params:SimpleSwapParams): Promise => { - - if (params.slippage < 0 || params.slippage > 1) { - throw new Error("slippage should be between 0 and 1"); - } - - const werc20AmountIn = BigInt(params.amountIn.toString()) * BigInt(10 ** 18); - - - const sqrt_ratio_limit = !(Wrap.ERC20Address > Wrap.WERC20Address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; - - // swap - const simpleSwap: Call = { - contractAddress: params.simpleSwapperAddress, - entrypoint: "swap", - calldata: CallData.compile({ - pool_key: { - token0: Wrap.SortedTokens[0], - token1: Wrap.SortedTokens[1], - fee: Wrap.getFeeX128(params.fee), - tick_spacing: 200, - extension: 0, - }, - swap_params: { - amount: { - mag: werc20AmountIn, - sign: false - }, - is_token1: !(Wrap.ERC20Address > Wrap.WERC20Address), - sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), - skip_ahead: 4294967295, - }, - recipient: params.userAddress, - calculated_amount_threshold: 0, - }) - } - - return Wrap.account.execute( [ - Wrap.ERC1155ApproveCall, - Wrap.createDepositCall(Wrap.WERC20Address,params.amountIn), - Wrap.createTransferCall(Wrap.WERC20Address,params.simpleSwapperAddress, - BigInt(params.amountIn) * (BigInt(10 ** 18))), - simpleSwap, - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0]), - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1]), - ]); - } - - - public swapFromERC20ToERC1155 = async (params:SimpleSwapParams): Promise=> { - if (params.slippage < 0 || params.slippage > 1) { - throw new Error("slippage should be between 0 and 1"); - } - - // let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address); - const sqrt_ratio_limit = (Wrap.ERC20Address > Wrap.WERC20Address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; - // swap - const simpleSwap: Call = { - contractAddress: params.simpleSwapperAddress, - entrypoint: "swap", - calldata: CallData.compile({ - pool_key: { - token0: Wrap.SortedTokens[0], - token1: Wrap.SortedTokens[1], - fee: Wrap.getFeeX128(params.fee), - tick_spacing: 200, - extension: 0, - }, - swap_params: { - amount: { - mag: params.amountIn, - sign: false - }, - is_token1: Wrap.ERC20Address > Wrap.WERC20Address, - sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), - skip_ahead: 4294967295, - }, - recipient: params.userAddress, - calculated_amount_threshold: 0, - }) - }; - - - return Wrap.account.execute([ - Wrap.createTransferCall(Wrap.ERC20Address,params.simpleSwapperAddress,params.amountIn), - simpleSwap, - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0]), - Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1]), - ]); - } - - - - public static getFeeX128(fee: FeeAmount): bigint { - return BigInt(fee) * (2n ** 128n) / (10n ** 6n); - } - - public static getERC1155Balance = async (address: string, tokenId: BigNumberish): Promise => { - const tokenIdCairo = cairo.uint256(tokenId); - return await Wrap.ERC1155Contract.balance_of(address, tokenIdCairo) - } - - public static closestTick(tick: number): bigint { - let t = 200n; - let tick2 = BigInt(tick); - return tick2 - (tick2 % t); - } - - - + // let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address); + const sqrt_ratio_limit = + Wrap.ERC20Address > Wrap.WERC20Address ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; + // swap + const simpleSwap: Call = { + contractAddress: params.simpleSwapperAddress, + entrypoint: "swap", + calldata: CallData.compile({ + pool_key: { + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], + fee: Wrap.getFeeX128(params.fee), + tick_spacing: 200, + extension: 0, + }, + swap_params: { + amount: { + mag: params.amountIn, + sign: false, + }, + is_token1: Wrap.ERC20Address > Wrap.WERC20Address, + sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), + skip_ahead: 4294967295, + }, + recipient: params.userAddress, + calculated_amount_threshold: 0, + }), + }; + + return Wrap.account.execute([ + Wrap.createTransferCall( + Wrap.ERC20Address, + params.simpleSwapperAddress, + params.amountIn, + ), + simpleSwap, + Wrap.createClearCall(params.simpleSwapperAddress, Wrap.SortedTokens[0]), + Wrap.createClearCall(params.simpleSwapperAddress, Wrap.SortedTokens[1]), + ]); + }; + + public static getFeeX128(fee: FeeAmount): bigint { + return (BigInt(fee) * 2n ** 128n) / 10n ** 6n; + } + + public static getERC1155Balance = async ( + address: string, + tokenId: BigNumberish, + ): Promise => { + const tokenIdCairo = cairo.uint256(tokenId); + return await Wrap.ERC1155Contract.balance_of(address, tokenIdCairo); + }; } - diff --git a/sdk/packages/instaswap-core/tsconfig.json b/sdk/packages/instaswap-core/tsconfig.json index 4545129..d841ee6 100644 --- a/sdk/packages/instaswap-core/tsconfig.json +++ b/sdk/packages/instaswap-core/tsconfig.json @@ -13,19 +13,10 @@ "skipLibCheck": true, "strict": true, "strictNullChecks": true, - "types": [ - "jest", - "bun-types", - ], + "types": ["jest", "bun-types"], "esModuleInterop": true }, - "include": [ - "src/**/*.ts" - ], + "include": ["src/**/*.ts"], "skipLibCheck": true, - "exclude": [ - "node_modules", - "dist", - "**/*.test.ts" - ] -} \ No newline at end of file + "exclude": ["node_modules", "dist", "**/*.test.ts"] +} diff --git a/sdk/readme.md b/sdk/readme.md index 70b89a4..6dd5afe 100644 --- a/sdk/readme.md +++ b/sdk/readme.md @@ -9,11 +9,13 @@ It is a Vanilla JS implementation. Install bun.sh Install dependencies: + ``` bun install ``` Build watch: + ``` bun run build --watch -``` \ No newline at end of file +``` From 48250532735cb57500807138ae67fcc1957bd989 Mon Sep 17 00:00:00 2001 From: huyao Date: Fri, 3 Nov 2023 18:38:31 +0800 Subject: [PATCH 36/42] remove useless code --- examples/interface/package-lock.json | 4722 ----------------- .../interface/src/components/ButtonClick.tsx | 28 +- sdk/packages/instaswap-core/src/wrap.test.ts | 57 - sdk/packages/instaswap-core/src/wrap.ts | 66 - 4 files changed, 3 insertions(+), 4870 deletions(-) delete mode 100644 examples/interface/package-lock.json delete mode 100644 sdk/packages/instaswap-core/src/wrap.test.ts diff --git a/examples/interface/package-lock.json b/examples/interface/package-lock.json deleted file mode 100644 index 768b1c0..0000000 --- a/examples/interface/package-lock.json +++ /dev/null @@ -1,4722 +0,0 @@ -{ - "name": "interface", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "interface", - "version": "0.0.0", - "dependencies": { - "@starknet-react/core": "^1.0.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@typescript-eslint/eslint-plugin": "^6.7.3", - "@vitejs/plugin-react": "^3.1.0", - "eslint": "^8.26.0", - "eslint-plugin-react": "^7.31.4", - "typescript": "^4.9.3", - "vite": "^4.1.0", - "vite-plugin-checker": "^0.5.1" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.0.tgz", - "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", - "@babel/types": "^7.23.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.1", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.1.tgz", - "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.0.tgz", - "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.9.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz", - "integrity": "sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "peer": true, - "dependencies": { - "@noble/hashes": "1.3.2" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "peer": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rometools/cli-darwin-arm64": { - "version": "12.1.3", - "resolved": "https://registry.npmmirror.com/@rometools/cli-darwin-arm64/-/cli-darwin-arm64-12.1.3.tgz", - "integrity": "sha512-AmFTUDYjBuEGQp/Wwps+2cqUr+qhR7gyXAUnkL5psCuNCz3807TrUq/ecOoct5MIavGJTH6R4aaSL6+f+VlBEg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rometools/cli-darwin-x64": { - "version": "12.1.3", - "resolved": "https://registry.npmmirror.com/@rometools/cli-darwin-x64/-/cli-darwin-x64-12.1.3.tgz", - "integrity": "sha512-k8MbWna8q4LRlb005N2X+JS1UQ+s3ZLBBvwk4fP8TBxlAJXUz17jLLu/Fi+7DTTEmMhM84TWj4FDKW+rNar28g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rometools/cli-linux-arm64": { - "version": "12.1.3", - "resolved": "https://registry.npmmirror.com/@rometools/cli-linux-arm64/-/cli-linux-arm64-12.1.3.tgz", - "integrity": "sha512-X/uLhJ2/FNA3nu5TiyeNPqiD3OZoFfNfRvw6a3ut0jEREPvEn72NI7WPijH/gxSz55znfQ7UQ6iM4DZumUknJg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rometools/cli-linux-x64": { - "version": "12.1.3", - "resolved": "https://registry.npmmirror.com/@rometools/cli-linux-x64/-/cli-linux-x64-12.1.3.tgz", - "integrity": "sha512-csP17q1eWiUXx9z6Jr/JJPibkplyKIwiWPYNzvPCGE8pHlKhwZj3YHRuu7Dm/4EOqx0XFIuqqWZUYm9bkIC8xg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rometools/cli-win32-arm64": { - "version": "12.1.3", - "resolved": "https://registry.npmmirror.com/@rometools/cli-win32-arm64/-/cli-win32-arm64-12.1.3.tgz", - "integrity": "sha512-RymHWeod57EBOJY4P636CgUwYA6BQdkQjh56XKk4pLEHO6X1bFyMet2XL7KlHw5qOTalzuzf5jJqUs+vf3jdXQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rometools/cli-win32-x64": { - "version": "12.1.3", - "resolved": "https://registry.npmmirror.com/@rometools/cli-win32-x64/-/cli-win32-x64-12.1.3.tgz", - "integrity": "sha512-yHSKYidqJMV9nADqg78GYA+cZ0hS1twANAjiFibQdXj9aGzD+s/IzIFEIi/U/OBLvWYg/SCw0QVozi2vTlKFDQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@scure/starknet": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/@scure/starknet/-/starknet-0.3.0.tgz", - "integrity": "sha512-Ma66yZlwa5z00qI5alSxdWtIpky5LBhy22acVFdoC5kwwbd9uDyMWEYzWHdNyKmQg9t5Y2UOXzINMeb3yez+Gw==", - "peer": true, - "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2" - } - }, - "node_modules/@starknet-react/core": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/@starknet-react/core/-/core-1.0.4.tgz", - "integrity": "sha512-TQiRnb0moqim6+HqioGGzd3FgjPVJFMdMH8Q5AQlJ7oEUNprKkFyHlVGJJlcwvdRaCPD5BQuD2WUL2rQfgMRuw==", - "dependencies": { - "@tanstack/react-query": "^4.29.12", - "immutable": "^4.3.0", - "zod": "^3.21.4" - }, - "peerDependencies": { - "get-starknet-core": "^3.0.1", - "react": "^17.0 || ^18.0", - "starknet": "^5.0.0" - } - }, - "node_modules/@tanstack/query-core": { - "version": "4.35.3", - "resolved": "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-4.35.3.tgz", - "integrity": "sha512-PS+WEjd9wzKTyNjjQymvcOe1yg8f3wYc6mD+vb6CKyZAKvu4sIJwryfqfBULITKCla7P9C4l5e9RXePHvZOZeQ==" - }, - "node_modules/@tanstack/react-query": { - "version": "4.35.3", - "resolved": "https://registry.npmmirror.com/@tanstack/react-query/-/react-query-4.35.3.tgz", - "integrity": "sha512-UgTPioip/rGG3EQilXfA2j4BJkhEQsR+KAbF+KIuvQ7j4MkgnTCJF01SfRpIRNtQTlEfz/+IL7+jP8WA8bFbsw==", - "dependencies": { - "@tanstack/query-core": "4.35.3", - "use-sync-external-store": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.23", - "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.2.23.tgz", - "integrity": "sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.8", - "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.2.8.tgz", - "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmmirror.com/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", - "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/type-utils": "6.7.3", - "@typescript-eslint/utils": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.7.3.tgz", - "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", - "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/typescript-estree": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", - "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", - "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.3", - "@typescript-eslint/utils": "6.7.3", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", - "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.7.3.tgz", - "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/typescript-estree": "6.7.3", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.7.3", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", - "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.20.12", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", - "magic-string": "^0.27.0", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.1.0-beta.0" - } - }, - "node_modules/abi-wan-kanabi": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/abi-wan-kanabi/-/abi-wan-kanabi-1.0.3.tgz", - "integrity": "sha512-Xwva0AnhXx/IVlzo3/kwkI7Oa7ZX7codtcSn+Gmoa2PmjGPF/0jeVud9puasIPtB7V50+uBdUj4Mh3iATqtBvg==", - "peer": true, - "dependencies": { - "abi-wan-kanabi": "^1.0.1", - "fs-extra": "^10.0.0", - "rome": "^12.1.3", - "typescript": "^4.9.5", - "yargs": "^17.7.2" - }, - "bin": { - "generate": "dist/generate.js" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001541", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", - "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", - "dev": true - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.536", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.536.tgz", - "integrity": "sha512-L4VgC/76m6y8WVCgnw5kJy/xs7hXrViCFdNKVG8Y7B2isfwrFryFyJzumh3ugxhd/oB1uEaEEvRdmeLrnd7OFA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "peer": true - }, - "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmmirror.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", - "dev": true, - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "node_modules/get-starknet-core": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/get-starknet-core/-/get-starknet-core-3.2.0.tgz", - "integrity": "sha512-SZhxtLlKoPKLZ2H3l9WIU7CiNmkL3qLWGksALmvZdAXa/9PykYfLtvIB5B8A2UZMpf2ojTZlWLfuo1KhgmVobA==", - "peer": true, - "peerDependencies": { - "starknet": "^5.18.0" - }, - "peerDependenciesMeta": { - "starknet": { - "optional": false - } - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "peer": true, - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lossless-json": { - "version": "2.0.11", - "resolved": "https://registry.npmmirror.com/lossless-json/-/lossless-json-2.0.11.tgz", - "integrity": "sha512-BP0vn+NGYvzDielvBZaFain/wgeJ1hTvURCqtKvhr1SCPePdaaTanmmcplrHfEJSJOUql7hk4FHwToNJjWRY3g==", - "peer": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "peer": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rome": { - "version": "12.1.3", - "resolved": "https://registry.npmmirror.com/rome/-/rome-12.1.3.tgz", - "integrity": "sha512-e+ff72hxDpe/t5/Us7YRBVw3PBET7SeczTQNn6tvrWdrCaAw3qOukQQ+tDCkyFtS4yGsnhjrJbm43ctNbz27Yg==", - "hasInstallScript": true, - "peer": true, - "bin": { - "rome": "bin/rome" - }, - "engines": { - "node": ">=14.*" - }, - "optionalDependencies": { - "@rometools/cli-darwin-arm64": "12.1.3", - "@rometools/cli-darwin-x64": "12.1.3", - "@rometools/cli-linux-arm64": "12.1.3", - "@rometools/cli-linux-x64": "12.1.3", - "@rometools/cli-win32-arm64": "12.1.3", - "@rometools/cli-win32-x64": "12.1.3" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/starknet": { - "version": "5.19.5", - "resolved": "https://registry.npmmirror.com/starknet/-/starknet-5.19.5.tgz", - "integrity": "sha512-S7V4ifyYd+ApsIwYTd7YA5U2Px+NZkCsQPnmgY/wkc5LLFKhYMNpzHQ5nIA15p70AwtSXCcsEBnHNRBOuci13Q==", - "peer": true, - "dependencies": { - "@noble/curves": "~1.2.0", - "@scure/starknet": "~0.3.0", - "abi-wan-kanabi": "^1.0.3", - "isomorphic-fetch": "^3.0.0", - "lossless-json": "^2.0.8", - "pako": "^2.0.4", - "url-join": "^4.0.1" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "peer": true - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "peer": true - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-checker": { - "version": "0.5.6", - "resolved": "https://registry.npmmirror.com/vite-plugin-checker/-/vite-plugin-checker-0.5.6.tgz", - "integrity": "sha512-ftRyON0gORUHDxcDt2BErmsikKSkfvl1i2DoP6Jt2zDO9InfvM6tqO1RkXhSjkaXEhKPea6YOnhFaZxW3BzudQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "ansi-escapes": "^4.3.0", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "commander": "^8.0.0", - "fast-glob": "^3.2.7", - "fs-extra": "^11.1.0", - "lodash.debounce": "^4.0.8", - "lodash.pick": "^4.4.0", - "npm-run-path": "^4.0.1", - "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", - "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^3.0.2" - }, - "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "eslint": ">=7", - "meow": "^9.0.0", - "optionator": "^0.9.1", - "stylelint": ">=13", - "typescript": "*", - "vite": ">=2.0.0", - "vls": "*", - "vti": "*", - "vue-tsc": "*" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "meow": { - "optional": true - }, - "optionator": { - "optional": true - }, - "stylelint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vls": { - "optional": true - }, - "vti": { - "optional": true - }, - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/vite-plugin-checker/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite-plugin-checker/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vite-plugin-checker/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/vite-plugin-checker/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/vite-plugin-checker/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/vite-plugin-checker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite-plugin-checker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "dev": true, - "engines": { - "node": ">=8.0.0 || >=10.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" - }, - "engines": { - "vscode": "^1.52.0" - } - }, - "node_modules/vscode-languageclient/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vscode-languageclient/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vscode-languageclient/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dev": true, - "dependencies": { - "vscode-languageserver-protocol": "3.16.0" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dev": true, - "dependencies": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.11", - "resolved": "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", - "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", - "dev": true - }, - "node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", - "dev": true - }, - "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "peer": true - }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", - "peer": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "peer": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/zod": { - "version": "3.22.2", - "resolved": "https://registry.npmmirror.com/zod/-/zod-3.22.2.tgz", - "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==" - } - } -} diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index a01afc9..8f46a76 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -41,10 +41,6 @@ const ButtonClick = () => { () => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", [], ); - const avnu_address = useMemo( - () => "0x07e36202ace0ab52bf438bd8a8b64b3731c48d09f0d8879f5b006384c2f35032", - [], - ); const simple_swapper = useMemo( () => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", [], @@ -128,24 +124,6 @@ const ButtonClick = () => { }, [account,nftForWithdraw]); - - const handleSwapFromERC1155ToERC20ByAVNU = useCallback(async () => { - if (!account) return; - - const params = { - erc1155AmountIn: erc1155AmountForSwap, - minERC20AmountOut: 1313331313, - aggregatorAddress: avnu_address, - userAddress: account.address, - fee: FeeAmount.LOWEST, - slippage: 0.99, - currentPrice: currentPrice, - }; - const { transaction_hash } = - await wrap.swapFromERC1155ToERC20ByAVNU(params); - console.log(transaction_hash); - }, [account, erc1155AmountForSwap, currentPrice, avnu_address]); - const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(async () => { if (!account) return; @@ -163,7 +141,7 @@ const ButtonClick = () => { params, ); console.log(transaction_hash); - }, [account, erc1155AmountForSwap, currentPrice, avnu_address]); + }, [account, erc1155AmountForSwap, currentPrice]); const handleSwapFromERC20ToERC1155BySimpleSwap = useCallback(async () => { if (!account) return; @@ -182,7 +160,7 @@ const ButtonClick = () => { params, ); console.log(transaction_hash); - }, [account, erc20AmountForSwap, currentPrice, avnu_address]); + }, [account, erc20AmountForSwap, currentPrice]); const handleSwapFromWGoldToWSliverBySimpleSwap = useCallback(async () => { if (!account) return; @@ -201,7 +179,7 @@ const ButtonClick = () => { params, ); console.log(transaction_hash); - }, [account, wGoldForSwap, currentPrice, avnu_address]); + }, [account, wGoldForSwap, currentPrice]); const mayInitializePool = useCallback(async () => { const initialize_tick = { diff --git a/sdk/packages/instaswap-core/src/wrap.test.ts b/sdk/packages/instaswap-core/src/wrap.test.ts deleted file mode 100644 index 2c34004..0000000 --- a/sdk/packages/instaswap-core/src/wrap.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -// import { -// Account, -// Contract, -// DeclareDeployUDCResponse, -// DeployTransactionReceiptResponse, -// Provider, -// TransactionType, -// cairo, -// contractClassResponseToLegacyCompiledContract, -// ec, -// extractContractHashes, -// hash, -// num, -// parseUDCEvent, -// shortString, -// stark, -// constants -// } from 'starknet'; -// import {describe, expect, test, beforeAll} from '@jest/globals'; - -// import {Wrap} from './wrap'; - -// const { cleanHex, hexToDecimalString, toBigInt, toHex } = num; -// const { encodeShortString } = shortString; -// const { randomAddress } = stark; -// const { uint256 } = cairo; -// const { Signature } = ec.starkCurve; - -// const DEFAULT_TEST_ACCOUNT_ADDRESS = -// '0x41a44af91dce40db477e72b1c69ee440333b70acca5d973644ed2f9983d8990'; -// const DEFAULT_TEST_ACCOUNT_PUBLIC_KEY = '0x61e0c11613e66dd0364c2fca21db1c728e8d6b4e8a57a8a128755dd17b4a9b2'; -// const DEFAULT_TEST_ACCOUNT_PRIVATE_KEY = '0x69cb61a345cbb5b67f134a931eacede43d6c07407bb6384a15f663159bb184f'; - -// const erc1155_address = "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6"; -// const werc20_address = "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4"; -// const eth_address = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"; -// const ekubo_nft_address = "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc"; -// describe('deploy and test Wallet', () => { -// let testAccountAddress = DEFAULT_TEST_ACCOUNT_ADDRESS; -// let testAccountPrivateKey = DEFAULT_TEST_ACCOUNT_PRIVATE_KEY; -// const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); -// const account = new Account(provider, toHex(testAccountAddress), testAccountPrivateKey, '0'); - -// let wrap = new Wrap( -// erc1155_address, -// werc20_address, -// eth_address, -// ekubo_nft_address -// ); - -// test('test add liquidity', async () => { -// const { transaction_hash } = await account.execute(wrap.addLiquidity(1)); -// const receipt = await account.waitForTransaction(transaction_hash); - -// }); - -// }); diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 3935d81..4333d10 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -13,14 +13,12 @@ import { import ERC1155 from "./abi/erc1155-abi.json"; import Quoter from "./abi/quoter-abi.json"; import { - AVNU_SQRT_RATIO, FeeAmount, MAX_SQRT_RATIO, MIN_SQRT_RATIO, SwapDirection, } from "./constants"; import { - AVNUSwapParams, Config, LiquidityParams, SimpleSwapParams, @@ -128,20 +126,6 @@ export class Wrap { }; } - private static createWERC20ApproveCall( - spender: string, - amount: BigNumberish, - ): Call { - return { - contractAddress: Wrap.WERC20Address, - entrypoint: "approve", - calldata: CallData.compile({ - spender: spender, - amount: cairo.uint256(amount), - }), - }; - } - private static checkAccount() { if (!Wrap.account) { throw new Error("slippage should be between 0 and 1"); @@ -295,56 +279,6 @@ export class Wrap { return await this.swapFromERC20ToERC1155(params); }; - public swapFromERC1155ToERC20ByAVNU = async ( - params: AVNUSwapParams, - ): Promise => { - if (params.slippage < 0 || params.slippage > 1) { - throw new Error("slippage should be between 0 and 1"); - } - - const werc20AmountIn = - BigInt(params.erc1155AmountIn.toString()) * BigInt(10 ** 18); - - /** - * swap - */ - const multiRouteSwap: Call = { - contractAddress: params.aggregatorAddress, - entrypoint: "multi_route_swap", - calldata: CallData.compile({ - token_from_address: Wrap.WERC20Address, - token_from_amount: cairo.uint256(werc20AmountIn), - token_to_address: Wrap.ERC20Address, - token_to_amount: cairo.uint256(params.minERC20AmountOut), // this is useless in avnu contract - token_to_min_amount: cairo.uint256(params.minERC20AmountOut), - beneficiary: params.userAddress, - integrator_fee_amount_bps: 0, - integrator_fee_recipient: 0, - routes: [ - { - token_from: Wrap.WERC20Address, - token_to: Wrap.ERC20Address, - exchange_address: Wrap.EkuboCoreAddress, - percent: 100, - additional_swap_params: [ - Wrap.SortedTokens[0], - Wrap.SortedTokens[1], - Wrap.getFeeX128(params.fee), //fee for determin the pool_key - 200, // tick_spacing for determin the pool_key - 0, // extension for determin the pool_key - AVNU_SQRT_RATIO, //sqrt_ratio_limit - ], - }, - ], - }), - }; - return Wrap.account.execute([ - Wrap.ERC1155ApproveCall, - Wrap.createDepositCall(Wrap.WERC20Address, params.erc1155AmountIn), - Wrap.createWERC20ApproveCall(params.aggregatorAddress, werc20AmountIn), - multiRouteSwap, - ]); - }; public swapFromERC1155ToERC20 = async ( params: SimpleSwapParams, From d5f52d0029f27c1e0cf48d3f8ea968506b137825 Mon Sep 17 00:00:00 2001 From: felix Date: Sat, 4 Nov 2023 20:12:01 +0800 Subject: [PATCH 37/42] feat: add nft address --- examples/interface/src/components/ButtonClick.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 8f46a76..4668f4b 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -49,6 +49,10 @@ const ButtonClick = () => { () => "0x042aa743335663ed9c7b52b331ab7f81cc8d65280d311506653f9b5cc22be7cb", [], ); + const nft_address = useMemo( + () => "0x1090e3cfd9990c396f246cd1d5c7fb091905cba9f99739653db1f2960a3311f", + [], + ); const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI }, }); From 0a963c3068853d27f4f22efadb6be9acf2559c7e Mon Sep 17 00:00:00 2001 From: huyao Date: Tue, 7 Nov 2023 21:33:13 +0800 Subject: [PATCH 38/42] add starknet.js & get-starknent for build bun on ubuntu --- examples/interface/package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/interface/package.json b/examples/interface/package.json index 3963dee..3969957 100644 --- a/examples/interface/package.json +++ b/examples/interface/package.json @@ -9,19 +9,22 @@ "preview": "vite preview" }, "dependencies": { + "@bibliothecadao/instaswap-core": "link:instaswap/packages/instaswap-core", "@starknet-react/core": "^1.0.1", + "get-starknet": "^3.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "@bibliothecadao/instaswap-core": "link:instaswap/packages/instaswap-core" + "starknet": "next" }, "devDependencies": { "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", "@typescript-eslint/eslint-plugin": "^6.7.3", "@vitejs/plugin-react": "^3.1.0", + "bun-types": "^1.0.8", "eslint": "^8.26.0", "eslint-plugin-react": "^7.31.4", - "typescript": "^4.9.3", + "typescript": "^5.2.2", "vite": "^4.1.0", "vite-plugin-checker": "^0.5.1" } From bb9c5a75845b5f9ebf4bcaadd9556f0bbec1a97d Mon Sep 17 00:00:00 2001 From: huyao Date: Wed, 8 Nov 2023 16:09:57 +0800 Subject: [PATCH 39/42] add remove liquidity method for sdk --- .../interface/src/components/ButtonClick.tsx | 56 +++++++++++------- sdk/packages/instaswap-core/src/wrap.ts | 58 ++++++++++++++++++- 2 files changed, 90 insertions(+), 24 deletions(-) diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 4668f4b..fce657d 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -18,6 +18,8 @@ const ButtonClick = () => { const [erc20AmountForSwap, setERC20AmountForSwap] = useState(0); const [wGoldForSwap, setWGoldForSwap] = useState(0); const [nftForWithdraw, setNftForWithdraw] = useState(0); + const [positionId, setPositionId] = useState(0); + const [liquidity, setLiquidity] = useState(0); const erc1155_address = useMemo( () => "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", @@ -41,6 +43,7 @@ const ButtonClick = () => { () => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", [], ); + const simple_swapper = useMemo( () => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", [], @@ -120,12 +123,10 @@ const ButtonClick = () => { }, [account, lowerBound, upperBound, ethAmount, erc1155Amount]); - const withdraw = useCallback(async () => { const { transaction_hash } = await wrap.withdraw(nftForWithdraw); console.log(transaction_hash); - - }, [account,nftForWithdraw]); + }, [account, nftForWithdraw]); const handleSwapFromERC1155ToERC20BySimpleSwap = useCallback(async () => { @@ -166,24 +167,15 @@ const ButtonClick = () => { console.log(transaction_hash); }, [account, erc20AmountForSwap, currentPrice]); - const handleSwapFromWGoldToWSliverBySimpleSwap = useCallback(async () => { + const withdrawLiquidity = useCallback(async () => { if (!account) return; - // debugger; - const params = { - amountIn: 0.001 * 10 ** 18, - minERC20AmountOut: 1313331313, - simpleSwapperAddress: simple_swapper, - userAddress: account.address, - fee: FeeAmount.LOWEST, - slippage: 0.99, - }; - const { transaction_hash } = await wrap.swapSimple( - SwapDirection.ERC20_TO_ERC1155, - params, + const { transaction_hash } = await wrap.withdrawLiquidity( + positionId, + liquidity, ); console.log(transaction_hash); - }, [account, wGoldForSwap, currentPrice]); + }, [account, liquidity]); const mayInitializePool = useCallback(async () => { const initialize_tick = { @@ -198,10 +190,6 @@ const ButtonClick = () => { console.log(transaction_hash); }, [account, lowerBound, upperBound]); - - - - const mintERC1155Token = useCallback(async () => { if (!address) return; const call: Call = { @@ -242,6 +230,7 @@ const ButtonClick = () => {
+

Add Liquidity

@@ -287,6 +276,31 @@ const ButtonClick = () => { +
+

Withdraw Liquidity

+
+
+ + setPositionId(parseFloat(e.target.value))} + /> +
+
+ + setLiquidity(parseFloat(e.target.value))} + /> +
+
+ +
+ {/*
*/} {/*

Swap From ERC1155 to ERC20 By AVNU

*/} {/*
*/} diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index 4333d10..c80ad63 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -126,6 +126,20 @@ export class Wrap { }; } + private static createWERC20ApproveCall( + spender: string, + amount: BigNumberish, + ): Call { + return { + contractAddress: Wrap.WERC20Address, + entrypoint: "approve", + calldata: CallData.compile({ + spender: spender, + amount: cairo.uint256(amount), + }), + }; + } + private static checkAccount() { if (!Wrap.account) { throw new Error("slippage should be between 0 and 1"); @@ -221,7 +235,45 @@ export class Wrap { ]); }; - public withdraw = async (amount:BigNumberish): Promise => { + public withdrawLiquidity = async ( + id: number, + liquidity: BigNumberish, + ): Promise => { + const withdraw: Call = { + contractAddress: Wrap.EkuboPositionAddress, + entrypoint: "withdraw", + calldata: CallData.compile({ + id: id, + pool_key: { + token0: Wrap.SortedTokens[0], + token1: Wrap.SortedTokens[1], + fee: Wrap.getFeeX128(FeeAmount.LOWEST), + tick_spacing: 200, + extension: 0, + }, + bounds: { + lower: { + mag: 50000000n, + sign: 1, + }, + upper: { + mag: 50000000n, + sign: 0, + }, + }, + liquidity: liquidity, + min_token0: 0, + min_token1: 0, + collect_fees: 1, + }), + }; + + return Wrap.account.execute([withdraw]); + }; + + public withdraw = async ( + amount: BigNumberish, + ): Promise => { return Wrap.account.execute([ { contractAddress: Wrap.WERC20Address, @@ -229,9 +281,9 @@ export class Wrap { calldata: CallData.compile({ amount: cairo.uint256(amount), }), - } + }, ]); - } + }; public quoteSingle = async ( fee: FeeAmount, From aaf2da79d1e989ee2a9ad9c7cb22a0d25ac2f190 Mon Sep 17 00:00:00 2001 From: huyao Date: Wed, 8 Nov 2023 16:16:06 +0800 Subject: [PATCH 40/42] remove expired functions --- sdk/packages/instaswap-core/src/wrap.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/sdk/packages/instaswap-core/src/wrap.ts b/sdk/packages/instaswap-core/src/wrap.ts index c80ad63..f383ee4 100644 --- a/sdk/packages/instaswap-core/src/wrap.ts +++ b/sdk/packages/instaswap-core/src/wrap.ts @@ -126,20 +126,6 @@ export class Wrap { }; } - private static createWERC20ApproveCall( - spender: string, - amount: BigNumberish, - ): Call { - return { - contractAddress: Wrap.WERC20Address, - entrypoint: "approve", - calldata: CallData.compile({ - spender: spender, - amount: cairo.uint256(amount), - }), - }; - } - private static checkAccount() { if (!Wrap.account) { throw new Error("slippage should be between 0 and 1"); From c18ca3df48e4a6a9f93c8a6c6b64abd194026cac Mon Sep 17 00:00:00 2001 From: huyao Date: Mon, 20 Nov 2023 18:04:09 +0800 Subject: [PATCH 41/42] add list_liquidity api for indexer & add readme for indexer/sdk --- .prettierrc | 1 + README.md | 118 ++++++++++++++++++++++++++++- graphql/README.md | 83 ++++++++++++++++++++ graphql/graph/generated.go | 122 ++++++++++++++++++++++++++++++ graphql/graph/model/models_gen.go | 2 +- graphql/graph/schema.graphqls | 1 + graphql/graph/schema.resolvers.go | 20 ++++- graphql/graph/utils/utils.go | 13 ++++ package.json | 5 ++ 9 files changed, 358 insertions(+), 7 deletions(-) create mode 100644 .prettierrc create mode 100644 graphql/graph/utils/utils.go create mode 100644 package.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/README.md b/README.md index cc57979..c9519be 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,117 @@ -## InstaSwap +# InstaSwap + +### initialize sdk + +To initialize sdk,fill the config first + +```js + +import { Provider, constants } from "starknet"; +import { useAccount } from "@starknet-react/core"; +.... + +const provider = new Provider({ + sequencer: { network: constants.NetworkName.SN_GOERLI }, + }); + +const config = { + erc1155Address: "0x03467674358c444d5868e40b4de2c8b08f0146cbdb4f77242bd7619efcf3c0a6", + werc20Address: "0x06b09e4c92a08076222b392c77e7eab4af5d127188082713aeecbe9013003bf4", + erc20Address: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + ekuboPositionAddress: "0x73fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc", + ekuboCoreAddress: "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", + quoterAddress: "0x042aa743335663ed9c7b52b331ab7f81cc8d65280d311506653f9b5cc22be7cb", + provider: provider, + account: useAccount(), +}; + +const wrap = new Wrap(config); +... +``` + +### Initialize pool + +```js +const initialize_tick = { mag: 0n, sign: false }; + +const { transaction_hash } = await wrap.mayInitializePool( + FeeAmount.LOWEST, + initialize_tick, +); +``` + +### Add liquidity + +```js +const params = { + erc1155Amount: [erc1155 amount], + erc20Amount: [erc20 amount], + fee: [fee], + lowerPrice: [lowerBound], + upperPrice: [upperBound], + }; + +wrap.addLiquidity(params); + +``` + + + +### Withdraw Liquidity + +```js +wrap.withdrawLiquidity(positionId,liquidity); +``` + + + + +### Simple wrap + +- from erc115 to erc20 + +```js + +const params = { + amountIn: [erc1155 amount for swap], + minERC20AmountOut: [min amount], + simpleSwapperAddress: [simple swapper address], + userAddress:[user address], + fee: [fee], + slippage: [slippage], +}; + +wrap.swapSimple( + SwapDirection.ERC1155_TO_ERC20, + params, +); + + +``` + +- from erc20 to erc1155 + +```js + const params = { + amountIn: [erc20 amount for swap], + minERC20AmountOut: [min amount], + simpleSwapperAddress: [simple swapper address], + userAddress:[user address], + fee: [fee], + slippage: [slippage], +}; + +wrap.swapSimple( + SwapDirection.ERC20_TO_ERC1155, + params, +); + +``` + +### Withdraw erc1155 + +```js +wrap.withdraw(erc1155Num); +``` + -## \ No newline at end of file diff --git a/graphql/README.md b/graphql/README.md index d7de409..3dcd45f 100644 --- a/graphql/README.md +++ b/graphql/README.md @@ -22,5 +22,88 @@ copy the config example file,then replace the database information then visit http://localhost:8088/ for GraphQL playground +## Queries + +```graphql +query getPoolKeys { + pool_keys{ + fee + key_hash + token0 + token1 + tick_spacing + extension + } +} + +query getPoolKeyByHash { + pool_key( + key_hash: "[hash]" + ) { + fee + key_hash + token0 + token1 + tick_spacing + extension + } +} + +query getPositionDeposits { + position_deposits { + block_number + transaction_index + event_index + transaction_hash + token_id + lower_bound + upper_bound + pool_key_hash + liquidity + delta0 + delta1 + } +} + + +query getPositionDepositByHash { + position_deposit(transaction_hash:"[hash]") { + block_number + transaction_index + event_index + transaction_hash + token_id + lower_bound + upper_bound + pool_key_hash + liquidity + delta0 + delta1 + } +} + + +query getSwapByHash { + swap(transaction_hash:"[hash]") { + transaction_index + event_index + transaction_hash + locker + pool_key_hash + delta0 + delta1 + sqrt_ratio_after + tick_after + liquidity_after + } +} + + +query getListLiquidity { + list_liquidity(account:"0x0112C1E020708b84aaC85983734A6ffB5fCe89891e8414e4E54F94CE75c06a90"){ + token_id + } +} +``` diff --git a/graphql/graph/generated.go b/graphql/graph/generated.go index 9af4aad..b61bf41 100644 --- a/graphql/graph/generated.go +++ b/graphql/graph/generated.go @@ -80,6 +80,7 @@ type ComplexityRoot struct { } Query struct { + ListLiquidity func(childComplexity int, account string) int PoolKey func(childComplexity int, keyHash string) int PoolKeys func(childComplexity int) int PositionDeposit func(childComplexity int, transactionHash string) int @@ -109,6 +110,7 @@ type QueryResolver interface { PoolKey(ctx context.Context, keyHash string) (*model.PoolKey, error) PositionTransfers(ctx context.Context) ([]*model.PositionTransfer, error) PositionTransfer(ctx context.Context, transactionHash string) (*model.PositionTransfer, error) + ListLiquidity(ctx context.Context, account string) ([]*model.PositionTransfer, error) PositionDeposits(ctx context.Context) ([]*model.PositionDeposit, error) PositionDeposit(ctx context.Context, transactionHash string) (*model.PositionDeposit, error) Swap(ctx context.Context, transactionHash string) (*model.Swap, error) @@ -301,6 +303,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.PositionTransfer.TransactionIndex(childComplexity), true + case "Query.list_liquidity": + if e.complexity.Query.ListLiquidity == nil { + break + } + + args, err := ec.field_Query_list_liquidity_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.ListLiquidity(childComplexity, args["account"].(string)), true + case "Query.pool_key": if e.complexity.Query.PoolKey == nil { break @@ -570,6 +584,21 @@ func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs return args, nil } +func (ec *executionContext) field_Query_list_liquidity_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["account"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("account")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["account"] = arg0 + return args, nil +} + func (ec *executionContext) field_Query_pool_key_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -1955,6 +1984,77 @@ func (ec *executionContext) fieldContext_Query_position_transfer(ctx context.Con return fc, nil } +func (ec *executionContext) _Query_list_liquidity(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_list_liquidity(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().ListLiquidity(rctx, fc.Args["account"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*model.PositionTransfer) + fc.Result = res + return ec.marshalNPositionTransfer2ᚕᚖgithubᚗcomᚋmetaforoᚋindexerᚑgraphqlᚋgraphᚋmodelᚐPositionTransferᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_list_liquidity(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "block_number": + return ec.fieldContext_PositionTransfer_block_number(ctx, field) + case "transaction_index": + return ec.fieldContext_PositionTransfer_transaction_index(ctx, field) + case "event_index": + return ec.fieldContext_PositionTransfer_event_index(ctx, field) + case "transaction_hash": + return ec.fieldContext_PositionTransfer_transaction_hash(ctx, field) + case "token_id": + return ec.fieldContext_PositionTransfer_token_id(ctx, field) + case "from_address": + return ec.fieldContext_PositionTransfer_from_address(ctx, field) + case "to_address": + return ec.fieldContext_PositionTransfer_to_address(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PositionTransfer", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_list_liquidity_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query_position_deposits(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_position_deposits(ctx, field) if err != nil { @@ -4864,6 +4964,28 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "list_liquidity": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_list_liquidity(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "position_deposits": field := field diff --git a/graphql/graph/model/models_gen.go b/graphql/graph/model/models_gen.go index 48d0c12..199cf3a 100644 --- a/graphql/graph/model/models_gen.go +++ b/graphql/graph/model/models_gen.go @@ -12,7 +12,7 @@ type PoolKey struct { } type PositionDeposit struct { - tableName struct{} `pg:"position_deposit"` + tableName struct{} `pg:"position_deposit"` BlockNumber *int `json:"block_number,omitempty"` TransactionIndex *int `json:"transaction_index,omitempty"` EventIndex *int `json:"event_index,omitempty"` diff --git a/graphql/graph/schema.graphqls b/graphql/graph/schema.graphqls index b36a360..a0198f4 100644 --- a/graphql/graph/schema.graphqls +++ b/graphql/graph/schema.graphqls @@ -58,6 +58,7 @@ type Query { pool_key(key_hash: String!): PoolKey! position_transfers:[PositionTransfer!]! position_transfer(transaction_hash: String!):PositionTransfer + list_liquidity(account: String!):[PositionTransfer!]! position_deposits:[PositionDeposit!]! position_deposit(transaction_hash: String!): PositionDeposit swap(transaction_hash: String!):Swap! diff --git a/graphql/graph/schema.resolvers.go b/graphql/graph/schema.resolvers.go index c60918d..9de9afe 100644 --- a/graphql/graph/schema.resolvers.go +++ b/graphql/graph/schema.resolvers.go @@ -7,6 +7,7 @@ package graph import ( "context" "github.com/metaforo/indexer-graphql/graph/model" + "github.com/metaforo/indexer-graphql/graph/utils" ) // PoolKeys is the resolver for the pool_keys field. @@ -24,7 +25,7 @@ func (r *queryResolver) PoolKeys(ctx context.Context) ([]*model.PoolKey, error) func (r *queryResolver) PoolKey(ctx context.Context, keyHash string) (*model.PoolKey, error) { pool_key := &model.PoolKey{} - err := r.DB.Model(pool_key).Where("key_hash=?", keyHash).Select() + err := r.DB.Model(pool_key).Where("key_hash=?", utils.Hex2BigNum(keyHash)).Select() if err != nil { return nil, err } @@ -46,13 +47,24 @@ func (r *queryResolver) PositionTransfers(ctx context.Context) ([]*model.Positio func (r *queryResolver) PositionTransfer(ctx context.Context, transactionHash string) (*model.PositionTransfer, error) { position_transfer := &model.PositionTransfer{} - err := r.DB.Model(position_transfer).Where("transaction_hash=?", transactionHash).Select() + err := r.DB.Model(position_transfer).Where("transaction_hash=?", utils.Hex2BigNum(transactionHash)).Select() if err != nil { return nil, err } return position_transfer, nil } +// ListLiquidity is the resolver for the list_liquidity field. +func (r *queryResolver) ListLiquidity(ctx context.Context, account string) ([]*model.PositionTransfer, error) { + var position_transfers []*model.PositionTransfer + + err := r.DB.Model(&position_transfers).Where("to_address=?",utils.Hex2BigNum(account)).Select() + if err != nil { + return nil, err + } + return position_transfers, nil +} + // PositionDeposits is the resolver for the position_deposits field. func (r *queryResolver) PositionDeposits(ctx context.Context) ([]*model.PositionDeposit, error) { var position_deposits []*model.PositionDeposit @@ -68,7 +80,7 @@ func (r *queryResolver) PositionDeposits(ctx context.Context) ([]*model.Position func (r *queryResolver) PositionDeposit(ctx context.Context, transactionHash string) (*model.PositionDeposit, error) { position_deposit := &model.PositionDeposit{} - err := r.DB.Model(position_deposit).Where("transaction_hash=?", transactionHash).Select() + err := r.DB.Model(position_deposit).Where("transaction_hash=?", utils.Hex2BigNum(transactionHash)).Select() if err != nil { return nil, err } @@ -79,7 +91,7 @@ func (r *queryResolver) PositionDeposit(ctx context.Context, transactionHash str func (r *queryResolver) Swap(ctx context.Context, transactionHash string) (*model.Swap, error) { swap := &model.Swap{} - err := r.DB.Model(swap).Where("transaction_hash=?", transactionHash).Select() + err := r.DB.Model(swap).Where("transaction_hash=?", utils.Hex2BigNum(transactionHash)).Select() if err != nil { return nil, err } diff --git a/graphql/graph/utils/utils.go b/graphql/graph/utils/utils.go new file mode 100644 index 0000000..c626d61 --- /dev/null +++ b/graphql/graph/utils/utils.go @@ -0,0 +1,13 @@ +package utils + +import "math/big" + +func Hex2BigNum(hexStr string)string{ + if len(hexStr) > 2 && hexStr[:2] == "0x" { + hexStr = hexStr[2:] + } + + bigNum := new(big.Int) + bigNum.SetString(hexStr, 16) + return bigNum.String() +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..debdc5f --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "prettier": "3.0.3" + } +} From efb24a5d54a71b4a1da1cbbfe2ead04f49bf2168 Mon Sep 17 00:00:00 2001 From: huyao Date: Mon, 20 Nov 2023 20:25:17 +0800 Subject: [PATCH 42/42] Update README.md --- graphql/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/graphql/README.md b/graphql/README.md index 3dcd45f..9888e7f 100644 --- a/graphql/README.md +++ b/graphql/README.md @@ -1,5 +1,9 @@ # indexer-graphql +This is a GraphQL API for querying indexed Ekubo events. + +Please follow the Ekubo indexer instructions to build the events database. https://github.com/EkuboProtocol/indexer + ## How to start ### step 1
diff --git a/sdk/bun.lockb b/sdk/bun.lockb index 7f59dcfd11f8ce93660ed9184bf8181370f74d9f..e5c314a41fb8b2127eb9fe38b6decb923343c681 100755 GIT binary patch delta 27311 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 W)1Pfr+eRBzK2Y_Z-tKkhs{aF6Wj4M5 delta 30639 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 f*BW)jrt8 a.address.localeCompare(b.address)); - // public deposit = async (amount: bigint) => { - // // TODO: implement - // } + Wrap.ERC1155ApproveCall = { + contractAddress: Wrap.ERC1155Contract.address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Contract.address, + approved: num.toCairoBool(true) + }) + }; - // public withdraw = async (amount: bigint) => { - // // - // } - public static closestTick(tick: number): bigint { - let t = 200n; - let tick2 = BigInt(tick); - let closestTick = tick2 - (tick2 % t); - return closestTick; + Wrap.CancelERC1155ApproveCall = { + contractAddress: Wrap.ERC1155Contract.address, + entrypoint: "setApprovalForAll", + calldata: CallData.compile({ + operator: Wrap.WERC20Contract.address, + approved: num.toCairoBool(false) + }) + }; - + Decimal.set({ precision: 78 }); } - public addLiquidity(erc1155Amount: BigNumberish, erc20Amount: BigNumberish, fee: FeeAmount, lowerPrice: number, upperPrice: number): Call[] { - - // sort tokens - // TODO check length - const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + private static createDepositCall(contract:string,amount:BigNumberish):Call{ + return { + contractAddress: contract, + entrypoint: "deposit", + calldata: CallData.compile({ + amount: cairo.uint256(amount) + }) + } + } - const approveForAll: Call = { - contractAddress: Wrap.ERC1155Contract.address, - entrypoint: "setApprovalForAll", + private static createTransferCall(contract:string,recipient:string,amount:BigNumberish):Call{ + return { + contractAddress: contract, + entrypoint: "transfer", calldata: CallData.compile({ - operator: Wrap.WERC20Contract.address, - approved: num.toCairoBool(true) + recipient: recipient, + amount: cairo.uint256(amount) // wrap token has 18 decimals }) } + } - // wrap token - const depositToWERC20: Call = { - contractAddress: Wrap.WERC20Contract.address, - entrypoint: "deposit", + + private static createClearCall(contract:string,token:string):Call{ + return { + contractAddress: contract, + entrypoint: "clear", calldata: CallData.compile({ - amount: cairo.uint256(erc1155Amount) + token: token }) } + } - // transfer werc20 - const transferWERC20: Call = { + private static createWERC20ApproveCall(spender:string,amount:BigNumberish):Call{ + return { contractAddress: Wrap.WERC20Contract.address, - entrypoint: "transfer", + entrypoint: "approve", calldata: CallData.compile({ - recipient: Wrap.EkuboPosition.address, - amount: cairo.uint256(BigInt(erc1155Amount) * (BigInt(10) ** BigInt(18))) // wrap token has 18 decimals + spender: spender, + amount: cairo.uint256(amount) }) } - // transfer erc20 - const transferERC20: Call = { - contractAddress: Wrap.ERC20Contract.address, - entrypoint: "transfer", + } + + + + public mayInitializePool(fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { + + const mayInitializePool: Call = { + contractAddress: Wrap.EkuboCoreContract.address, + entrypoint: "maybe_initialize_pool", calldata: CallData.compile({ - recipient: Wrap.EkuboPosition.address, - amount: cairo.uint256(BigInt(erc20Amount)) + pool_key: { + token0: Wrap.SortedTokens[0].address, + token1: Wrap.SortedTokens[1].address, + fee: Wrap.getFeeX128(fee), + tick_spacing: 200, + extension: 0, + }, + initial_tick }) } - Decimal.set({ precision: 78 }); - let lowerSqrtRatioX128 = new Decimal(lowerPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); - let upperSqrtRatioX128 = new Decimal(upperPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); + + return [mayInitializePool]; + } + + public addLiquidity(params:LiquidityParams): Call[] { + + const lowerSqrtRatioX128 = new Decimal(params.lowerPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); + const upperSqrtRatioX128 = new Decimal(params.upperPrice).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); const lowerTick = TickMath.getTickAtSqrtRatio(BigInt(lowerSqrtRatioX128)); const upperTick = TickMath.getTickAtSqrtRatio(BigInt(upperSqrtRatioX128)); + if (lowerTick > upperTick) { throw new Error("lowerTick should be less than upperTick"); } - let absLowerTick = Math.abs(lowerTick); - let signLowerTick = lowerTick < 0 ? true : false; - let absUpperTick = Math.abs(upperTick); - let signUpperTick = upperTick < 0 ? true : false; - let tick = 50000000n; - let tmp = { - pool_key: { - token0: sortedTokens[0].address, - token1: sortedTokens[1].address, - fee: Wrap.getFeeX128(fee), - tick_spacing: 200, - extension: 0, - }, - bounds: { - lower: { - mag: tick, - sign: signLowerTick, - }, - upper: { - mag: tick, - sign: signUpperTick, - } - }, - min_liquidity: 2000, - }; - // mint_and_deposit + + /** + * create needed contract calls + * mint_and_deposit + */ const mintAndDeposit: Call = { contractAddress: Wrap.EkuboPosition.address, entrypoint: "mint_and_deposit", - calldata: CallData.compile(tmp) - } - // clear werc20 - const clearWERC20: Call = { - contractAddress: Wrap.EkuboPosition.address, - entrypoint: "clear", - calldata: CallData.compile({ - token: Wrap.WERC20Contract.address - }) - } - // clear erc20 - const clearERC20: Call = { - contractAddress: Wrap.EkuboPosition.address, - entrypoint: "clear", - calldata: CallData.compile({ - token: Wrap.ERC20Contract.address - }) - } - // cancel approval - const cancelApproval: Call = { - contractAddress: Wrap.ERC1155Contract.address, - entrypoint: "setApprovalForAll", - calldata: CallData.compile({ - operator: Wrap.WERC20Contract.address, - approved: num.toCairoBool(false) - }) + calldata: CallData.compile( + { + pool_key: { + token0: Wrap.SortedTokens[0].address, + token1: Wrap.SortedTokens[1].address, + fee: Wrap.getFeeX128(params.fee), + tick_spacing: 200, + extension: 0, + }, + bounds: { + lower: { + mag: 50000000n, + sign: lowerTick < 0, + }, + upper: { + mag: 50000000n, + sign: upperTick < 0, + } + }, + min_liquidity: 2000, + } + ) } - return [approveForAll, depositToWERC20, transferWERC20, transferERC20, mintAndDeposit, clearWERC20, clearERC20, cancelApproval]; + + return [ + Wrap.ERC1155ApproveCall, + Wrap.createDepositCall(Wrap.WERC20Contract.address,params.erc1155Amount), + Wrap.createTransferCall(Wrap.WERC20Contract.address,Wrap.EkuboPosition.address, + BigInt(params.erc1155Amount) * (BigInt(10) ** BigInt(18))), + Wrap.createTransferCall(Wrap.ERC20Contract.address,Wrap.EkuboPosition.address,BigInt(params.erc20Amount)), + mintAndDeposit, + Wrap.createClearCall(Wrap.EkuboPosition.address,Wrap.WERC20Contract.address), + Wrap.createClearCall(Wrap.EkuboPosition.address,Wrap.ERC20Contract.address), + Wrap.CancelERC1155ApproveCall + ]; } - public withdraw(id: number) { - // sort tokens - // TODO check length - const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); + public withdraw(id: number):Call[]{ + return []; + } + public swapBySimple(direction:SwapDirection,params:SimpleSwapParams){ + if (direction == SwapDirection.ERC1155_TO_ERC20){ + return this.swapFromERC1155ToERC20BySimpleSwapper(params); + } + return this.swapFromERC20ToERC1155BySimpleSwapper(params); } - public swapFromERC1155ToERC20ByAVNU(erc1155AmountIn: BigNumberish, minERC20AmountOut: BigNumberish, aggregatorAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { - // sort tokens - // TODO check length - const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); - if (slippage < 0 || slippage > 1) { + + public swapFromERC1155ToERC20ByAVNU(params:AVNUSwapParams):Call[] { + + if (params.slippage < 0 || params.slippage > 1) { throw new Error("slippage should be between 0 and 1"); } - const werc20AmountIn = BigInt(erc1155AmountIn.toString()) * BigInt(10 ** 18); - Decimal.set({ precision: 78 }); - let sqrtRatioLimitX128 = (Wrap.ERC20Contract.address < Wrap.WERC20Contract.address) ? new Decimal(currentPrice / 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0) : new Decimal(currentPrice * 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); - - const approveForAll: Call = { - contractAddress: Wrap.ERC1155Contract.address, - entrypoint: "setApprovalForAll", - calldata: CallData.compile({ - operator: Wrap.WERC20Contract.address, - approved: num.toCairoBool(true) - }) - } - // wrap token - const depositToWERC20: Call = { - contractAddress: Wrap.WERC20Contract.address, - entrypoint: "deposit", - calldata: CallData.compile({ - amount: cairo.uint256(erc1155AmountIn) - }) - } - // approve WERC20 - const approveWERC20: Call = { - contractAddress: Wrap.WERC20Contract.address, - entrypoint: "approve", - calldata: CallData.compile({ - spender: aggregatorAddress, - amount: cairo.uint256(werc20AmountIn) - }) - } - let tmp = { - token_from_address: Wrap.WERC20Contract.address, - token_from_amount: cairo.uint256(werc20AmountIn), - token_to_address: Wrap.ERC20Contract.address, - token_to_amount: cairo.uint256(minERC20AmountOut), // this is useless in avnu contract - token_to_min_amount: cairo.uint256(minERC20AmountOut), - beneficiary: userAddress, - integrator_fee_amount_bps: 0, - integrator_fee_recipient: 0, - routes: [ - { - token_from: Wrap.WERC20Contract.address, - token_to: Wrap.ERC20Contract.address, - exchange_address: Wrap.EkuboCoreContract.address, - percent: 100, - additional_swap_params: [ - sortedTokens[0].address, - sortedTokens[1].address, - Wrap.getFeeX128(fee), //fee for determin the pool_key - 200, // tick_spacing for determin the pool_key - 0, // extension for determin the pool_key - 363034526046013994104916607590000000000000000000001n //sqrt_ratio_limit - ], - } - ] - }; - // swap + + + const werc20AmountIn = BigInt(params.erc1155AmountIn.toString()) * BigInt(10 ** 18); + + /** + * swap + */ const multiRouteSwap: Call = { - contractAddress: aggregatorAddress, + contractAddress: params.aggregatorAddress, entrypoint: "multi_route_swap", - calldata: CallData.compile(tmp) + calldata: CallData.compile({ + token_from_address: Wrap.WERC20Contract.address, + token_from_amount: cairo.uint256(werc20AmountIn), + token_to_address: Wrap.ERC20Contract.address, + token_to_amount: cairo.uint256(params.minERC20AmountOut), // this is useless in avnu contract + token_to_min_amount: cairo.uint256(params.minERC20AmountOut), + beneficiary: params.userAddress, + integrator_fee_amount_bps: 0, + integrator_fee_recipient: 0, + routes: [ + { + token_from: Wrap.WERC20Contract.address, + token_to: Wrap.ERC20Contract.address, + exchange_address: Wrap.EkuboCoreContract.address, + percent: 100, + additional_swap_params: [ + Wrap.SortedTokens[0].address, + Wrap.SortedTokens[1].address, + Wrap.getFeeX128(params.fee), //fee for determin the pool_key + 200, // tick_spacing for determin the pool_key + 0, // extension for determin the pool_key + 363034526046013994104916607590000000000000000000001n//sqrt_ratio_limit + ], + } + ] + }) } - return [approveForAll, depositToWERC20, approveWERC20, multiRouteSwap]; + return [ + Wrap.ERC1155ApproveCall, + Wrap.createDepositCall(Wrap.WERC20Contract.address,params.erc1155AmountIn), + Wrap.createWERC20ApproveCall(params.aggregatorAddress,werc20AmountIn), + multiRouteSwap + ]; } - public swapFromERC1155ToERC20BySimpleSwapper(erc1155AmountIn: BigNumberish, minERC20AmountOut: BigNumberish, simpleSwapperAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { - // sort tokens - // TODO check length - const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); - if (slippage < 0 || slippage > 1) { + public swapFromERC1155ToERC20BySimpleSwapper(params:SimpleSwapParams):Call[] { + + if (params.slippage < 0 || params.slippage > 1) { throw new Error("slippage should be between 0 and 1"); } - const werc20AmountIn = BigInt(erc1155AmountIn.toString()) * BigInt(10 ** 18); - Decimal.set({ precision: 78 }); - let sqrtRatioLimitX128 = (Wrap.ERC20Contract.address < Wrap.WERC20Contract.address) ? new Decimal(currentPrice / 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0) : new Decimal(currentPrice * 300).sqrt().mul(new Decimal(2).pow(128)).toFixed(0); - - const approveForAll: Call = { - contractAddress: Wrap.ERC1155Contract.address, - entrypoint: "setApprovalForAll", - calldata: CallData.compile({ - operator: Wrap.WERC20Contract.address, - approved: num.toCairoBool(true) - }) - } - // wrap token - const depositToWERC20: Call = { - contractAddress: Wrap.WERC20Contract.address, - entrypoint: "deposit", - calldata: CallData.compile({ - amount: cairo.uint256(erc1155AmountIn) - }) - } - // transfer werc20 - const transferWERC20: Call = { - contractAddress: Wrap.WERC20Contract.address, - entrypoint: "transfer", - calldata: CallData.compile({ - recipient: simpleSwapperAddress, - amount: cairo.uint256(BigInt(erc1155AmountIn) * (BigInt(10 ** 18))) // wrap token has 18 decimals - }) - } - let isToken1 = !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? true : false; - let sqrt_ratio_limit = !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; - let tmp = { - pool_key: { - token0: sortedTokens[0].address, - token1: sortedTokens[1].address, - fee: Wrap.getFeeX128(fee), - tick_spacing: 200, - extension: 0, - }, - swap_params: { - amount: { - mag: werc20AmountIn, - sign: false - }, - is_token1: isToken1, - sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), - skip_ahead: 4294967295, - }, - recipient: userAddress, - calculated_amount_threshold: 0, - }; + + const werc20AmountIn = BigInt(params.amountIn.toString()) * BigInt(10 ** 18); + + + const sqrt_ratio_limit = !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; + // swap const simpleSwap: Call = { - contractAddress: simpleSwapperAddress, + contractAddress: params.simpleSwapperAddress, entrypoint: "swap", - calldata: CallData.compile(tmp) - } - const clearToken0: Call = { - contractAddress: simpleSwapperAddress, - entrypoint: "clear", calldata: CallData.compile({ - token: sortedTokens[0].address - }) - } - const clearToken1: Call = { - contractAddress: simpleSwapperAddress, - entrypoint: "clear", - calldata: CallData.compile({ - token: sortedTokens[1].address + pool_key: { + token0: Wrap.SortedTokens[0].address, + token1: Wrap.SortedTokens[1].address, + fee: Wrap.getFeeX128(params.fee), + tick_spacing: 200, + extension: 0, + }, + swap_params: { + amount: { + mag: werc20AmountIn, + sign: false + }, + is_token1: !(Wrap.ERC20Contract.address > Wrap.WERC20Contract.address), + sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), + skip_ahead: 4294967295, + }, + recipient: params.userAddress, + calculated_amount_threshold: 0, }) } - return [approveForAll, depositToWERC20, transferWERC20, simpleSwap, clearToken0, clearToken1]; + + return [ + Wrap.ERC1155ApproveCall, + Wrap.createDepositCall(Wrap.WERC20Contract.address,params.amountIn), + Wrap.createTransferCall(Wrap.WERC20Contract.address,params.simpleSwapperAddress, + BigInt(params.amountIn) * (BigInt(10 ** 18))), + simpleSwap, + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0].address), + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1].address), + ]; } - public swapFromERC20ToERC1155BySimpleSwapper(erc20AmountIn: BigNumberish, minERC1155AmountOut: BigNumberish, simpleSwapperAddress: string, userAddress: string, fee: FeeAmount, slippage: number, currentPrice: number) { - // sort tokens - // TODO check length - const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); - if (slippage < 0 || slippage > 1) { + public swapFromERC20ToERC1155BySimpleSwapper(params:SimpleSwapParams):Call[] { + if (params.slippage < 0 || params.slippage > 1) { throw new Error("slippage should be between 0 and 1"); } - - // transfer werc20 - const transferERC20: Call = { - contractAddress: Wrap.ERC20Contract.address, - entrypoint: "transfer", - calldata: CallData.compile({ - recipient: simpleSwapperAddress, - amount: cairo.uint256(erc20AmountIn) - }) - } - let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? true : false; - let sqrt_ratio_limit = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; - let tmp = { - pool_key: { - token0: sortedTokens[0].address, - token1: sortedTokens[1].address, - fee: Wrap.getFeeX128(fee), - tick_spacing: 200, - extension: 0, - }, - swap_params: { - amount: { - mag: erc20AmountIn, - sign: false - }, - is_token1: isToken1, - sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), - skip_ahead: 4294967295, - }, - recipient: userAddress, - calculated_amount_threshold: 0, - }; + + // let isToken1 = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address); + const sqrt_ratio_limit = (Wrap.ERC20Contract.address > Wrap.WERC20Contract.address) ? MAX_SQRT_RATIO : MIN_SQRT_RATIO; // swap const simpleSwap: Call = { - contractAddress: simpleSwapperAddress, + contractAddress: params.simpleSwapperAddress, entrypoint: "swap", - calldata: CallData.compile(tmp) - } - const clearToken0: Call = { - contractAddress: simpleSwapperAddress, - entrypoint: "clear", - calldata: CallData.compile({ - token: sortedTokens[0].address - }) - } - const clearToken1: Call = { - contractAddress: simpleSwapperAddress, - entrypoint: "clear", - calldata: CallData.compile({ - token: sortedTokens[1].address - }) - } - return [transferERC20, simpleSwap, clearToken0, clearToken1]; - } - - public mayInitializePool(fee: FeeAmount, initial_tick: { mag: BigNumberish, sign: boolean }): Call[] { - // sort tokens - // TODO check length - const sortedTokens: Contract[] = [Wrap.ERC20Contract, Wrap.WERC20Contract].sort((a, b) => a.address.localeCompare(b.address)); - - const mayInitializePool: Call = { - contractAddress: Wrap.EkuboCoreContract.address, - entrypoint: "maybe_initialize_pool", calldata: CallData.compile({ pool_key: { - token0: sortedTokens[0].address, - token1: sortedTokens[1].address, - fee: Wrap.getFeeX128(fee), + token0: Wrap.SortedTokens[0].address, + token1: Wrap.SortedTokens[1].address, + fee: Wrap.getFeeX128(params.fee), tick_spacing: 200, extension: 0, }, - initial_tick + swap_params: { + amount: { + mag: params.amountIn, + sign: false + }, + is_token1: Wrap.ERC20Contract.address > Wrap.WERC20Contract.address, + sqrt_ratio_limit: cairo.uint256(sqrt_ratio_limit), + skip_ahead: 4294967295, + }, + recipient: params.userAddress, + calculated_amount_threshold: 0, }) - } - return [mayInitializePool]; + }; + + + return [ + Wrap.createTransferCall(Wrap.ERC20Contract.address,params.simpleSwapperAddress,params.amountIn), + simpleSwap, + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[0].address), + Wrap.createClearCall(params.simpleSwapperAddress,Wrap.SortedTokens[1].address), + ]; } + + public static getFeeX128(fee: FeeAmount): bigint { - let feeX128 = BigInt(fee) * (2n ** 128n) / (10n ** 6n); - return feeX128; + return BigInt(fee) * (2n ** 128n) / (10n ** 6n); } public static getERC1155Balance = async (address: string, tokenId: BigNumberish): Promise => { const tokenIdCairo = cairo.uint256(tokenId); - const balance = await Wrap.ERC1155Contract.balance_of(address, tokenIdCairo); - return balance + return await Wrap.ERC1155Contract.balance_of(address, tokenIdCairo) } + public static closestTick(tick: number): bigint { + let t = 200n; + let tick2 = BigInt(tick); + return tick2 - (tick2 % t); + } + + + } From 5ea051d916664d424535653bbf9eadade6dde943 Mon Sep 17 00:00:00 2001 From: felix Date: Tue, 10 Oct 2023 23:18:10 +0800 Subject: [PATCH 30/42] feat: add price --- .../interface/src/components/ButtonClick.tsx | 20 +- .../instaswap-core/src/abi/quoter-abi.json | 274 ++++++++++++++++++ sdk/packages/instaswap-core/src/tickMath.ts | 92 +++--- sdk/packages/instaswap-core/src/wrap.ts | 69 ++++- 4 files changed, 386 insertions(+), 69 deletions(-) create mode 100644 sdk/packages/instaswap-core/src/abi/quoter-abi.json diff --git a/examples/interface/src/components/ButtonClick.tsx b/examples/interface/src/components/ButtonClick.tsx index 5adf71c..3cc805c 100644 --- a/examples/interface/src/components/ButtonClick.tsx +++ b/examples/interface/src/components/ButtonClick.tsx @@ -25,6 +25,7 @@ const ButtonClick = () => { const ekubo_core_address = useMemo(() => "0x031e8a7ab6a6a556548ac85cbb8b5f56e8905696e9f13e9a858142b8ee0cc221", []) const avnu_address = useMemo(() => "0x07e36202ace0ab52bf438bd8a8b64b3731c48d09f0d8879f5b006384c2f35032", []) const simple_swapper = useMemo(() => "0x064f7ed2dc5070133ae8ccdf85f01e82507facbe5cdde456e1418e3901dc51a0", []) + const quoter = useMemo(() => "0x042aa743335663ed9c7b52b331ab7f81cc8d65280d311506653f9b5cc22be7cb", []) const provider = new Provider({ sequencer: { network: constants.NetworkName.SN_GOERLI } }); let wrap = new Wrap( @@ -33,6 +34,7 @@ const ButtonClick = () => { eth_address, ekubo_position_address, ekubo_core_address, + quoter, provider ) const getERC1155Balance = useCallback(async () => { @@ -43,9 +45,11 @@ const ButtonClick = () => { const getCurrentPrice = useCallback(async () => { if (!address) return; - // let p = await Wrap.getCurrentPrice(); - // setCurrentPrice(p); - }, [address, erc1155_address]); + if (!account) return; + let p = await Wrap.quoteSingle(FeeAmount.LOWEST, eth_address, BigInt(10** 7), account); + let realPrice = p / (10 ** 7); + setCurrentPrice(realPrice); + }, [address, erc1155_address, account]); useEffect(() => { getERC1155Balance(); @@ -55,6 +59,14 @@ const ButtonClick = () => { return () => clearInterval(interval); }, [getERC1155Balance]); + useEffect(() => { + getCurrentPrice(); + const interval = setInterval(() => { + getCurrentPrice(); + }, 3000); + return () => clearInterval(interval); + }, [getCurrentPrice]); + const handleAddLiquidity = useCallback(() => { if (!account) return; const realERC1155Amount = erc1155Amount; @@ -114,7 +126,7 @@ const ButtonClick = () => {

ERC1155 Balance: {balance}