diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml new file mode 100644 index 00000000..74dd56ad --- /dev/null +++ b/.github/workflows/core.yml @@ -0,0 +1,39 @@ +name: Core + +on: + push: + paths: [packages/core/**] + pull_request: + paths: [packages/core/**] + +permissions: read-all + +jobs: + check: + defaults: + run: + working-directory: packages/core + + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '18' + + - name: Install dependencies + run: yarn install + working-directory: ./ + + - name: Lint + run: yarn lint + + - name: Test + run: yarn test + + - name: Build + run: yarn build diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml new file mode 100644 index 00000000..7c06b78f --- /dev/null +++ b/.github/workflows/frontend.yml @@ -0,0 +1,32 @@ +name: Frontend + +on: + push: + paths: [packages/core/**, packages/hooks/**, packages/frontend/**] + pull_request: + paths: [packages/core/**, packages/hooks/**, packages/frontend/**] + +permissions: read-all + +jobs: + check: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '18' + + - name: Install dependencies + run: yarn install + + - name: Lint + run: yarn lint + working-directory: packages/frontend + + - name: Build + run: yarn g:build diff --git a/.github/workflows/hooks.yml b/.github/workflows/hooks.yml new file mode 100644 index 00000000..36998105 --- /dev/null +++ b/.github/workflows/hooks.yml @@ -0,0 +1,44 @@ +name: Hooks + +on: + push: + paths: [packages/hooks/**] + pull_request: + paths: [packages/hooks/**] + +permissions: read-all + +jobs: + check: + defaults: + run: + working-directory: packages/hooks + + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '18' + + - name: Install dependencies + run: yarn install + working-directory: ./ + + # Core package is required for hooks to test and build + - name: Build Core + run: yarn build + working-directory: ./packages/core + + - name: Lint + run: yarn lint + + - name: Test + run: yarn test + + - name: Build Hooks + run: yarn build diff --git a/packages/core/package.json b/packages/core/package.json index 28aac697..280402f2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -34,12 +34,12 @@ "moment": "^2.30.1" }, "peerDependencies": { - "starknet": ">=5.0.0" + "starknet": ">=6.8.0" }, "devDependencies": { "@uniswap/eslint-config": "^1.2.0", "prettier": "^3.1.0", - "starknet": "5.24.3", + "starknet": "^6.18.0", "tsup": "^8.0.2", "typescript": "^5.4.5", "vitest": "^1.5.0" diff --git a/packages/core/src/constants/contracts.ts b/packages/core/src/constants/contracts.ts index a126e39d..e985e2c2 100644 --- a/packages/core/src/constants/contracts.ts +++ b/packages/core/src/constants/contracts.ts @@ -1,50 +1,51 @@ +import { MultichainAddress } from 'src/types' import { constants, json } from 'starknet' import EkuboPositions from '../abis/EkuboPositions.json' import JediswapPair from '../abis/JediswapPair.json' import Multicall from '../abis/Multicall.json' -export const TOKEN_CLASS_HASH = { - [constants.StarknetChainId.SN_GOERLI]: '0x05ba9aea47a8dd7073ab82b9e91721bdb3a2c1b259cffd68669da1454faa80ac', +export const TOKEN_CLASS_HASH: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x063ee878d3559583ceae80372c6088140e1180d9893aa65fbefc81f45ddaaa17', [constants.StarknetChainId.SN_MAIN]: '0x063ee878d3559583ceae80372c6088140e1180d9893aa65fbefc81f45ddaaa17', } -export const FACTORY_ADDRESSES = { - [constants.StarknetChainId.SN_GOERLI]: '0x076c3112e95994507c44c72b8dfb7f8d568a370d2f7c2d918ed9f55327671385', +export const FACTORY_ADDRESSES: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x06b5096ba5a3c30e231e7b74ca565594d167a0a22d71cce0ebf9ae2b06584097', [constants.StarknetChainId.SN_MAIN]: '0x01a46467a9246f45c8c340f1f155266a26a71c07bd55d36e8d1c7d0d438a2dbc', } -export const EKUBO_POSITIONS_ADDRESSES = { - [constants.StarknetChainId.SN_GOERLI]: '0x073fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc', +export const EKUBO_POSITIONS_ADDRESSES: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x06a2aee84bb0ed5dded4384ddd0e40e9c1372b818668375ab8e3ec08807417e5', [constants.StarknetChainId.SN_MAIN]: '0x02e0af29598b407c8716b17f6d2795eca1b471413fa03fb145a5e33722184067', } -export const ETH_ADDRESSES = { - [constants.StarknetChainId.SN_GOERLI]: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', +export const ETH_ADDRESSES: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', [constants.StarknetChainId.SN_MAIN]: '0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7', } -export const STRK_ADDRESSES = { - [constants.StarknetChainId.SN_GOERLI]: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', +export const STRK_ADDRESSES: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', [constants.StarknetChainId.SN_MAIN]: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', } -export const USDC_ADDRESSES = { - [constants.StarknetChainId.SN_GOERLI]: '0x5a643907b9a4bc6a55e9069c4fd5fd1f5c79a22470690f75556c4736e34426', +export const USDC_ADDRESSES: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x5a643907b9a4bc6a55e9069c4fd5fd1f5c79a22470690f75556c4736e34426', [constants.StarknetChainId.SN_MAIN]: '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8', } -export const MULTICALL_ADDRESSES = { - [constants.StarknetChainId.SN_GOERLI]: '0x01a33330996310a1e3fa1df5b16c1e07f0491fdd20c441126e02613b948f0225', +export const MULTICALL_ADDRESSES: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x01a33330996310a1e3fa1df5b16c1e07f0491fdd20c441126e02613b948f0225', [constants.StarknetChainId.SN_MAIN]: '0x01a33330996310a1e3fa1df5b16c1e07f0491fdd20c441126e02613b948f0225', } -export const JEDISWAP_ETH_USDC = { - [constants.StarknetChainId.SN_GOERLI]: '0x05a2b2b37f66157f767ea711cb4e034c40d41f2f5acf9ff4a19049fa11c1a884', +export const JEDISWAP_ETH_USDC: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x05a2b2b37f66157f767ea711cb4e034c40d41f2f5acf9ff4a19049fa11c1a884', [constants.StarknetChainId.SN_MAIN]: '0x04d0390b777b424e43839cd1e744799f3de6c176c7e32c1812a41dbd9c19db6a', } -export const JEDISWAP_STRK_USDC = { - [constants.StarknetChainId.SN_GOERLI]: '0x018b129b1a372b3288077521ad8749f5a2b2ddfb67ef5a37e2d02190fa11c40f', +export const JEDISWAP_STRK_USDC: MultichainAddress = { + [constants.StarknetChainId.SN_SEPOLIA]: '0x018b129b1a372b3288077521ad8749f5a2b2ddfb67ef5a37e2d02190fa11c40f', [constants.StarknetChainId.SN_MAIN]: '0x5726725e9507c3586cc0516449e2c74d9b201ab2747752bb0251aaa263c9a26', } diff --git a/packages/core/src/constants/tokens.ts b/packages/core/src/constants/tokens.ts index f0fecd16..38fa44ba 100644 --- a/packages/core/src/constants/tokens.ts +++ b/packages/core/src/constants/tokens.ts @@ -11,14 +11,14 @@ export enum QUOTE_TOKEN_SYMBOL { // ETH export const Ether: MultichainToken = { - [constants.StarknetChainId.SN_GOERLI]: { - address: ETH_ADDRESSES[constants.StarknetChainId.SN_GOERLI], + [constants.StarknetChainId.SN_SEPOLIA]: { + address: ETH_ADDRESSES[constants.StarknetChainId.SN_SEPOLIA], symbol: QUOTE_TOKEN_SYMBOL.ETH, name: 'Ether', decimals: 18, camelCased: true, usdcPair: { - address: JEDISWAP_ETH_USDC[constants.StarknetChainId.SN_GOERLI], + address: JEDISWAP_ETH_USDC[constants.StarknetChainId.SN_SEPOLIA], reversed: true, }, }, @@ -37,14 +37,14 @@ export const Ether: MultichainToken = { // STRK export const Stark: MultichainToken = { - [constants.StarknetChainId.SN_GOERLI]: { - address: STRK_ADDRESSES[constants.StarknetChainId.SN_GOERLI], + [constants.StarknetChainId.SN_SEPOLIA]: { + address: STRK_ADDRESSES[constants.StarknetChainId.SN_SEPOLIA], symbol: QUOTE_TOKEN_SYMBOL.STRK, name: 'Stark', decimals: 18, camelCased: true, usdcPair: { - address: JEDISWAP_STRK_USDC[constants.StarknetChainId.SN_GOERLI], + address: JEDISWAP_STRK_USDC[constants.StarknetChainId.SN_SEPOLIA], reversed: true, }, }, @@ -63,8 +63,8 @@ export const Stark: MultichainToken = { // USDC export const USDCoin: MultichainToken = { - [constants.StarknetChainId.SN_GOERLI]: { - address: USDC_ADDRESSES[constants.StarknetChainId.SN_GOERLI], + [constants.StarknetChainId.SN_SEPOLIA]: { + address: USDC_ADDRESSES[constants.StarknetChainId.SN_SEPOLIA], symbol: QUOTE_TOKEN_SYMBOL.USDC, name: 'USD Coin', decimals: 6, @@ -82,15 +82,15 @@ export const USDCoin: MultichainToken = { // Quote tokens export const QUOTE_TOKENS: { [chainId in constants.StarknetChainId]: Record } = { - [constants.StarknetChainId.SN_GOERLI]: { - [getChecksumAddress(ETH_ADDRESSES[constants.StarknetChainId.SN_GOERLI])]: - Ether[constants.StarknetChainId.SN_GOERLI], + [constants.StarknetChainId.SN_SEPOLIA]: { + [getChecksumAddress(ETH_ADDRESSES[constants.StarknetChainId.SN_SEPOLIA])]: + Ether[constants.StarknetChainId.SN_SEPOLIA], - [getChecksumAddress(STRK_ADDRESSES[constants.StarknetChainId.SN_GOERLI])]: - Stark[constants.StarknetChainId.SN_GOERLI], + [getChecksumAddress(STRK_ADDRESSES[constants.StarknetChainId.SN_SEPOLIA])]: + Stark[constants.StarknetChainId.SN_SEPOLIA], - [getChecksumAddress(USDC_ADDRESSES[constants.StarknetChainId.SN_GOERLI])]: - USDCoin[constants.StarknetChainId.SN_GOERLI], + [getChecksumAddress(USDC_ADDRESSES[constants.StarknetChainId.SN_SEPOLIA])]: + USDCoin[constants.StarknetChainId.SN_SEPOLIA], }, [constants.StarknetChainId.SN_MAIN]: { @@ -101,6 +101,6 @@ export const QUOTE_TOKENS: { [chainId in constants.StarknetChainId]: Record) { - const { result } = await this.config.provider.callContract({ + const result = await this.config.provider.callContract({ contractAddress: liquidity.lockManager, entrypoint: Entrypoint.GET_LOCK_DETAILS, calldata: [liquidity.lockPosition], @@ -205,7 +205,7 @@ export class Factory implements FactoryInterface { } private async getEkuboLiquidityLockPosition(liquidity: Pick) { - const { result } = await this.config.provider.callContract({ + const result = await this.config.provider.callContract({ contractAddress: liquidity.lockManager, entrypoint: Entrypoint.LIQUIDITY_POSITION_DETAILS, calldata: [liquidity.ekuboId], @@ -250,7 +250,7 @@ export class Factory implements FactoryInterface { ]) // call ekubo position to get collectable fees details - const { result } = await this.config.provider.callContract({ + const result = await this.config.provider.callContract({ contractAddress: EKUBO_POSITIONS_ADDRESSES[this.config.chainId], entrypoint: Entrypoint.GET_TOKEN_INFOS, calldata, diff --git a/packages/core/src/types/tokens.ts b/packages/core/src/types/tokens.ts index c9dcf1d7..3d6f54a0 100644 --- a/packages/core/src/types/tokens.ts +++ b/packages/core/src/types/tokens.ts @@ -17,3 +17,5 @@ export type Token = { } export type MultichainToken = { [chainId in constants.StarknetChainId]: Token } + +export type MultichainAddress = { [chainId in constants.StarknetChainId]: `0x${string}` } diff --git a/packages/core/src/utils/contract.ts b/packages/core/src/utils/contract.ts index 494d47cb..0dba429c 100644 --- a/packages/core/src/utils/contract.ts +++ b/packages/core/src/utils/contract.ts @@ -20,7 +20,7 @@ export async function multiCallContract( entrypoint: Entrypoint.AGGREGATE, calldata: [calldata.length, ...calldata.flat()], }) - const raw = rawResult.result.slice(2) + const raw = rawResult.slice(2) const result: string[][] = [] let idx = 0 diff --git a/packages/core/src/utils/price.ts b/packages/core/src/utils/price.ts index 4ad9fd8d..a73e433e 100644 --- a/packages/core/src/utils/price.ts +++ b/packages/core/src/utils/price.ts @@ -8,11 +8,11 @@ import { decimalsScale } from './helpers' export async function getPairPrice( provider: ProviderInterface, pair?: USDCPair, - blockNumber: BlockNumber = BlockTag.latest, + blockNumber: BlockNumber = BlockTag.LATEST, ) { if (!pair) return new Fraction(1, 1) - const { result } = await provider.callContract( + const result = await provider.callContract( { contractAddress: pair.address, entrypoint: Entrypoint.GET_RESERVES, diff --git a/packages/frontend/craco.config.cjs b/packages/frontend/craco.config.cjs index a97527b8..23c54999 100644 --- a/packages/frontend/craco.config.cjs +++ b/packages/frontend/craco.config.cjs @@ -12,6 +12,7 @@ const isProduction = process.env.NODE_ENV === 'production' module.exports = { eslint: { enable: true, + mode: 'file', pluginOptions(eslintConfig) { return Object.assign(eslintConfig, { cache: true, diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 4b04f67f..00f69524 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -11,9 +11,10 @@ "dependencies": { "@avnu/avnu-sdk": "^2.0.0", "@hookform/resolvers": "^3.3.2", - "@starknet-react/chains": "^0.1.0", - "@starknet-react/core": "^2.2.4", - "@tanstack/react-query": "^5.0.1", + "@starknet-io/types-js": "^0.7.10", + "@starknet-react/chains": "^3.1.0", + "@starknet-react/core": "^3.6.2", + "@tanstack/react-query": "^5.25.0", "@types/react-dom": "^18.2.1", "@uniswap/sdk-core": "^4.0.9", "@vanilla-extract/css": "^1.11.0", @@ -33,7 +34,7 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.49.0", "react-router-dom": "^6.11.0", - "starknet": "^5.10.0", + "starknet": "^6.18.0", "starknetkit": "^1.0.22", "ua-parser-js": "^1.0.35", "zod": "^3.22.4", @@ -52,7 +53,7 @@ "get-graphql-schema": "^2.1.2", "mini-css-extract-plugin": "^2.7.5", "node-polyfill-webpack-plugin": "^2.0.1", - "prettier": "^2.4.1", + "prettier": "^3.2.5", "react-scripts": "^5.0.1", "typescript": "^5.0.4" }, diff --git a/packages/frontend/src/components/TransactionModal/index.tsx b/packages/frontend/src/components/TransactionModal/index.tsx index 10b6f103..23049264 100644 --- a/packages/frontend/src/components/TransactionModal/index.tsx +++ b/packages/frontend/src/components/TransactionModal/index.tsx @@ -1,4 +1,4 @@ -import { useContractWrite, useWaitForTransaction } from '@starknet-react/core' +import { useSendTransaction, useTransactionReceipt } from '@starknet-react/core' import { useEffect, useMemo, useState } from 'react' import { STARKNET_POLLING } from 'src/constants/misc' import { useCloseModal, useTransactionModal } from 'src/hooks/useModal' @@ -15,8 +15,8 @@ import Overlay from '../Modal/Overlay' import Spinner from '../Spinner' import * as styles from './style.css' -type UseWaitForTransactionResponse = Omit, 'data'> & { - data?: { finality_status?: TransactionStatus } +type UseWaitForTransactionResponse = Omit, 'data'> & { + data?: { value?: { finality_status?: TransactionStatus } } } export function TransactionModal() { @@ -31,13 +31,13 @@ export function TransactionModal() { const close = useCloseModal() // starknet - const { writeAsync } = useContractWrite({}) + const { sendAsync } = useSendTransaction({}) // calls const [invokeTransactionDetails, resetTransaction] = useTransaction() // transaction status - const { data, refetch } = useWaitForTransaction({ + const { data, refetch } = useTransactionReceipt({ retry: true, retryDelay: STARKNET_POLLING, refetchInterval: STARKNET_POLLING, @@ -45,7 +45,7 @@ export function TransactionModal() { }) as UseWaitForTransactionResponse const statusComponent = useMemo(() => { - switch (data?.finality_status) { + switch (data?.value?.finality_status) { // Success case TransactionStatus.ACCEPTED_ON_L1: case TransactionStatus.ACCEPTED_ON_L2: @@ -69,11 +69,11 @@ export function TransactionModal() { } return - }, [data?.finality_status]) + }, [data?.value?.finality_status]) // refetch useEffect(() => { - if (!isOpen || (data?.finality_status && data.finality_status !== TransactionStatus.RECEIVED)) return + if (!isOpen || (data?.value?.finality_status && data.value.finality_status !== TransactionStatus.RECEIVED)) return const intervalId = setInterval(() => { setTransactionHash((state) => { @@ -86,13 +86,13 @@ export function TransactionModal() { }, STARKNET_POLLING) return () => clearInterval(intervalId) - }, [data?.finality_status, isOpen, refetch]) + }, [data?.value?.finality_status, isOpen, refetch]) // onSuccess callback useEffect(() => { if (accepted || !currentInvokeTransactionDetails?.onSuccess) return - switch (data?.finality_status) { + switch (data?.value?.finality_status) { // Success case TransactionStatus.ACCEPTED_ON_L1: case TransactionStatus.ACCEPTED_ON_L2: @@ -100,7 +100,7 @@ export function TransactionModal() { currentInvokeTransactionDetails.onSuccess() } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [accepted, data?.finality_status, currentInvokeTransactionDetails?.onSuccess]) + }, [accepted, data?.value?.finality_status, currentInvokeTransactionDetails?.onSuccess]) // error component const errorComponent = useMemo(() => { @@ -123,7 +123,7 @@ export function TransactionModal() { useEffect(() => { if (!currentInvokeTransactionDetails) return - writeAsync({ calls: currentInvokeTransactionDetails.calls }) + sendAsync(currentInvokeTransactionDetails.calls) .then((res) => { setTransactionHash(res.transaction_hash) }) @@ -134,7 +134,7 @@ export function TransactionModal() { }) resetTransaction() - }, [resetTransaction, currentInvokeTransactionDetails, writeAsync]) + }, [resetTransaction, currentInvokeTransactionDetails, sendAsync]) // updating current invoke transaction details useEffect(() => { diff --git a/packages/frontend/src/components/WalletModal/Option.tsx b/packages/frontend/src/components/WalletModal/Option.tsx index 63551e94..1d6f9827 100644 --- a/packages/frontend/src/components/WalletModal/Option.tsx +++ b/packages/frontend/src/components/WalletModal/Option.tsx @@ -11,7 +11,7 @@ interface OptionProps { } function Option({ connection, activate }: OptionProps) { - const icon = connection.icon.dark + const icon = typeof connection.icon === 'string' ? connection.icon : connection.icon.dark const isSvg = icon?.startsWith(' /* display svg */ ) : ( - + )} {connection.name} diff --git a/packages/frontend/src/components/Web3Provider/index.tsx b/packages/frontend/src/components/Web3Provider/index.tsx index be948dab..aaad27df 100644 --- a/packages/frontend/src/components/Web3Provider/index.tsx +++ b/packages/frontend/src/components/Web3Provider/index.tsx @@ -1,4 +1,12 @@ -import { argent, braavos, StarknetConfig, starkscan, useInjectedConnectors, useNetwork } from '@starknet-react/core' +import { + argent, + braavos, + Connector, + StarknetConfig, + starkscan, + useInjectedConnectors, + useNetwork, +} from '@starknet-react/core' import { QueryClient } from '@tanstack/react-query' import { Provider as HooksProvider } from 'hooks' import { useMemo } from 'react' @@ -22,7 +30,7 @@ export function StarknetProvider({ children }: React.PropsWithChildren) { ...injected, new WebWalletConnector({ url: 'https://web.argent.xyz' }), new ArgentMobileConnector(), - ] + ] as Connector[] return ( { switch (chain.id) { - case goerli.id: + case sepolia.id: return new RpcProvider({ - nodeUrl: `https://rpc.nethermind.io/goerli-juno/?apikey=${NETHERMIND_KEY}`, + nodeUrl: `https://rpc.nethermind.io/sepolia-juno/?apikey=${NETHERMIND_KEY}`, }) case mainnet.id: diff --git a/packages/frontend/src/hooks/useBalances.ts b/packages/frontend/src/hooks/useBalances.ts index 03911a8f..3ad4f78e 100644 --- a/packages/frontend/src/hooks/useBalances.ts +++ b/packages/frontend/src/hooks/useBalances.ts @@ -1,4 +1,4 @@ -import { useAccount, useContractRead, UseContractReadResult } from '@starknet-react/core' +import { useAccount, useReadContract, UseReadContractResult } from '@starknet-react/core' import { Fraction } from '@uniswap/sdk-core' import { Token } from 'core' import { compiledMulticall, Entrypoint, MULTICALL_ADDRESSES } from 'core/constants' @@ -11,7 +11,7 @@ import useChainId from './useChainId' type Balance = Fraction type Balances = Record -interface UseBalancesResult extends Pick { +interface UseBalancesResult extends Pick, 'error' | 'refetch'> { data?: Balances loading: boolean } @@ -23,7 +23,7 @@ export default function useBalances(tokens: UseBalancesToken[]): UseBalancesResu const { address: accountAddress } = useAccount() const chainId = useChainId() - const res = useContractRead({ + const res = useReadContract({ abi: compiledMulticall, // call is not send if abi is undefined address: accountAddress && chainId ? MULTICALL_ADDRESSES[chainId] : undefined, functionName: 'aggregate', @@ -37,12 +37,14 @@ export default function useBalances(tokens: UseBalancesToken[]): UseBalancesResu }), ), ], - }) as UseContractReadResult & { data?: [bigint, [bigint, bigint][]] } + }) + + const resData: [bigint, [bigint, bigint][]] | undefined = res.data const data = useMemo(() => { - if (!res.data) return undefined + if (!resData) return undefined - return res.data[1].reduce>((acc, balance, index) => { + return resData[1].reduce>((acc, balance, index) => { const token = tokens[index] acc[token.address] = new Fraction( uint256.uint256ToBN({ low: balance[0], high: balance[1] }).toString(), @@ -52,7 +54,7 @@ export default function useBalances(tokens: UseBalancesToken[]): UseBalancesResu return acc }, {}) // eslint-disable-next-line react-hooks/exhaustive-deps - }, [res.data?.[0].toString()]) + }, [resData?.[0].toString()]) return { data, loading: res.fetchStatus === 'fetching', error: res.error, refetch: res.refetch } } diff --git a/packages/frontend/src/hooks/useChainId.ts b/packages/frontend/src/hooks/useChainId.ts index a8eed9cf..ef81bd4c 100644 --- a/packages/frontend/src/hooks/useChainId.ts +++ b/packages/frontend/src/hooks/useChainId.ts @@ -1,7 +1,8 @@ import { starknetChainId, useNetwork } from '@starknet-react/core' import { useMemo } from 'react' +import { constants } from 'starknet' -export default function useChainId() { +export default function useChainId(): constants.StarknetChainId | undefined { const { chain } = useNetwork() return useMemo(() => (chain.id ? starknetChainId(chain.id) : undefined), [chain.id]) } diff --git a/packages/frontend/src/pages/Token/Communities.tsx b/packages/frontend/src/pages/Token/Communities.tsx index d7a3d644..07fc7750 100644 --- a/packages/frontend/src/pages/Token/Communities.tsx +++ b/packages/frontend/src/pages/Token/Communities.tsx @@ -22,7 +22,6 @@ export default function Communities() { const { register, handleSubmit, - setValue, formState: { errors }, } = useForm>({ resolver: zodResolver(schema), diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 0d7b7819..6c89a7af 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -24,7 +24,7 @@ "prepublishOnly": "npm run build" }, "devDependencies": { - "@starknet-react/core": "^2.6.1", + "@starknet-react/core": "^3.6.2", "@testing-library/react": "^15.0.2", "@types/react": "^18.2.79", "@types/react-test-renderer": "^18.0.7", @@ -34,18 +34,18 @@ "prettier": "^3.1.0", "react": "^18.2.0", "react-test-renderer": "^18.2.0", - "starknet": "^5.24.3", + "starknet": "^6.18.0", "tsup": "^8.0.2", "typescript": "~5.4.0", "vitest": "^1.5.0" }, "peerDependencies": { - "@starknet-react/core": ">=2.0.0", + "@starknet-react/core": ">=3.0.0", "react": ">=18.0.0", - "starknet": ">=5.0.0" + "starknet": ">=6.8.0" }, "dependencies": { - "@tanstack/react-query": "^5.29.2", + "@tanstack/react-query": "^5.25.0", "@uniswap/sdk-core": "^4.2.0", "core": "*" } diff --git a/packages/hooks/src/hooks/internal/useInvalidateOnBlock.ts b/packages/hooks/src/hooks/internal/useInvalidateOnBlock.ts index 8fdce2df..45da6847 100644 --- a/packages/hooks/src/hooks/internal/useInvalidateOnBlock.ts +++ b/packages/hooks/src/hooks/internal/useInvalidateOnBlock.ts @@ -1,7 +1,8 @@ import { useBlockNumber } from '@starknet-react/core' import { QueryKey, useQueryClient } from '@tanstack/react-query' import { useEffect, useRef } from 'react' -import { STARKNET_BLOCK_POLLING } from 'src/constants/misc' + +import { STARKNET_BLOCK_POLLING } from '../../constants/misc' /** * Invalidates the given query keys on every new block. diff --git a/packages/hooks/src/hooks/usePairPrice.ts b/packages/hooks/src/hooks/usePairPrice.ts index 328594a9..2f86cc06 100644 --- a/packages/hooks/src/hooks/usePairPrice.ts +++ b/packages/hooks/src/hooks/usePairPrice.ts @@ -14,7 +14,7 @@ export type UsePairPriceProps = UseQueryProps & { export function usePairPrice({ pair, - blockNumber = BlockTag.latest, + blockNumber = BlockTag.LATEST, ...props }: UsePairPriceProps): UseQueryResult { const { provider } = useProvider() diff --git a/packages/hooks/src/providers/Provider.tsx b/packages/hooks/src/providers/Provider.tsx index 06c264fd..26ef85f5 100644 --- a/packages/hooks/src/providers/Provider.tsx +++ b/packages/hooks/src/providers/Provider.tsx @@ -25,9 +25,9 @@ export interface ProviderProps { queryClient?: QueryClient } -export function Provider({ factory, queryClient, children }: React.PropsWithChildren) { +export function Provider({ factory, provider, queryClient, children }: React.PropsWithChildren) { return ( - + {children} ) diff --git a/packages/tg-bot/package.json b/packages/tg-bot/package.json index c025e705..dab60b22 100644 --- a/packages/tg-bot/package.json +++ b/packages/tg-bot/package.json @@ -12,7 +12,7 @@ "@walletconnect/sign-client": "^2.12.2", "node-telegram-bot-api": "^0.65.1", "qrcode": "^1.5.3", - "starknet": "^5.24.3", + "starknet": "^6.18.0", "ts-dedent": "^2.2.0", "zod": "^3.23.4" }, diff --git a/packages/tg-bot/src/forms/launch.ts b/packages/tg-bot/src/forms/launch.ts index 8a3e610e..ae264398 100644 --- a/packages/tg-bot/src/forms/launch.ts +++ b/packages/tg-bot/src/forms/launch.ts @@ -1,17 +1,11 @@ import { EkuboLaunchData, StandardAMMLaunchData } from 'core' -import { - AMM, - AMMS, - DECIMALS, - LIQUIDITY_LOCK_FOREVER_TIMESTAMP, - QUOTE_TOKENS, - STARKNET_MAX_BLOCK_TIME, -} from 'core/constants' +import { AMM, AMMS, DECIMALS, LIQUIDITY_LOCK_FOREVER_TIMESTAMP, QUOTE_TOKENS } from 'core/constants' import { dedent } from 'ts-dedent' import { bot } from '../services/bot' import { factory } from '../services/factory' import { useWallet } from '../services/wallet' +import { STARKNET_MAX_BLOCK_TIME } from '../utils/constants' import { createForm, defineField, Forms } from '../utils/form' import { decimalsScale, parsePercentage } from '../utils/helpers' import { LaunchValidation } from '../utils/validation' diff --git a/packages/tg-bot/src/utils/constants.ts b/packages/tg-bot/src/utils/constants.ts index 914446dd..84291a6a 100644 --- a/packages/tg-bot/src/utils/constants.ts +++ b/packages/tg-bot/src/utils/constants.ts @@ -1 +1 @@ -export const PERCENTAGE_INPUT_PRECISION = 2 +export const STARKNET_MAX_BLOCK_TIME = 3600 * 2 diff --git a/packages/tg-bot/src/utils/validation.ts b/packages/tg-bot/src/utils/validation.ts index 51e765e2..f12aece1 100644 --- a/packages/tg-bot/src/utils/validation.ts +++ b/packages/tg-bot/src/utils/validation.ts @@ -26,7 +26,7 @@ export const validateAndSend = ( return false } -export const addressValidation = z +const addressValidation = z .string({ invalid_type_error: 'Please provide a valid *Address*.', required_error: 'Please provide a valid *Address*.', diff --git a/yarn.lock b/yarn.lock index 95bb2a6a..68777ee1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,11 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== +"@adraffy/ens-normalize@^1.10.1": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" + integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== + "@algolia/autocomplete-core@1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" @@ -3050,23 +3055,59 @@ dependencies: eslint-scope "5.1.1" -"@noble/curves@1.2.0", "@noble/curves@~1.2.0": +"@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== dependencies: "@noble/hashes" "1.3.2" +"@noble/curves@1.6.0", "@noble/curves@~1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" + integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== + dependencies: + "@noble/hashes" "1.5.0" + +"@noble/curves@^1.4.0", "@noble/curves@^1.6.0", "@noble/curves@~1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" + integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== + dependencies: + "@noble/hashes" "1.6.0" + +"@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@~1.3.2": +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.3": version "1.3.3" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + +"@noble/hashes@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" + integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== + +"@noble/hashes@^1.5.0", "@noble/hashes@~1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3363,18 +3404,57 @@ resolved "https://registry.yarnpkg.com/@saucelabs/theme-github-codeblock/-/theme-github-codeblock-0.2.3.tgz#706a43292f600532271979941b0155db667c2c21" integrity sha512-GSl3Lr/jOWm4OP3BPX2vXxc8FMSOXj1mJnls6cUqMwlGOfKQ1Ia9pq1O9/ES+5TrZHIzAws/n5FFSn1OkGJw/Q== -"@scure/base@^1.1.3": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" - integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== +"@scure/base@~1.1.3", "@scure/base@~1.1.7", "@scure/base@~1.1.8": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== -"@scure/starknet@~0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@scure/starknet/-/starknet-0.3.0.tgz#b8273a42fc721025f8098b1f1d96368a7067e1c4" - integrity sha512-Ma66yZlwa5z00qI5alSxdWtIpky5LBhy22acVFdoC5kwwbd9uDyMWEYzWHdNyKmQg9t5Y2UOXzINMeb3yez+Gw== +"@scure/base@~1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865" + integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ== + +"@scure/bip32@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.5.0.tgz#dd4a2e1b8a9da60e012e776d954c4186db6328e6" + integrity sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw== + dependencies: + "@noble/curves" "~1.6.0" + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.7" + +"@scure/bip32@^1.5.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.0.tgz#6dbc6b4af7c9101b351f41231a879d8da47e0891" + integrity sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA== dependencies: - "@noble/curves" "~1.2.0" - "@noble/hashes" "~1.3.2" + "@noble/curves" "~1.7.0" + "@noble/hashes" "~1.6.0" + "@scure/base" "~1.2.1" + +"@scure/bip39@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.4.0.tgz#664d4f851564e2e1d4bffa0339f9546ea55960a6" + integrity sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw== + dependencies: + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.8" + +"@scure/bip39@^1.4.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.0.tgz#c8f9533dbd787641b047984356531d84485f19be" + integrity sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A== + dependencies: + "@noble/hashes" "~1.6.0" + "@scure/base" "~1.2.1" + +"@scure/starknet@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@scure/starknet/-/starknet-1.0.0.tgz#4419bc2fdf70f3dd6cb461d36c878c9ef4419f8c" + integrity sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.3" "@sideway/address@^4.1.5": version "4.1.5" @@ -3570,21 +3650,33 @@ "@stablelib/random" "^1.0.2" "@stablelib/wipe" "^1.0.1" -"@starknet-react/chains@^0.1.0", "@starknet-react/chains@^0.1.7": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@starknet-react/chains/-/chains-0.1.7.tgz#58503379e2ffabe33b4f6e0f2aef775e84745a4d" - integrity sha512-UNh97I1SvuJKaAhKOmpEk8JcWuZWMlPG/ba2HcvFYL9x/47BKndJ+Da9V+iJFtkHUjreVnajT1snsaz1XMG+UQ== +"@starknet-io/types-js@^0.7.10": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.10.tgz#d21dc973d0cd04d7b6293ce461f2f06a5873c760" + integrity sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w== -"@starknet-react/core@^2.2.4", "@starknet-react/core@^2.6.1": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@starknet-react/core/-/core-2.6.1.tgz#03fbe858c32744236fd74c9350e057a0bcda7266" - integrity sha512-EaHT/B/If2PC0CVlb8Wwdv5axmmIRK+ysjTUbSeIs7/U8A03KXuuoJBrXMHLPBgMWk/0E0hZKqNUVdDKGVlFTQ== +"@starknet-io/types-js@^0.7.7", "starknet-types-07@npm:@starknet-io/types-js@^0.7.7": + name starknet-types-07 + version "0.7.7" + resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.7.tgz#444be5e4e585ec6f599d42d3407280d98b2dfdf8" + integrity sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ== + +"@starknet-react/chains@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@starknet-react/chains/-/chains-3.1.0.tgz#35c75f8da68a8871e74a377a59b7de1345151312" + integrity sha512-h+fxh+Bs8h0ZSEX651vG3mn1NtMKzFDSHqrX7Q8YRRIeTKolPCx4vmoi5Gg19SXr/9iIVSwgx6qe4rVZTNfhcQ== + +"@starknet-react/core@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@starknet-react/core/-/core-3.6.2.tgz#c39193e2dc5c18cf2e6db94d11b625f345c794e3" + integrity sha512-cEheoYB8Sy65+su1A7WzdyX/Qq89wLQXFmqOwsaIwpKNy1zzcwZfEOStCpzs6jLh7yEy3QU6arbn7wytt5OhKQ== dependencies: - "@starknet-react/chains" "^0.1.7" - "@tanstack/react-query" "^5.0.1" + "@starknet-io/types-js" "^0.7.7" + "@starknet-react/chains" "^3.1.0" + "@tanstack/react-query" "^5.25.0" eventemitter3 "^5.0.1" - immutable "^4.3.4" - zod "^3.22.2" + viem "^2.21.1" + zod "^3.22.4" "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" @@ -3812,17 +3904,17 @@ dependencies: defer-to-connect "^2.0.1" -"@tanstack/query-core@5.31.0": - version "5.31.0" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.31.0.tgz#b11372dedbf307bc8b2c25397c7107205bf50dfa" - integrity sha512-r1V6RXB1LUGoEp7HGHVK4Tl59kOvAfwI9/kNNwPsb6cR5oHgfn1683sQnoH/3xEDUKOen3fEO90EnGE+OjRw5A== +"@tanstack/query-core@5.62.1": + version "5.62.1" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.62.1.tgz#0ef80db0832f7d96cf3f93b81470ce5a36e84478" + integrity sha512-thYv90GkMcfumgmtp6sptC18SqxWwXTCKUuk7jyeHHn7kYouh0VJrowuuBffAIBiR3Z8OnsccmPUnP1leKJBVQ== -"@tanstack/react-query@^5.0.1", "@tanstack/react-query@^5.29.2": - version "5.31.0" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.31.0.tgz#ead732a5323c6c2c95da3115542cabc0920e4748" - integrity sha512-/GUUDFA8yNIYZaSyImkecVfN9mAVw1Y+9LpHkOQ1DdWaKnbLtwfjelh6OF+6EtwQCycH50EjTL68UK3YTMxwvg== +"@tanstack/react-query@^5.25.0": + version "5.62.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.62.1.tgz#90f3558a7a7c45e4387172df2ff15fe7b371d9ad" + integrity sha512-gb4eglrgW+yOeiNPkpqFyN8oLrFafHrHE+q2LzVl7TfyA4fuQluH92NTl6Jed7ae35v+BNtAQng9mykywWLzfA== dependencies: - "@tanstack/query-core" "5.31.0" + "@tanstack/query-core" "5.62.1" "@testing-library/dom@^10.0.0": version "10.0.0" @@ -5000,6 +5092,21 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abi-wan-kanabi@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/abi-wan-kanabi/-/abi-wan-kanabi-2.2.3.tgz#d1c410325aac866f31f3d589279a87b341e5641f" + integrity sha512-JlqiAl9CPvTm5kKG0QXmVCWNWoC/XyRMOeT77cQlbxXWllgjf6SqUmaNqFon72C2o5OSZids+5FvLdsw6dvWaw== + dependencies: + ansicolors "^0.3.2" + cardinal "^2.1.1" + fs-extra "^10.0.0" + yargs "^17.7.2" + +abitype@1.0.6, abitype@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" + integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -5206,6 +5313,11 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +ansicolors@^0.3.2, ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -6037,6 +6149,14 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz#d34248b4ec1f117b70b24ad9ee04c90e0b8a14ae" integrity sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" @@ -8198,7 +8318,7 @@ esprima@1.2.2: resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -8327,6 +8447,11 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter3@5.0.1, eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + eventemitter3@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" @@ -8337,11 +8462,6 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -8537,6 +8657,14 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" +fetch-cookie@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-3.0.1.tgz#6a77f7495e1a639ae019db916a234db8c85d5963" + integrity sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q== + dependencies: + set-cookie-parser "^2.4.8" + tough-cookie "^4.0.0" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -9651,11 +9779,6 @@ immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== -immutable@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" - integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== - import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -10202,6 +10325,11 @@ isomorphic-unfetch@3.1.0: node-fetch "^2.6.1" unfetch "^4.2.0" +isows@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" + integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -11254,10 +11382,10 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lossless-json@^2.0.8: - version "2.0.11" - resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-2.0.11.tgz#3137684c93fd99481c6f99c985efc9c9c5cc76a5" - integrity sha512-BP0vn+NGYvzDielvBZaFain/wgeJ1hTvURCqtKvhr1SCPePdaaTanmmcplrHfEJSJOUql7hk4FHwToNJjWRY3g== +lossless-json@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-4.0.2.tgz#f00c52815805d1421930a87e2670e27350958a3f" + integrity sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA== loupe@^2.3.6, loupe@^2.3.7: version "2.3.7" @@ -12645,6 +12773,19 @@ outdent@^0.8.0: resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0" integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== +ox@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.1.2.tgz#0f791be2ccabeaf4928e6d423498fe1c8094e560" + integrity sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww== + dependencies: + "@adraffy/ens-normalize" "^1.10.1" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@scure/bip32" "^1.5.0" + "@scure/bip39" "^1.4.0" + abitype "^1.0.6" + eventemitter3 "5.0.1" + p-cancelable@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" @@ -13791,7 +13932,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.4.1, prettier@^2.8.0: +prettier@^2.8.0: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -14426,6 +14567,13 @@ recursive-readdir@^2.2.2: dependencies: minimatch "^3.0.5" +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -15051,6 +15199,11 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-cookie-parser@^2.4.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -15355,18 +15508,22 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -starknet@5.24.3, starknet@^5.10.0, starknet@^5.24.3: - version "5.24.3" - resolved "https://registry.yarnpkg.com/starknet/-/starknet-5.24.3.tgz#1d8a84047783ea122a6cf4f2dac59bfa6d628154" - integrity sha512-v0TuaNc9iNtHdbIRzX372jfQH1vgx2rwBHQDMqK4DqjJbwFEE5dog8Go6rGiZVW750NqRSWrZ7ahqyRNc3bscg== - dependencies: - "@noble/curves" "~1.2.0" - "@scure/base" "^1.1.3" - "@scure/starknet" "~0.3.0" +starknet@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/starknet/-/starknet-6.18.0.tgz#4f99b495b0e146f0d1f8a8cbbbe851ce414244bb" + integrity sha512-nlxz7bK/YBY8W8NUevkycxFwphsX27oi+4YCl36TYFdrJpTOMqmJDnZ27ssr7z0eEDQLQscIxt1gXrZzCJua7g== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.3" + "@scure/starknet" "~1.0.0" + abi-wan-kanabi "^2.2.3" + fetch-cookie "^3.0.0" isomorphic-fetch "^3.0.0" - lossless-json "^2.0.8" + lossless-json "^4.0.1" pako "^2.0.4" - url-join "^4.0.1" + starknet-types-07 "npm:@starknet-io/types-js@^0.7.7" + ts-mixer "^6.0.3" starknetkit@^1.0.22: version "1.1.9" @@ -16038,6 +16195,11 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-mixer@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" + integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== + ts-node@^10.7.0: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -16552,11 +16714,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-join@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" - integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - url-loader@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" @@ -16691,6 +16848,21 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" +viem@^2.21.1: + version "2.21.53" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.53.tgz#a5ba6da48e5edded27dde286e431ae97034f4fc4" + integrity sha512-0pY8clBacAwzc59iV1vY4a6U4xvRlA5tAuhClJCKvqA6rXJzmNMMvxQ0EG79lkHr7WtBEruXz8nAmONXwnq4EQ== + dependencies: + "@noble/curves" "1.6.0" + "@noble/hashes" "1.5.0" + "@scure/bip32" "1.5.0" + "@scure/bip39" "1.4.0" + abitype "1.0.6" + isows "1.0.6" + ox "0.1.2" + webauthn-p256 "0.0.10" + ws "8.18.0" + vite-node@1.5.0, vite-node@^1.2.0: version "1.5.0" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.5.0.tgz#7f74dadfecb15bca016c5ce5ef85e5cc4b82abf2" @@ -16790,6 +16962,14 @@ web-vitals@^3.5.2: resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.5.2.tgz#5bb58461bbc173c3f00c2ddff8bfe6e680999ca9" integrity sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg== +webauthn-p256@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.10.tgz#877e75abe8348d3e14485932968edf3325fd2fdd" + integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== + dependencies: + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -17330,6 +17510,11 @@ ws@8.17.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + ws@^7.3.1, ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" @@ -17445,7 +17630,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.0: +yargs@^17.0.0, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -17473,7 +17658,7 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -zod@^3.22.2, zod@^3.22.4: +zod@^3.22.4: version "3.23.0" resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.0.tgz#a25dab5052702834233e0041e9dd8b6a8480e744" integrity sha512-OFLT+LTocvabn6q76BTwVB0hExEBS0IduTr3cqZyMqEDbOnYmcU+y0tUAYbND4uwclpBGi4I4UUBGzylWpjLGA==