diff --git a/package.json b/package.json index ab08b6b06dd..0e669ae6403 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "hdkey": "1.1.1", "inherits": "2.0.4", "long": "4.0.0", + "msw": "1.3.2", "process-nextick-args": "2.0.0", "randombytes": "2.1.0", "regenerator-runtime": "0.13.2", @@ -220,6 +221,7 @@ "@babel/runtime": "^7.20.0", "@bugsnag/source-maps": "^2.3.1", "@rollup/plugin-babel": "^6.0.3", + "@stakekit/api-hooks": "^0.0.52", "@sucrase/webpack-loader": "^2.0.0", "@tsconfig/react-native": "^2.0.2", "@typechain/ethers-v5": "^11.1.2", diff --git a/src/constants/WalletAndCurrencyConstants.ts b/src/constants/WalletAndCurrencyConstants.ts index 446dd1e5735..d333ab72212 100644 --- a/src/constants/WalletAndCurrencyConstants.ts +++ b/src/constants/WalletAndCurrencyConstants.ts @@ -472,6 +472,7 @@ export const SPECIAL_CURRENCY_INFO: { initWalletName: lstrings.string_first_coreum_wallet_name, chainCode: 'CORE', dummyPublicAddress: 'core18rv2a6cjkk3lnayy29hez6s2ftpe9llqnce2vu', + isStakingSupported: true, isImportKeySupported: true }, osmosis: { diff --git a/src/envConfig.ts b/src/envConfig.ts index 634979e5003..2f5b037a33a 100644 --- a/src/envConfig.ts +++ b/src/envConfig.ts @@ -99,6 +99,7 @@ export const asEnvConfig = asObject({ }) ), AZTECO_API_KEY: asNullable(asString), + STAKEKIT_API_KEY: asNullable(asString), // Core plugin options: AVALANCHE_INIT: asCorePluginInit(asEvmApiKeys), diff --git a/src/plugins/stake-plugins/generic/GenericStakePlugin.ts b/src/plugins/stake-plugins/generic/GenericStakePlugin.ts index 3813a657603..efe8fcb8807 100644 --- a/src/plugins/stake-plugins/generic/GenericStakePlugin.ts +++ b/src/plugins/stake-plugins/generic/GenericStakePlugin.ts @@ -1,4 +1,5 @@ import { ChangeQuote, ChangeQuoteRequest, StakePlugin, StakePluginFactory, StakePolicy, StakePolicyFilter, StakePosition, StakePositionRequest } from '../types' +import { CoreumNativeSkateKitAdapterConfig, makeSkateKitAdapter } from './policyAdapters/CoreumStakeKitAdaptor' import { GlifInfinityPoolAdapterConfig, makeGlifInfinityPoolAdapter } from './policyAdapters/GlifInfinityPoolAdapter' import { makeTarotPoolAdapter, TarotPoolAdapterConfig } from './policyAdapters/TarotPoolAdaptor' import { StakeAdapterConfig, StakePolicyAdapter } from './policyAdapters/types' @@ -73,12 +74,17 @@ function isPolicyInfoForGlifInfinityPool(policyInfo: StakePolicyConfig): policyInfo is StakePolicyConfig { return policyInfo.adapterConfig.type === 'tarot-velodrome-pool' } +function isPolicyInfoForCoreumStakeKit(policyInfo: StakePolicyConfig): policyInfo is StakePolicyConfig { + return policyInfo.adapterConfig.type === 'coreum-native-stake-kit' +} const makePolicyAdapter = (policyInfo: StakePolicyConfig): StakePolicyAdapter => { if (isPolicyInfoForGlifInfinityPool(policyInfo)) { return makeGlifInfinityPoolAdapter(policyInfo) } else if (isPolicyInfoForTarotPool(policyInfo)) { return makeTarotPoolAdapter(policyInfo) + } else if (isPolicyInfoForCoreumStakeKit(policyInfo)) { + return makeSkateKitAdapter(policyInfo) } else { throw new Error('Unknown policyInfo') } diff --git a/src/plugins/stake-plugins/generic/pluginInfo.ts b/src/plugins/stake-plugins/generic/pluginInfo.ts index d7bf69ceb48..dde5aa01856 100644 --- a/src/plugins/stake-plugins/generic/pluginInfo.ts +++ b/src/plugins/stake-plugins/generic/pluginInfo.ts @@ -1,5 +1,6 @@ +import { coreumnative } from './pluginInfo/coreumNativeStaking' import { glifpoolCalibration } from './pluginInfo/filecoinCalibrationGlifpool' import { glifpool } from './pluginInfo/filecoinGlifpool' import { tarotpool } from './pluginInfo/optimismTarotPool' -export const genericPlugins = [glifpool, glifpoolCalibration, tarotpool] +export const genericPlugins = [glifpool, glifpoolCalibration, tarotpool, coreumnative] diff --git a/src/plugins/stake-plugins/generic/pluginInfo/coreumNativeStaking.ts b/src/plugins/stake-plugins/generic/pluginInfo/coreumNativeStaking.ts new file mode 100644 index 00000000000..f7a016c3e0a --- /dev/null +++ b/src/plugins/stake-plugins/generic/pluginInfo/coreumNativeStaking.ts @@ -0,0 +1,54 @@ +import { StakeProviderInfo } from '../../types' +import { StakePluginInfo, StakePolicyConfig } from '../types' + +interface CoreumNativeSkateKitAdapterConfig { + type: string + integrationId: string + preferredValidatorAddress: string + preferredValidatorName: string +} + +const stakeProviderInfo: StakeProviderInfo = { + displayName: 'Coreum Native Staking', + pluginId: 'coreum', + stakeProviderId: 'coreum_native' +} + +const commonAdaptorConfig = { + type: 'coreum-native-stake-kit', + integrationId: 'coreum-core-native-staking' +} + +const adaptors: CoreumNativeSkateKitAdapterConfig[] = [ + { + ...commonAdaptorConfig, + preferredValidatorAddress: 'corevaloper1k0rllvenwr02gvm52fh5056g5m3hly2lpf63z5', // StakeLab + preferredValidatorName: 'StakeLab' + }, + + { + ...commonAdaptorConfig, + preferredValidatorAddress: 'corevaloper1puge9crcxvq02jguql4vp2dhglvjll3wzdcggq', // Bware Labs + preferredValidatorName: 'Bware Labs' + } +] + +const makePolicyConfig = (adapterConfig: CoreumNativeSkateKitAdapterConfig) => { + return { + stakePolicyId: `coreum_native_${adapterConfig.preferredValidatorAddress}`, + stakeProviderInfo: { ...stakeProviderInfo, displayName: `Coreum Native Staking - ${adapterConfig.preferredValidatorName}` }, + parentPluginId: 'coreum', + parentCurrencyCode: 'COREUM', + hideUnstakeAction: true, + adapterConfig, + stakeAssets: [{ pluginId: 'coreum', currencyCode: 'COREUM' }], + rewardAssets: [{ pluginId: 'coreum', currencyCode: 'COREUM' }] + } +} + +const coreumPolicyConfig: Array> = adaptors.map(adaptor => makePolicyConfig(adaptor)) + +export const coreumnative: StakePluginInfo = { + pluginId: 'stake:coreum:native', + policyConfigs: [...coreumPolicyConfig] +} diff --git a/src/plugins/stake-plugins/generic/policyAdapters/CoreumStakeKitAdaptor.ts b/src/plugins/stake-plugins/generic/policyAdapters/CoreumStakeKitAdaptor.ts new file mode 100644 index 00000000000..0be7e88f286 --- /dev/null +++ b/src/plugins/stake-plugins/generic/policyAdapters/CoreumStakeKitAdaptor.ts @@ -0,0 +1,404 @@ +import type { ActionRequestDto, TransactionDto } from '@stakekit/api-hooks' +import { add, div, eq, floor, gt, mul, sub } from 'biggystring' +import { EdgeCurrencyWallet, EdgeTransaction } from 'edge-core-js' + +import { DECIMAL_PRECISION } from '../../../../util/utils' +import { AssetId, ChangeQuote, PositionAllocation, QuoteAllocation, StakePosition } from '../../types' +import { StakePolicyConfig } from '../types' +import { + actionEnter, + actionExit, + actionPending, + transactionConstruct, + transactionSubmitHash, + yieldGetSingleYieldBalances, + yieldYieldOpportunity +} from '../util/stakeKitUtils' +import { StakePolicyAdapter } from './types' + +export interface CoreumNativeSkateKitAdapterConfig { + type: 'coreum-native-stake-kit' + integrationId: string + preferredValidatorAddress: string + preferredValidatorName: string +} + +export const makeSkateKitAdapter = (policyConfig: StakePolicyConfig): StakePolicyAdapter => { + if (policyConfig.stakeAssets.length > 1) throw new Error(`Staking more than one assets is not supported for CoreumSkateKitAdapter`) + if (policyConfig.rewardAssets.length > 1) throw new Error(`Claim of more than one assets is not supported for CoreumSkateKitAdapter`) + + if (policyConfig.stakeAssets[0].currencyCode !== policyConfig.rewardAssets[0].currencyCode) + throw new Error(`Stake and claim of different assets is not supported for CoreumSkateKitAdapter`) + + // Metadata constants: + const metadataName = 'Coreum Native Staking' + const stakeAsset = policyConfig.stakeAssets[0] + const metadataPoolAssetName = `${stakeAsset.currencyCode}` + + const { adapterConfig, stakePolicyId, stakeProviderInfo } = policyConfig + + async function prepareChangeQuote( + wallet: EdgeCurrencyWallet, + txs: TransactionDto[], + edgeTxs: EdgeTransaction[], + allocations: QuoteAllocation[] + ): Promise { + const networkFee = edgeTxs.reduce((prev, curr) => add(prev, curr.networkFee), '0') + + allocations.push({ + allocationType: 'networkFee', + pluginId: policyConfig.parentPluginId, + currencyCode: policyConfig.parentCurrencyCode, + nativeAmount: networkFee + }) + + const approve = async (): Promise => { + for (let i = 0; i < txs.length; i++) { + const { unsignedTransaction } = txs[i] + if (unsignedTransaction == null) continue + + const signedTx = await wallet.signMessage(unsignedTransaction) + const edgeTx = edgeTxs[i] + edgeTx.signedTx = signedTx + const broadcastEdgeTx = await wallet.broadcastTx(edgeTx) + await transactionSubmitHash(txs[i].id, { hash: broadcastEdgeTx.txid }) + await wallet.saveTx(broadcastEdgeTx) + } + } + + return { + allocations, + approve + } + } + + async function getUnsignedTransactions(transactions: TransactionDto[]): Promise { + const unsignedTxs: TransactionDto[] = [] + for (const txFromStakeKit of transactions) { + const txResponse = await transactionConstruct(txFromStakeKit.id, {}) + unsignedTxs.push(txResponse) + } + return unsignedTxs.filter(tx => tx.status === 'WAITING_FOR_SIGNATURE') + } + + async function workflowUtils(wallet: EdgeCurrencyWallet): Promise<{ exchangeDenomMultiplier: string; stakeKitAddresses: ActionRequestDto['addresses'] }> { + const { publicAddress } = await wallet.getReceiveAddress({ tokenId: null }) + const stakeKitAddresses: ActionRequestDto['addresses'] = { + address: publicAddress, + additionalAddresses: { + cosmosPubKey: wallet.publicWalletInfo.keys.publicKey + } + } + + const multiplier = wallet.currencyInfo.denominations.find(denom => denom.name === stakeAsset.currencyCode)?.multiplier ?? '1' + + return { exchangeDenomMultiplier: multiplier, stakeKitAddresses } + } + + const instance: StakePolicyAdapter = { + stakePolicyId, + + async fetchClaimQuote(wallet: EdgeCurrencyWallet, requestAssetId: AssetId, nativeAmount: string): Promise { + const { exchangeDenomMultiplier, stakeKitAddresses } = await workflowUtils(wallet) + + const yieldBalanceRes = await yieldGetSingleYieldBalances(adapterConfig.integrationId, { + addresses: stakeKitAddresses + }) + + const rewardsActions = yieldBalanceRes.find(action => action.validatorAddress === adapterConfig.preferredValidatorAddress && action.type === 'rewards') + const claimAction = rewardsActions?.pendingActions.find(action => action.type === 'CLAIM_REWARDS') + if (claimAction == null) throw new Error('Did not find pending claim action') + + const actionPendingRes = await actionPending({ + integrationId: adapterConfig.integrationId, + passthrough: claimAction.passthrough, + type: claimAction.type, + args: { amount: div(nativeAmount, exchangeDenomMultiplier, DECIMAL_PRECISION), validatorAddress: adapterConfig.preferredValidatorAddress } + }) + + const unsignedTransactions = await getUnsignedTransactions(actionPendingRes.transactions) + + const edgeTxs = unsignedTransactions.map(tx => { + const networkFee = mul(exchangeDenomMultiplier, tx.gasEstimate?.amount ?? '0') + + const edgeTx: EdgeTransaction = { + blockHeight: 0, + currencyCode: requestAssetId.currencyCode, + date: 0, + isSend: true, + memos: [], + metadata: { + name: metadataName, + category: 'Income:Claim', + notes: `Claim ${metadataPoolAssetName} rewards from ${adapterConfig.preferredValidatorName} staking` + }, + nativeAmount: sub(nativeAmount, networkFee), + networkFee, + ourReceiveAddresses: [], + signedTx: '', + tokenId: null, + txid: '', + walletId: wallet.id + } + return edgeTx + }) + + const allocations: QuoteAllocation[] = [ + { + allocationType: 'claim', + pluginId: requestAssetId.pluginId, + currencyCode: requestAssetId.currencyCode, + nativeAmount + } + ] + + return await prepareChangeQuote(wallet, unsignedTransactions, edgeTxs, allocations) + }, + + async fetchStakeQuote(wallet, requestAssetId, requestNativeAmount): Promise { + const { exchangeDenomMultiplier, stakeKitAddresses } = await workflowUtils(wallet) + + const args: ActionRequestDto['args'] = { + amount: div(requestNativeAmount, exchangeDenomMultiplier, DECIMAL_PRECISION), + validatorAddress: adapterConfig.preferredValidatorAddress + } + + const actionEnterRes = await actionEnter({ + integrationId: adapterConfig.integrationId, + addresses: stakeKitAddresses, + args + }) + const unsignedTransactions = await getUnsignedTransactions(actionEnterRes.transactions) + + const edgeTxs = unsignedTransactions.map(tx => { + const networkFee = mul(exchangeDenomMultiplier, tx.gasEstimate?.amount ?? '0') + + const edgeTx: EdgeTransaction = { + blockHeight: 0, + currencyCode: requestAssetId.currencyCode, + date: 0, + isSend: true, + memos: [], + metadata: { + name: metadataName, + category: 'Transfer:Staking', + notes: `Stake ${metadataPoolAssetName} to ${adapterConfig.preferredValidatorName}` + }, + nativeAmount: `-${networkFee}`, + networkFee, + ourReceiveAddresses: [], + savedAction: { + actionType: 'stake', + pluginId: stakeProviderInfo.pluginId, + stakeAssets: [ + { + nativeAmount: requestNativeAmount, + pluginId: policyConfig.parentPluginId, + tokenId: null + } + ] + }, + signedTx: '', + tokenId: null, + txid: '', + walletId: wallet.id + } + return edgeTx + }) + + // Calculate the stake asset native amounts: + const allocations: QuoteAllocation[] = [ + { + allocationType: 'stake', + pluginId: requestAssetId.pluginId, + currencyCode: requestAssetId.currencyCode, + nativeAmount: requestNativeAmount + } + ] + + return await prepareChangeQuote(wallet, unsignedTransactions, edgeTxs, allocations) + }, + + async fetchUnstakeQuote(wallet, requestAssetId, requestNativeAmount): Promise { + const { exchangeDenomMultiplier, stakeKitAddresses } = await workflowUtils(wallet) + + const args: ActionRequestDto['args'] = { + amount: div(requestNativeAmount, exchangeDenomMultiplier, DECIMAL_PRECISION), + validatorAddress: adapterConfig.preferredValidatorAddress + } + + const actionExitRes = await actionExit({ + integrationId: adapterConfig.integrationId, + addresses: stakeKitAddresses, + args + }) + const unsignedTransactions = await getUnsignedTransactions(actionExitRes.transactions) + + const edgeTxs = unsignedTransactions.map(tx => { + const networkFee = mul(exchangeDenomMultiplier, tx.gasEstimate?.amount ?? '0') + + const edgeTx: EdgeTransaction = { + blockHeight: 0, + currencyCode: requestAssetId.currencyCode, + date: 0, + isSend: true, + memos: [], + metadata: { + name: metadataName, + category: 'Transfer:Unstaking', + notes: `Unstake ${metadataPoolAssetName} from ${adapterConfig.preferredValidatorName}` + }, + nativeAmount: `-${networkFee}`, + networkFee, + ourReceiveAddresses: [], + savedAction: { + actionType: 'stake', + pluginId: stakeProviderInfo.pluginId, + stakeAssets: [ + { + nativeAmount: requestNativeAmount, + pluginId: policyConfig.parentPluginId, + tokenId: null + } + ] + }, + signedTx: '', + tokenId: null, + txid: '', + walletId: wallet.id + } + return edgeTx + }) + + const allocations: QuoteAllocation[] = [ + { + allocationType: 'unstake', + pluginId: requestAssetId.pluginId, + currencyCode: requestAssetId.currencyCode, + nativeAmount: requestNativeAmount + } + ] + + return await prepareChangeQuote(wallet, unsignedTransactions, edgeTxs, allocations) + }, + + async fetchUnstakeExactQuote(wallet, requestAssetId, nativeAmount): Promise { + throw new Error('fetchUnstakeExactQuote not implemented for StakeKit') + }, + + async fetchStakePosition(wallet): Promise { + const { exchangeDenomMultiplier, stakeKitAddresses } = await workflowUtils(wallet) + const { currencyCode, pluginId } = wallet.currencyInfo + + const walletBalance = wallet.balanceMap.get(null) ?? '0' + const canStake = gt(walletBalance, '0') + let canUnstakeAndClaim = false + let canClaim = false + + const yieldBalancesRes = await yieldGetSingleYieldBalances(adapterConfig.integrationId, { + addresses: stakeKitAddresses, + args: { validatorAddresses: [adapterConfig.preferredValidatorAddress] } + }) + + const allocations: PositionAllocation[] = [] + for (const balance of yieldBalancesRes) { + const { + amount, + // groupId, + pendingActions, + // pricePerShare, + // token, + type, + date, + validatorAddress + // validatorAddresses + } = balance + if (adapterConfig.preferredValidatorAddress != null) { + if (validatorAddress !== adapterConfig.preferredValidatorAddress) continue + } + + const nativeAmount = floor(mul(amount, exchangeDenomMultiplier), 0) + if (eq(nativeAmount, '0')) continue + + const locktime = date != null ? new Date(date) : undefined + + // Build allocations + switch (type) { + case 'rewards': { + allocations.push({ + pluginId, + currencyCode, + allocationType: 'earned', + nativeAmount, + locktime + }) + break + } + case 'staked': { + canUnstakeAndClaim = true + allocations.push({ + pluginId, + currencyCode, + allocationType: 'staked', + nativeAmount, + locktime + }) + break + } + case 'unstaking': { + allocations.push({ + pluginId, + currencyCode, + allocationType: 'unstaked', + nativeAmount, + locktime + }) + break + } + default: { + continue + } + } + + for (const action of pendingActions) { + switch (action.type) { + case 'CLAIM_REWARDS': { + canClaim = true + break + } + default: { + // do nothing + } + } + } + } + + if (allocations.length === 0) { + allocations.push({ + pluginId, + currencyCode, + allocationType: 'staked', + nativeAmount: '0' + }) + } + + return { + allocations, + canStake, + canUnstake: false, + canUnstakeAndClaim, + canClaim + } + }, + + async fetchYieldInfo() { + const yieldRes = await yieldYieldOpportunity(adapterConfig.integrationId) + const validatorApr = yieldRes.validators.find(validator => validator.address === adapterConfig.preferredValidatorAddress) + if (validatorApr == null) return { apy: 0 } + + return { apy: validatorApr.apr * 100 } + } + } + + return instance +} diff --git a/src/plugins/stake-plugins/generic/policyAdapters/types.ts b/src/plugins/stake-plugins/generic/policyAdapters/types.ts index 47461ee11d2..ce66fc55dac 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/types.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/types.ts @@ -1,11 +1,12 @@ import { EdgeCurrencyWallet } from 'edge-core-js' import { AssetId, ChangeQuote, StakePolicy, StakePosition } from '../../types' +import { CoreumNativeSkateKitAdapterConfig } from './CoreumStakeKitAdaptor' import { GlifInfinityPoolAdapterConfig } from './GlifInfinityPoolAdapter' import { TarotPoolAdapterConfig } from './TarotPoolAdaptor' // Union of all adapter configs -export type StakeAdapterConfig = GlifInfinityPoolAdapterConfig | TarotPoolAdapterConfig +export type StakeAdapterConfig = GlifInfinityPoolAdapterConfig | TarotPoolAdapterConfig | CoreumNativeSkateKitAdapterConfig export interface StakePolicyAdapter { stakePolicyId: string diff --git a/src/plugins/stake-plugins/generic/util/stakeKitUtils.ts b/src/plugins/stake-plugins/generic/util/stakeKitUtils.ts new file mode 100644 index 00000000000..30c8c2ccdd0 --- /dev/null +++ b/src/plugins/stake-plugins/generic/util/stakeKitUtils.ts @@ -0,0 +1,65 @@ +import type { + ActionDto, + ActionRequestDto, + ConstructTransactionRequestDto, + PendingActionRequestDto, + SubmitHashRequestDto, + TransactionDto, + YieldBalanceDto, + YieldBalanceRequestDto, + YieldDto +} from '@stakekit/api-hooks' + +import { ENV } from '../../../../env' + +const baseUrl = 'https://api.stakek.it' +const headers = { 'Content-Type': 'application/json', 'X-API-KEY': ENV.STAKEKIT_API_KEY ?? '' } + +const fetchGet = async (path: string): Promise => { + const response = await fetch(baseUrl + path, { + headers + }) + return await response.json() +} +const fetchPatch = async (path: string, body: Body): Promise => { + const response = await fetch(baseUrl + path, { + method: 'PATCH', + headers, + body: JSON.stringify(body) + }) + return await response.json() +} +const fetchPost = async (path: string, body: Body): Promise => { + const response = await fetch(baseUrl + path, { + method: 'POST', + headers, + body: JSON.stringify(body) + }) + return await response.json() +} + +export const actionEnter = async (actionRequestDto: ActionRequestDto): Promise => { + return await fetchPost('/v1/actions/enter', actionRequestDto) +} +export const actionExit = async (actionRequestDto: ActionRequestDto): Promise => { + return await fetchPost('/v1/actions/exit', actionRequestDto) +} +export const actionPending = async (pendingActionRequestDto: PendingActionRequestDto): Promise => { + return await fetchPost('/v1/actions/pending', pendingActionRequestDto) +} +export const transactionConstruct = async (transactionId: string, constructTransactionRequestDto: ConstructTransactionRequestDto): Promise => { + return await fetchPatch(`/v1/transactions/${transactionId}`, constructTransactionRequestDto) +} +export const transactionSubmitHash = async (transactionId: string, submitHashRequestDto: SubmitHashRequestDto): Promise => { + await fetch(baseUrl + `/v1/transactions/${transactionId}/submit_hash`, { + method: 'POST', + headers, + body: JSON.stringify(submitHashRequestDto) + }) +} +export const yieldGetSingleYieldBalances = async (integrationId: string, yieldBalanceRequestDto: YieldBalanceRequestDto): Promise => { + return await fetchPost(`/v1/yields/${integrationId}/balances`, yieldBalanceRequestDto) +} +export const yieldYieldOpportunity = async (integrationId: string): Promise => { + return await fetchGet(`/v1/yields/${integrationId}`) +} diff --git a/yarn.lock b/yarn.lock index eca2563054c..eb833e99c46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2320,6 +2320,11 @@ find-up "^5.0.0" js-yaml "^4.1.0" +"@faker-js/faker@^8.3.1": + version "8.3.1" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.3.1.tgz#7753df0cb88d7649becf984a96dd1bd0a26f43e3" + integrity sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw== + "@fioprotocol/fiojs@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@fioprotocol/fiojs/-/fiojs-1.0.1.tgz#81779437603741bc4ca1c76d119b64c4157a3874" @@ -2920,6 +2925,28 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== +"@mswjs/cookies@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" + integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== + dependencies: + "@types/set-cookie-parser" "^2.4.0" + set-cookie-parser "^2.4.6" + +"@mswjs/interceptors@^0.17.10": + version "0.17.10" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" + integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== + dependencies: + "@open-draft/until" "^1.0.3" + "@types/debug" "^4.1.7" + "@xmldom/xmldom" "^0.8.3" + debug "^4.3.3" + headers-polyfill "3.2.5" + outvariant "^1.2.1" + strict-event-emitter "^0.2.4" + web-encoding "^1.1.5" + "@mymonero/mymonero-bigint@^1.4.2": version "1.4.2" resolved "https://registry.yarnpkg.com/@mymonero/mymonero-bigint/-/mymonero-bigint-1.4.2.tgz#23174269ffdb983181972f021fb237069d135a7f" @@ -3001,6 +3028,11 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@open-draft/until@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" + integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== + "@pnpm/network.ca-file@^1.0.1": version "1.0.2" resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" @@ -4006,6 +4038,17 @@ "@stablelib/random" "^1.0.2" "@stablelib/wipe" "^1.0.1" +"@stakekit/api-hooks@^0.0.52": + version "0.0.52" + resolved "https://registry.yarnpkg.com/@stakekit/api-hooks/-/api-hooks-0.0.52.tgz#25c3f67519a5be67b0d46e4c31f4e8d494238820" + integrity sha512-QF2l2y8fMRMg7ZH93I+YrERrLqsF60QZAjHzpihaAP64x/zjWU8PQ1oysKYynvFzIGpfh1fh/oW1d7KisqGUUw== + dependencies: + "@faker-js/faker" "^8.3.1" + "@tanstack/react-query" "^5.17.9" + axios "^1.6.5" + lodash.merge "^4.6.2" + msw "^2.0.13" + "@substrate/connect-extension-protocol@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz#fa5738039586c648013caa6a0c95c43265dbe77d" @@ -4136,6 +4179,18 @@ dependencies: defer-to-connect "^2.0.1" +"@tanstack/query-core@5.17.19": + version "5.17.19" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.17.19.tgz#212515ccc7a6b913afee6b71ce3e7df2c4d85f7d" + integrity sha512-Lzw8FUtnLCc9Jwz0sw9xOjZB+/mCCmJev38v2wHMUl/ioXNIhnNWeMxu0NKUjIhAd62IRB3eAtvxAGDJ55UkyA== + +"@tanstack/react-query@^5.17.9": + version "5.17.19" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.17.19.tgz#d6fc243faa469bb84952dd810faea47dabe389fc" + integrity sha512-qaQENB6/03Gj3dFZGvdmUoqeUGlGm7P1p0RmaR04Bf1Ib1T9lLGimcC9T3oCFbrx0b2ZF21ngjFZNjj9uPJMcg== + dependencies: + "@tanstack/query-core" "5.17.19" + "@tokenizer/token@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" @@ -4292,6 +4347,11 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + "@types/crypto-js@^3.1.43": version "3.1.47" resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-3.1.47.tgz#36e549dd3f1322742a3a738e7c113ebe48221860" @@ -4333,6 +4393,13 @@ resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-5.0.0.tgz#17ce64b0318f3f36d1c830c58a7a915445f1f93d" integrity sha512-SZg4JdHIWHQGEokbYGZSDvo5wA4TLYPXaqhigs/wH+REDOejcJzgH+qyY+HtEUtWOZxEUkbhbdYPqQDiEgrXeA== +"@types/debug@^4.1.7": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + "@types/duplexify@*": version "3.6.1" resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.1.tgz#5685721cf7dc4a21b6f0e8a8efbec6b4d2fbafad" @@ -4479,6 +4546,11 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/js-levenshtein@^1.1.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz#a6fd0bdc8255b274e5438e0bfb25f154492d1106" + integrity sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ== + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -4518,6 +4590,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + "@types/node-fetch@^2.6.2": version "2.6.2" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" @@ -4720,6 +4797,13 @@ "@types/mime" "^1" "@types/node" "*" +"@types/set-cookie-parser@^2.4.0": + version "2.4.7" + resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.7.tgz#4a341ed1d3a922573ee54db70b6f0a6d818290e7" + integrity sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg== + dependencies: + "@types/node" "*" + "@types/sha.js@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/sha.js/-/sha.js-2.4.1.tgz#d7c71b0035360cf120f0a8e8ed4a2eab07a0d51c" @@ -5310,6 +5394,11 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440" integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg== +"@xmldom/xmldom@^0.8.3": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + "@xmldom/xmldom@~0.7.0", "@xmldom/xmldom@~0.7.7": version "0.7.13" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" @@ -5347,6 +5436,11 @@ multiformats "^11.0.2" secp256k1 "^5.0.0" +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -5898,7 +5992,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@0.21.1, axios@0.21.2, axios@^0.18.0, axios@^0.19.0, axios@^0.26.1, axios@^1.3.2, axios@^1.6.0: +axios@0.21.1, axios@0.21.2, axios@^0.18.0, axios@^0.19.0, axios@^0.26.1, axios@^1.3.2, axios@^1.6.0, axios@^1.6.5: version "0.21.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== @@ -6992,10 +7086,10 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -chokidar@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== +chokidar@^3.4.2, chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -7466,6 +7560,11 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + cookiejar@^2.1.2: version "2.1.4" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" @@ -8016,7 +8115,7 @@ debug@2.6.9, debug@^2.2.0: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -10729,6 +10828,11 @@ graphql@15.8.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== +graphql@^16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + groestl-hash-js@^1.0.0, "groestl-hash-js@https://github.com/Groestlcoin/groestl-hash-js.git": version "1.0.0" resolved "https://github.com/Groestlcoin/groestl-hash-js.git#ef6a04f1c4d2f0448f0882b5f213ef7a0659baee" @@ -10834,6 +10938,11 @@ hdkey@1.1.1, hdkey@^1.1.1: safe-buffer "^5.1.1" secp256k1 "^3.0.1" +headers-polyfill@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" + integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== + hermes-estree@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.8.0.tgz#530be27243ca49f008381c1f3e8b18fb26bf9ec0" @@ -11171,6 +11280,27 @@ inquirer@8.2.0: strip-ansi "^6.0.0" through "^2.3.6" +inquirer@^8.2.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + internal-ip@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -11416,6 +11546,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-npm@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" @@ -12156,6 +12291,11 @@ jpeg-js@^0.4.2: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-sha256@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" @@ -13488,6 +13628,31 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@1.3.2, msw@^2.0.13: + version "1.3.2" + resolved "https://registry.yarnpkg.com/msw/-/msw-1.3.2.tgz#35e0271293e893fc3c55116e90aad5d955c66899" + integrity sha512-wKLhFPR+NitYTkQl5047pia0reNGgf0P6a1eTnA5aNlripmiz0sabMvvHcicE8kQ3/gZcI0YiPFWmYfowfm3lA== + dependencies: + "@mswjs/cookies" "^0.2.2" + "@mswjs/interceptors" "^0.17.10" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/js-levenshtein" "^1.1.1" + chalk "^4.1.1" + chokidar "^3.4.2" + cookie "^0.4.2" + graphql "^16.8.1" + headers-polyfill "3.2.5" + inquirer "^8.2.0" + is-node-process "^1.2.0" + js-levenshtein "^1.1.6" + node-fetch "^2.6.7" + outvariant "^1.4.0" + path-to-regexp "^6.2.0" + strict-event-emitter "^0.4.3" + type-fest "^2.19.0" + yargs "^17.3.1" + multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -14111,6 +14276,11 @@ osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +outvariant@^1.2.1, outvariant@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" + integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== + p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" @@ -14387,6 +14557,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-to-regexp@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -15941,7 +16116,7 @@ rxjs@6, rxjs@6.6.7, rxjs@^6.6.7: dependencies: tslib "^1.9.0" -rxjs@^7.2.0, rxjs@^7.8.1: +rxjs@^7.2.0, rxjs@^7.5.5, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -16223,6 +16398,11 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-cookie-parser@^2.4.6: + version "2.6.0" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" + integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== + set-immediate-shim@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -16709,6 +16889,18 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +strict-event-emitter@^0.2.4: + version "0.2.8" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" + integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== + dependencies: + events "^3.3.0" + +strict-event-emitter@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" + integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -17551,7 +17743,7 @@ type-fest@^1.0.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^2.13.0: +type-fest@^2.13.0, type-fest@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== @@ -17909,16 +18101,15 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== +util@^0.12.0, util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" is-arguments "^1.0.4" is-generator-function "^1.0.7" is-typed-array "^1.1.3" - safe-buffer "^5.1.2" which-typed-array "^1.1.2" utils-merge@1.0.1: @@ -18062,6 +18253,15 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-encoding@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + web-streams-polyfill@^3.0.3: version "3.2.1" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" @@ -18605,7 +18805,7 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==