diff --git a/app/components/home/stacking-card.tsx b/app/components/home/stacking-card.tsx
index 0f8707510..25312911a 100644
--- a/app/components/home/stacking-card.tsx
+++ b/app/components/home/stacking-card.tsx
@@ -5,7 +5,7 @@ import BigNumber from 'bignumber.js';
import { RootState } from '@store/index';
import { formatPoxAddressToNetwork } from '@utils/stacking';
-import { selectStackerInfo } from '@store/stacking/stacking.reducer';
+import { selectAccountBalanceLocked, selectStackerInfo } from '@store/stacking/stacking.reducer';
import stackingImg from '@assets/images/abstract-btc-stx-bar-chart.svg';
import {
InfoCard,
@@ -24,6 +24,7 @@ export const StackingCard: FC = () => {
const { stackerInfo } = useSelector((state: RootState) => ({
stackerInfo: selectStackerInfo(state),
}));
+ const accountBalanceLocked = useSelector((state: RootState) => selectAccountBalanceLocked(state));
if (!stackerInfo?.isCurrentlyStacking) return null;
@@ -41,7 +42,7 @@ export const StackingCard: FC = () => {
fontFamily="Open Sauce"
letterSpacing="-0.02em"
>
- {toHumanReadableStx(stackerInfo.details.amount_microstx)}
+ {accountBalanceLocked !== null && toHumanReadableStx(Number(accountBalanceLocked))}
diff --git a/app/components/info-card.tsx b/app/components/info-card.tsx
index c76e955cf..c139bcace 100644
--- a/app/components/info-card.tsx
+++ b/app/components/info-card.tsx
@@ -14,14 +14,21 @@ export const InfoCard: FC = props => (
/>
);
-export const InfoCardGroup: FC = ({ children, ...props }) => {
+type ChildProps = BoxProps;
+
+type TChild = React.ReactElement;
+
+interface Props extends BoxProps {
+ children: TChild | TChild[];
+}
+export const InfoCardGroup = ({ children, ...props }: Props) => {
const parsedChildren = Array.isArray(children) ? children : [children];
const infoGroup = parsedChildren.flatMap((child, index) => {
if (!isValidElement(child)) return null;
return [
cloneElement(child, {
key: index,
- mb: index === parsedChildren.length ? '280px' : null,
+ mb: index === parsedChildren.length ? '280px' : undefined,
}),
index !== parsedChildren.length - 1 &&
,
];
diff --git a/app/hooks/use-decrypt-wallet.ts b/app/hooks/use-decrypt-wallet.ts
index 28cb953ca..a3ef20b6b 100644
--- a/app/hooks/use-decrypt-wallet.ts
+++ b/app/hooks/use-decrypt-wallet.ts
@@ -31,7 +31,7 @@ export function useDecryptWallet() {
);
setIsDecrypting(false);
if (error) throw error;
- return decryptedSoftwareWallet as NonNullable;
+ return decryptedSoftwareWallet;
},
[encryptedMnemonic, salt]
);
diff --git a/app/hooks/use-global-polling.ts b/app/hooks/use-global-polling.ts
index 434c14567..7c98b2b26 100644
--- a/app/hooks/use-global-polling.ts
+++ b/app/hooks/use-global-polling.ts
@@ -4,6 +4,7 @@ import { useDispatch, useSelector } from 'react-redux';
import { DEFAULT_POLLING_INTERVAL } from '@constants/index';
import { selectAddress } from '@store/keys';
import {
+ fetchAccountBalanceLocked,
fetchBlockTimeInfo,
fetchCoreDetails,
fetchStackerInfo,
@@ -24,12 +25,14 @@ export function useGlobalAppPolling() {
if (!address) return;
dispatch(getAddressTransactions(address));
dispatch(getAddressDetails(address));
+ dispatch(fetchAccountBalanceLocked(address));
}, [address, dispatch]);
const refreshWalletDetailsWithoutLoader = useCallback(() => {
if (!address) return;
dispatch(getAddressTransactions(address, { displayLoading: false }));
dispatch(getAddressDetails(address));
+ dispatch(fetchAccountBalanceLocked(address));
}, [address, dispatch]);
useNavigatorOnline({ onReconnect: initAppWithStxAddressInfo });
@@ -43,6 +46,7 @@ export function useGlobalAppPolling() {
dispatch(fetchCoreDetails());
dispatch(fetchBlockTimeInfo());
dispatch(fetchStackerInfo(address));
+ dispatch(fetchAccountBalanceLocked(address));
}
}, [address, api, initAppWithStxAddressInfo, dispatch]);
@@ -50,6 +54,7 @@ export function useGlobalAppPolling() {
if (address) {
dispatch(fetchStackerInfo(address));
dispatch(fetchStackingInfo());
+ dispatch(fetchAccountBalanceLocked(address));
}
dispatch(fetchCoreDetails());
}, 20_000);
diff --git a/app/hooks/use-watch-stacking-tx.ts b/app/hooks/use-watch-stacking-tx.ts
index d88696cc8..6e815be05 100644
--- a/app/hooks/use-watch-stacking-tx.ts
+++ b/app/hooks/use-watch-stacking-tx.ts
@@ -11,6 +11,7 @@ import {
selectPoxInfo,
fetchStackerInfo,
removeStackingTx,
+ fetchAccountBalanceLocked,
} from '@store/stacking';
export function useWatchStackingTx() {
@@ -28,6 +29,7 @@ export function useWatchStackingTx() {
if (!activeStackingTx || !address) return;
await safeAwait(watchContractExecution({ nodeUrl: api.baseUrl, txId: activeStackingTx }));
dispatch(fetchStackerInfo(address));
+ dispatch(fetchAccountBalanceLocked(address));
setTimeout(() => dispatch(removeStackingTx()), 2000);
}
void run();
diff --git a/app/modals/delegated-stacking/delegated-stacking-modal.tsx b/app/modals/delegated-stacking/delegated-stacking-modal.tsx
index 1ff249730..420a1e55e 100644
--- a/app/modals/delegated-stacking/delegated-stacking-modal.tsx
+++ b/app/modals/delegated-stacking/delegated-stacking-modal.tsx
@@ -49,8 +49,9 @@ export const DelegatedStackingModal: FC = props => {
poxInfo: selectPoxInfo(state),
}));
- const [nodeResponseError, setNodeResponseError] =
- useState(null);
+ const [nodeResponseError, setNodeResponseError] = useState(
+ null
+ );
const delegationTxOptions = useMemo((): ContractCallOptions => {
if (!poxInfo) throw new Error('`poxInfo` undefined');
diff --git a/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx b/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx
index 4c299de8d..d2f522bf2 100644
--- a/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx
+++ b/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx
@@ -18,8 +18,9 @@ export const RevealStxAddressLedger: FC = () => {
const [ledgerAddress, setLedgerAddress] = useState(null);
const [success, setSuccess] = useState(false);
- const [pendingLedgerAction, setPendingLedgerAction] =
- useState<'idle' | 'pending' | 'complete'>('idle');
+ const [pendingLedgerAction, setPendingLedgerAction] = useState<'idle' | 'pending' | 'complete'>(
+ 'idle'
+ );
const { address: persistedAddress } = useSelector((state: RootState) => ({
address: selectAddress(state),
diff --git a/app/modals/revoke-delegation/revoke-delegation-modal.tsx b/app/modals/revoke-delegation/revoke-delegation-modal.tsx
index a15ddffa6..54ae265f1 100644
--- a/app/modals/revoke-delegation/revoke-delegation-modal.tsx
+++ b/app/modals/revoke-delegation/revoke-delegation-modal.tsx
@@ -30,8 +30,9 @@ export const RevokeDelegationModal: FC = () => {
const calcFee = useCalculateFee();
const poxInfo = useSelector(selectPoxInfo);
- const [nodeResponseError, setNodeResponseError] =
- useState(null);
+ const [nodeResponseError, setNodeResponseError] = useState(
+ null
+ );
const revocationTxOptions = useMemo((): ContractCallOptions => {
if (!poxInfo) throw new Error('`poxInfo` undefined');
diff --git a/app/modals/send-stx/send-stx-modal.tsx b/app/modals/send-stx/send-stx-modal.tsx
index f864fd4f6..e980b98c8 100644
--- a/app/modals/send-stx/send-stx-modal.tsx
+++ b/app/modals/send-stx/send-stx-modal.tsx
@@ -73,8 +73,9 @@ export const SendStxModal: FC = ({ address, isOpen }) => {
const [feeEstimateError, setFeeEstimateError] = useState(null);
- const [nodeResponseError, setNodeResponseError] =
- useState(null);
+ const [nodeResponseError, setNodeResponseError] = useState(
+ null
+ );
const [loading, setLoading] = useState(false);
const { nonce } = useLatestNonce();
diff --git a/app/modals/stacking/stacking-modal.tsx b/app/modals/stacking/stacking-modal.tsx
index 2aa65a6e7..eadba6d4d 100644
--- a/app/modals/stacking/stacking-modal.tsx
+++ b/app/modals/stacking/stacking-modal.tsx
@@ -42,8 +42,9 @@ export const StackingModal: FC = props => {
coreNodeInfo: selectCoreNodeInfo(state),
}));
- const [nodeResponseError, setNodeResponseError] =
- useState(null);
+ const [nodeResponseError, setNodeResponseError] = useState(
+ null
+ );
const stackingTxOptions = useMemo(() => {
if (!poxInfo) throw new Error('poxInfo not defined');
if (!coreNodeInfo) throw new Error('Stacking requires coreNodeInfo');
diff --git a/app/pages/stacking/components/stacking-form-container.tsx b/app/pages/stacking/components/stacking-form-container.tsx
index e68cf9d91..52c5b1eb8 100644
--- a/app/pages/stacking/components/stacking-form-container.tsx
+++ b/app/pages/stacking/components/stacking-form-container.tsx
@@ -1,10 +1,21 @@
-import React, { cloneElement, FC, isValidElement } from 'react';
+import React, { cloneElement, isValidElement } from 'react';
import { Box } from '@stacks/ui';
import { Hr } from '@components/hr';
import { increment } from '@utils/mutate-numbers';
+import { BoxProps } from '@stacks/ui-core';
-export const StackingFormContainer: FC = ({ children }) => {
+interface ChildProps extends BoxProps {
+ step: number;
+}
+
+type TChild = React.ReactElement;
+
+interface Props {
+ children: TChild | TChild[];
+}
+
+export const StackingFormContainer = ({ children }: Props) => {
const parsedChildren = Array.isArray(children) ? children : [children];
const parsedFormSteps = parsedChildren.flatMap((child, index) => {
if (!isValidElement(child)) return null;
@@ -13,7 +24,7 @@ export const StackingFormContainer: FC = ({ children }) => {
cloneElement(child, {
key: index,
step: increment(index),
- mb: increment(index) === parsedChildren.length ? '280px' : null,
+ mb: increment(index) === parsedChildren.length ? '280px' : undefined,
}),
];
});
diff --git a/app/store/address/address.actions.ts b/app/store/address/address.actions.ts
index d0d51bb7d..7b062d93b 100644
--- a/app/store/address/address.actions.ts
+++ b/app/store/address/address.actions.ts
@@ -29,5 +29,6 @@ export function getAddressDetails(address: string) {
};
}
-export const updateAddressBalance =
- createAction<{ address: string; balance: string }>('address/update-balance');
+export const updateAddressBalance = createAction<{ address: string; balance: string }>(
+ 'address/update-balance'
+);
diff --git a/app/store/keys/keys.actions.ts b/app/store/keys/keys.actions.ts
index 221dff553..d56585517 100644
--- a/app/store/keys/keys.actions.ts
+++ b/app/store/keys/keys.actions.ts
@@ -61,7 +61,7 @@ interface SetPasswordSuccess {
export const setPasswordSuccess = createAction('keys/set-password-success');
export function onboardingMnemonicGenerationStep({ stepDelayMs }: { stepDelayMs: number }) {
- return async (dispatch: Dispatch) => {
+ return (dispatch: Dispatch) => {
const plaintextMnemonic = generateSecretKey(MNEMONIC_ENTROPY);
dispatch(persistMnemonicSafe(plaintextMnemonic));
setTimeout(() => dispatch(push(routes.SECRET_KEY)), stepDelayMs);
diff --git a/app/store/stacking/stacking.actions.ts b/app/store/stacking/stacking.actions.ts
index 463965685..a1175443a 100644
--- a/app/store/stacking/stacking.actions.ts
+++ b/app/store/stacking/stacking.actions.ts
@@ -48,6 +48,19 @@ export const fetchStackerInfo = createAsyncThunk(
}
);
+export const fetchAccountBalanceLocked = createAsyncThunk(
+ 'stacking/balance-locked',
+ async (address: string, thunkApi) => {
+ const state = thunkApi.getState() as RootState;
+ const network = selectActiveStacksNetwork(state);
+ const stackingClient = new StackingClient(address, network);
+ const [error, resp] = await safeAwait(stackingClient.getAccountBalanceLocked());
+ if (resp !== undefined) return resp;
+ if (error) return { error };
+ throw new Error();
+ }
+);
+
export const activeStackingTx = createAction<{ txId: string }>(
'stacking/call-stacking-contract-tx'
);
diff --git a/app/store/stacking/stacking.reducer.ts b/app/store/stacking/stacking.reducer.ts
index 5a7c6a4b8..f8b1dbe1c 100644
--- a/app/store/stacking/stacking.reducer.ts
+++ b/app/store/stacking/stacking.reducer.ts
@@ -18,6 +18,7 @@ import {
fetchStackerInfo,
activeStackingTx,
removeStackingTx,
+ fetchAccountBalanceLocked,
} from './stacking.actions';
import { stxToMicroStx } from '@utils/unit-convert';
import { StackerInfo as StackerInfoFromClient } from '@stacks/stacking';
@@ -41,10 +42,13 @@ type StackerInfo = StackerInfoFromClient | StackerInfoFail;
export interface StackingState {
initialRequestsComplete: Record<
- 'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo',
+ 'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo' | 'accountBalanceLocked',
+ boolean
+ >;
+ errors: Record<
+ 'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo' | 'accountBalanceLocked',
boolean
>;
- errors: Record<'poxInfo' | 'coreNodeInfo' | 'blockTimeInfo' | 'stackerInfo', boolean>;
contractCallTx: string | null;
poxInfo: CoreNodePoxResponse | null;
coreNodeInfo: CoreNodeInfoResponse | null;
@@ -56,11 +60,12 @@ export interface StackingState {
lock_period: number;
unlock_height: number;
pox_address: {
- version: Buffer;
- hashbytes: Buffer;
+ version: Uint8Array;
+ hashbytes: Uint8Array;
};
};
} | null;
+ accountBalanceLocked: bigint | null;
}
const initialState: StackingState = {
@@ -69,18 +74,21 @@ const initialState: StackingState = {
coreNodeInfo: false,
blockTimeInfo: false,
stackerInfo: false,
+ accountBalanceLocked: false,
},
errors: {
poxInfo: false,
coreNodeInfo: false,
blockTimeInfo: false,
stackerInfo: false,
+ accountBalanceLocked: false,
},
contractCallTx: null,
poxInfo: null,
coreNodeInfo: null,
blockTimeInfo: null,
stackerInfo: null,
+ accountBalanceLocked: null,
};
export const stackingSlice = createSlice({
@@ -88,6 +96,16 @@ export const stackingSlice = createSlice({
initialState,
reducers: {},
extraReducers: {
+ [fetchAccountBalanceLocked.fulfilled.toString()]: (state, action: PayloadAction) => {
+ state.initialRequestsComplete.accountBalanceLocked = true;
+ state.errors.accountBalanceLocked = false;
+ state.accountBalanceLocked = action.payload;
+ },
+ [fetchAccountBalanceLocked.rejected.toString()]: state => {
+ if (!state.initialRequestsComplete.accountBalanceLocked) {
+ state.errors.accountBalanceLocked = true;
+ }
+ },
[fetchStackingInfo.fulfilled.toString()]: (
state,
action: PayloadAction
@@ -155,6 +173,10 @@ export const stackingActions = stackingSlice.actions;
export const selectStackingState = (state: RootState) => state.stacking;
export const selectCoreNodeInfo = createSelector(selectStackingState, state => state.coreNodeInfo);
+export const selectAccountBalanceLocked = createSelector(
+ selectStackingState,
+ state => state.accountBalanceLocked
+);
export const selectBlockTimeInfo = createSelector(
selectStackingState,
state => state.blockTimeInfo
diff --git a/app/store/transaction/transaction.actions.ts b/app/store/transaction/transaction.actions.ts
index 9cb0d0d17..a0ef00f70 100644
--- a/app/store/transaction/transaction.actions.ts
+++ b/app/store/transaction/transaction.actions.ts
@@ -1,17 +1,15 @@
import { createAction } from '@reduxjs/toolkit';
import { safeAwait } from '@stacks/ui';
-import {
- PostCoreNodeTransactionsError,
- AddressTransactionWithTransfers,
-} from '@stacks/stacks-blockchain-api-types';
+import { AddressTransactionWithTransfers } from '@stacks/stacks-blockchain-api-types';
import urljoin from 'url-join';
-import { StacksTransaction, TxBroadcastResult } from '@stacks/transactions';
+import { StacksTransaction, TxBroadcastResultRejected } from '@stacks/transactions';
import { Api } from '../../api/api';
import { safelyFormatHexTxid } from '@utils/safe-handle-txid';
import { Dispatch, GetState } from '@store/index';
import { selectActiveNodeApi, selectActiveStacksNetwork } from '@store/stacks-node';
+import { isObject } from 'formik';
export const pendingTransactionSuccessful = createAction(
'transactions/pending-transaction-successful'
@@ -58,10 +56,16 @@ export const broadcastTxFail = createAction(
'transactions/broadcast-transactions-fail'
);
+function hasMessageProp(arg: unknown): arg is { message: string } {
+ if (!isObject(arg)) return false;
+ if (!Object.hasOwn(arg, 'message')) return false;
+
+ return true;
+}
export interface BroadcastTransactionArgs {
transaction: StacksTransaction;
onBroadcastSuccess(txId: string): void;
- onBroadcastFail(errorResponse?: PostCoreNodeTransactionsError): void;
+ onBroadcastFail(errorResponse?: TxBroadcastResultRejected): void;
}
export function broadcastTransaction(args: BroadcastTransactionArgs) {
const { transaction, onBroadcastSuccess, onBroadcastFail } = args;
@@ -77,14 +81,21 @@ export function broadcastTransaction(args: BroadcastTransactionArgs) {
);
if (typeof blockchainResponse !== 'string') {
// setError for ui
- dispatch(broadcastTxFail(blockchainResponse as any));
+ const reasonData = blockchainResponse.reason_data;
+ const message = hasMessageProp(reasonData) ? reasonData.message : '';
+ dispatch(
+ broadcastTxFail({
+ reason: blockchainResponse.reason,
+ message,
+ })
+ );
onBroadcastFail(blockchainResponse);
return;
}
onBroadcastSuccess(safelyFormatHexTxid(blockchainResponse));
return blockchainResponse;
} catch (e) {
- dispatch(broadcastTxFail(e));
+ dispatch(broadcastTxFail(e as BroadcastTxFail));
onBroadcastFail();
return;
}
@@ -94,7 +105,7 @@ export function broadcastTransaction(args: BroadcastTransactionArgs) {
export async function broadcastRawTransaction(
rawTx: Uint8Array,
url: string
-): Promise {
+): Promise {
const requestHeaders = {
'Content-Type': 'application/octet-stream',
};
@@ -106,11 +117,19 @@ export async function broadcastRawTransaction(
};
const response = await fetch(urljoin(url, '/v2/transactions'), options);
- const text = await response.text();
- try {
- return JSON.parse(text) as TxBroadcastResult;
- } catch (e) {
- return text;
- }
+ /**
+ * Variable `text` can either be,
+ * - a string of the transaction id, when the request is successful
+ * - a stringified JSON object when the request is unsuccessful
+ *
+ * source,
+ * https://docs.hiro.so/api#tag/Transactions/operation/post_core_node_transactions
+ *
+ * Note that in the documentation above the mimetype of successful responses
+ * is documented as `text/plain`, yet the responses have have a mimetype of
+ * `application/json`.
+ */
+ const text = await response.text();
+ return JSON.parse(text);
}
diff --git a/app/utils/stacking.ts b/app/utils/stacking.ts
index 484153c08..f1fba8fb2 100644
--- a/app/utils/stacking.ts
+++ b/app/utils/stacking.ts
@@ -16,8 +16,8 @@ const poxKeyToVersionBytesMap: Record<'mainnet' | 'testnet', any> = {
};
interface ConvertToPoxAddressBtc {
- version: Buffer;
- hashbytes: Buffer;
+ version: Uint8Array;
+ hashbytes: Uint8Array;
}
export function convertPoxAddressToBtc(network: 'mainnet' | 'testnet') {
return ({ version, hashbytes }: ConvertToPoxAddressBtc) => {
diff --git a/package.json b/package.json
index 5452bbdc9..8b5ac14a5 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,9 @@
"prepare": "husky install",
"typecheck": "tsc --noEmit"
},
+ "resolutions": {
+ "@types/react": "17.0.30"
+ },
"release": {
"branches": [
{
@@ -130,12 +133,12 @@
"@types/node": "14.14.37",
"@types/qrcode.react": "1.0.1",
"@types/ramda": "types/npm-ramda#dist",
- "@types/react": "17.0.52",
+ "@types/react": "17",
"@types/react-dom": "17.0.18",
- "@types/react-redux": "7.1.16",
+ "@types/react-redux": "7.1.24",
"@types/react-router": "5.1.13",
"@types/react-router-dom": "5.1.7",
- "@types/redux-logger": "3.0.8",
+ "@types/redux-logger": "3.0.9",
"@types/regenerator-runtime": "0.13.0",
"@types/rimraf": "3.0.0",
"@types/source-map-support": "0.5.3",
@@ -209,7 +212,7 @@
"@hot-loader/react-dom": "17.0.1",
"@noble/hashes": "1.1.3",
"@popperjs/core": "2.9.1",
- "@reduxjs/toolkit": "1.5.1",
+ "@reduxjs/toolkit": "1.9.1",
"@scure/base": "1.1.1",
"@scure/bip32": "1.1.1",
"@segment/analytics-next": "1.30.0",
@@ -247,7 +250,7 @@
"minimist": "1.2.5",
"os-browserify": "0.3.0",
"qrcode.react": "1.0.1",
- "react": "17.0.2",
+ "react": "17",
"react-card-flip": "1.1.0",
"react-dom": "17.0.2",
"react-hot-loader": "4.13.0",
@@ -256,12 +259,12 @@
"react-icons": "4.2.0",
"react-popper": "2.2.5",
"react-query": "3.13.4",
- "react-redux": "7.2.3",
+ "react-redux": "7",
"react-router": "5.2.0",
"react-router-dom": "5.2.0",
- "redux": "4.0.5",
+ "redux": "4.2.0",
"redux-persist": "6.0.0",
- "redux-thunk": "2.3.0",
+ "redux-thunk": "2.4.2",
"rpc-websocket-client": "1.1.4",
"rxjs": "6.6.7",
"source-map-support": "0.5.19",
diff --git a/yarn.lock b/yarn.lock
index dfab7236c..eac8086b8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1156,7 +1156,7 @@
pirates "^4.0.0"
source-map-support "^0.5.16"
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.20.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3"
integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==
@@ -3085,15 +3085,15 @@
"@react-types/overlays" "^3.6.5"
"@react-types/shared" "^3.16.0"
-"@reduxjs/toolkit@1.5.1":
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.5.1.tgz#05daa2f6eebc70dc18cd98a90421fab7fa565dc5"
- integrity sha512-PngZKuwVZsd+mimnmhiOQzoD0FiMjqVks6ituO1//Ft5UEX5Ca9of13NEjo//pU22Jk7z/mdXVsmDfgsig1osA==
+"@reduxjs/toolkit@1.9.1":
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.1.tgz#4c34dc4ddcec161535288c60da5c19c3ef15180e"
+ integrity sha512-HikrdY+IDgRfRYlCTGUQaiCxxDDgM1mQrRbZ6S1HFZX5ZYuJ4o8EstNmhTwHdPl2rTmLxzwSu0b3AyeyTlR+RA==
dependencies:
- immer "^8.0.1"
- redux "^4.0.0"
- redux-thunk "^2.3.0"
- reselect "^4.0.0"
+ immer "^9.0.16"
+ redux "^4.2.0"
+ redux-thunk "^2.4.2"
+ reselect "^4.1.7"
"@scure/base@1.1.1", "@scure/base@~1.1.0":
version "1.1.1"
@@ -4877,17 +4877,7 @@
dependencies:
"@types/react" "^17"
-"@types/react-redux@7.1.16":
- version "7.1.16"
- resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21"
- integrity sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw==
- dependencies:
- "@types/hoist-non-react-statics" "^3.3.0"
- "@types/react" "*"
- hoist-non-react-statics "^3.3.0"
- redux "^4.0.0"
-
-"@types/react-redux@^7.1.16":
+"@types/react-redux@7.1.24", "@types/react-redux@^7.1.20":
version "7.1.24"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.24.tgz#6caaff1603aba17b27d20f8ad073e4c077e975c0"
integrity sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==
@@ -4922,16 +4912,16 @@
"@types/history" "*"
"@types/react" "*"
-"@types/react@*":
- version "18.0.26"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917"
- integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==
+"@types/react@*", "@types/react@17.0.30", "@types/react@^17":
+ version "17.0.30"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.30.tgz#2f8e6f5ab6415c091cc5e571942ee9064b17609e"
+ integrity sha512-3Dt/A8gd3TCXi2aRe84y7cK1K8G+N9CZRDG8kDGguOKa0kf/ZkSwTmVIDPsm/KbQOVMaDJXwhBtuOXxqwdpWVg==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
-"@types/react@17.0.52", "@types/react@^17":
+"@types/react@17":
version "17.0.52"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b"
integrity sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A==
@@ -4940,10 +4930,10 @@
"@types/scheduler" "*"
csstype "^3.0.2"
-"@types/redux-logger@3.0.8":
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.8.tgz#1fb6d26917bb198792bb1cf57feb31cae1532c5d"
- integrity sha512-zM+cxiSw6nZtRbxpVp9SE3x/X77Z7e7YAfHD1NkxJyJbAGSXJGF0E9aqajZfPOa/sTYnuwutmlCldveExuCeLw==
+"@types/redux-logger@3.0.9":
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/@types/redux-logger/-/redux-logger-3.0.9.tgz#9193b3d51bb6ab98d25514ba7764e4f98a64d3ec"
+ integrity sha512-cwYhVbYNgH01aepeMwhd0ABX6fhVB2rcQ9m80u8Fl50ZODhsZ8RhQArnLTkE7/Zrfq4Sz/taNoF7DQy9pCZSKg==
dependencies:
redux "^4.0.0"
@@ -9460,10 +9450,10 @@ immer@9.0.1:
resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.1.tgz#1116368e051f9a0fd188c5136b6efb74ed69c57f"
integrity sha512-7CCw1DSgr8kKYXTYOI1qMM/f5qxT5vIVMeGLDCDX8CSxsggr1Sjdoha4OhsP0AZ1UvWbyZlILHvLjaynuu02Mg==
-immer@^8.0.1:
- version "8.0.4"
- resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a"
- integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ==
+immer@^9.0.16:
+ version "9.0.16"
+ resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.16.tgz#8e7caab80118c2b54b37ad43e05758cdefad0198"
+ integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==
"immutable@^3.8.1 || ^4.0.0-rc.1":
version "4.1.0"
@@ -12467,7 +12457,7 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-react-is@^17.0.1:
+react-is@^17.0.1, react-is@^17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
@@ -12494,17 +12484,17 @@ react-query@3.13.4:
broadcast-channel "^3.4.1"
match-sorter "^6.0.2"
-react-redux@7.2.3:
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.3.tgz#4c084618600bb199012687da9e42123cca3f0be9"
- integrity sha512-ZhAmQ1lrK+Pyi0ZXNMUZuYxYAZd59wFuVDGUt536kSGdD0ya9Q7BfsE95E3TsFLE3kOSFp5m6G5qbatE+Ic1+w==
+react-redux@7:
+ version "7.2.9"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d"
+ integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==
dependencies:
- "@babel/runtime" "^7.12.1"
- "@types/react-redux" "^7.1.16"
+ "@babel/runtime" "^7.15.4"
+ "@types/react-redux" "^7.1.20"
hoist-non-react-statics "^3.3.2"
loose-envify "^1.4.0"
prop-types "^15.7.2"
- react-is "^16.13.1"
+ react-is "^17.0.2"
react-refresh@0.9.0:
version "0.9.0"
@@ -12550,7 +12540,7 @@ react-transition-group@^4.4.1:
loose-envify "^1.4.0"
prop-types "^15.6.2"
-react@17.0.2:
+react@17:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
@@ -12646,25 +12636,12 @@ redux-persist@6.0.0:
resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8"
integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==
-redux-thunk@2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
- integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
-
-redux-thunk@^2.3.0:
+redux-thunk@2.4.2, redux-thunk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b"
integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==
-redux@4.0.5:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
- integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
- dependencies:
- loose-envify "^1.4.0"
- symbol-observable "^1.2.0"
-
-redux@^4.0.0:
+redux@4.2.0, redux@^4.0.0, redux@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13"
integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==
@@ -12781,7 +12758,7 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
-reselect@^4.0.0:
+reselect@^4.1.7:
version "4.1.7"
resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42"
integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==
@@ -13867,11 +13844,6 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
-symbol-observable@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
- integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
-
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"