diff --git a/packages/neuron-ui/package.json b/packages/neuron-ui/package.json index 344fbf9f61..380d5ccc10 100644 --- a/packages/neuron-ui/package.json +++ b/packages/neuron-ui/package.json @@ -50,6 +50,7 @@ "last 2 chrome versions" ], "dependencies": { + "@ckb-connect/walletconnect-wallet-sdk": "0.0.1-alpha.2", "@ckb-lumos/base": "0.21.0-next.2", "@ckb-lumos/codec": "0.21.0-next.2", "@nervosnetwork/ckb-sdk-core": "0.109.0", diff --git a/packages/neuron-ui/src/components/CameraScanDialog/cameraScanDialog.module.scss b/packages/neuron-ui/src/components/CameraScanDialog/cameraScanDialog.module.scss new file mode 100644 index 0000000000..1f22c10d72 --- /dev/null +++ b/packages/neuron-ui/src/components/CameraScanDialog/cameraScanDialog.module.scss @@ -0,0 +1,15 @@ +@import '../../styles'; + +.container { + margin-bottom: 8px; + padding: 0 16px; + + .scanBox { + border: 2px solid var(--primary-color); + width: 400px; + height: 400px; + display: flex; + justify-content: center; + align-items: center; + } +} diff --git a/packages/neuron-ui/src/components/CameraScanDialog/index.tsx b/packages/neuron-ui/src/components/CameraScanDialog/index.tsx new file mode 100644 index 0000000000..3002f247cb --- /dev/null +++ b/packages/neuron-ui/src/components/CameraScanDialog/index.tsx @@ -0,0 +1,126 @@ +import React, { useEffect, useRef, useCallback, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { askForCameraAccess } from 'services/remote' +import Dialog from 'widgets/Dialog' +import LoadingDialog from 'widgets/LoadingDialog' +import AlertDialog from 'widgets/AlertDialog' +import { isSuccessResponse } from 'utils' +import jsQR from 'jsqr' + +import styles from './cameraScanDialog.module.scss' + +const IMAGE_SIZE = 400 + +export interface Point { + x: number + y: number +} + +const CameraScanDialog = ({ close, onConfirm }: { close: () => void; onConfirm: (result: string) => void }) => { + const [t] = useTranslation() + const videoRef = useRef() + const canvasRef = useRef(null) + const canvas2dRef = useRef() + const [dialogType, setDialogType] = useState<'' | 'opening' | 'access-fail' | 'scan'>('') + + const drawLine = (begin: Point, end: Point) => { + if (!canvas2dRef.current) return + canvas2dRef.current.beginPath() + canvas2dRef.current.moveTo(begin.x, begin.y) + canvas2dRef.current.lineTo(end.x, end.y) + canvas2dRef.current.lineWidth = 4 + canvas2dRef.current.strokeStyle = '#00c891' + canvas2dRef.current.stroke() + } + + const scan = useCallback(() => { + if (videoRef.current?.readyState === HTMLMediaElement.HAVE_ENOUGH_DATA) { + setDialogType('scan') + const canvas2d = canvasRef.current?.getContext('2d') + if (canvas2d) { + canvas2d.drawImage(videoRef.current, 0, 0, IMAGE_SIZE, IMAGE_SIZE) + canvas2dRef.current = canvas2d + const imageData = canvas2d.getImageData(0, 0, IMAGE_SIZE, IMAGE_SIZE) + const code = jsQR(imageData.data, imageData.width, imageData.height, { + inversionAttempts: 'dontInvert', + }) + if (code) { + drawLine(code.location.topLeftCorner, code.location.topRightCorner) + drawLine(code.location.topRightCorner, code.location.bottomRightCorner) + drawLine(code.location.bottomRightCorner, code.location.bottomLeftCorner) + drawLine(code.location.bottomLeftCorner, code.location.topLeftCorner) + onConfirm(code.data) + } + } + } + requestAnimationFrame(scan) + }, [setDialogType]) + + useEffect(() => { + let mediaStream: MediaStream + + askForCameraAccess().then(accessRes => { + if (isSuccessResponse(accessRes)) { + setDialogType('opening') + navigator.mediaDevices + .getUserMedia({ + audio: false, + video: { width: IMAGE_SIZE, height: IMAGE_SIZE }, + }) + .then(res => { + if (res) { + videoRef.current = document.createElement('video') + videoRef.current.srcObject = res + videoRef.current.play() + mediaStream = res + requestAnimationFrame(scan) + } + }) + } else { + setDialogType('access-fail') + } + }) + + return () => { + if (mediaStream) { + mediaStream.getTracks().forEach(track => { + track.stop() + }) + } + } + }, []) + + return ( + <> + +
+
+ +
+
+
+ + + + { + close() + }} + /> + + ) +} + +CameraScanDialog.displayName = 'CameraScanDialog' +export default CameraScanDialog diff --git a/packages/neuron-ui/src/components/ScreenScanDialog/index.tsx b/packages/neuron-ui/src/components/ScreenScanDialog/index.tsx new file mode 100644 index 0000000000..c3274f6151 --- /dev/null +++ b/packages/neuron-ui/src/components/ScreenScanDialog/index.tsx @@ -0,0 +1,75 @@ +import React, { useEffect, useState, useCallback } from 'react' +import { captureScreen } from 'services/remote' +import { isSuccessResponse } from 'utils' +import { useTranslation } from 'react-i18next' +import AlertDialog from 'widgets/AlertDialog' +import LoadingDialog from 'widgets/LoadingDialog' +import jsQR from 'jsqr' + +const ScreenScanDialog = ({ close, onConfirm }: { close: () => void; onConfirm: (result: string[]) => void }) => { + const [t] = useTranslation() + const [dialogType, setDialogType] = useState<'' | 'scanning' | 'access-fail'>('') + + const handleScanResult = useCallback(async (sources: Controller.CaptureScreenSource[]) => { + const uriList = [] as string[] + + const callArr = sources.map(async item => { + const image = new Image() + image.src = item.dataUrl + await new Promise(resolve => { + image.addEventListener('load', resolve) + }) + + const canvas = document.createElement('canvas') + canvas.width = image.width + canvas.height = image.height + const context = canvas.getContext('2d') + if (context) { + context.imageSmoothingEnabled = false + context.drawImage(image, 0, 0) + const imageData = context.getImageData(0, 0, image.width, image.height) + const code = jsQR(imageData.data, image.width, image.height, { + inversionAttempts: 'dontInvert', + }) + if (code?.data) { + uriList.push(code.data) + } + } + }) + + await Promise.all(callArr) + + onConfirm(uriList) + }, []) + + useEffect(() => { + captureScreen().then(res => { + if (isSuccessResponse(res)) { + setDialogType('scanning') + const result = res.result as Controller.CaptureScreenSource[] + handleScanResult(result) + } else { + setDialogType('access-fail') + } + }) + }, []) + + return ( + <> + + + { + close() + }} + /> + + ) +} + +ScreenScanDialog.displayName = 'ScreenScanDialog' +export default ScreenScanDialog diff --git a/packages/neuron-ui/src/components/SignAndVerify/index.tsx b/packages/neuron-ui/src/components/SignAndVerify/index.tsx index d8cd73ea1d..da6db593fe 100644 --- a/packages/neuron-ui/src/components/SignAndVerify/index.tsx +++ b/packages/neuron-ui/src/components/SignAndVerify/index.tsx @@ -32,7 +32,7 @@ interface PasswordDialogProps { onSubmit: (pwd: string) => Promise } -const PasswordDialog = ({ show, walletName, onCancel, onSubmit }: PasswordDialogProps) => { +export const PasswordDialog = ({ show, walletName, onCancel, onSubmit }: PasswordDialogProps) => { const [t, i18n] = useTranslation() const [password, setPassword] = useState('') const [error, setError] = useState('') diff --git a/packages/neuron-ui/src/components/WCSignTransactionDialog/index.tsx b/packages/neuron-ui/src/components/WCSignTransactionDialog/index.tsx new file mode 100644 index 0000000000..b0c6b544a0 --- /dev/null +++ b/packages/neuron-ui/src/components/WCSignTransactionDialog/index.tsx @@ -0,0 +1,242 @@ +import React, { useState, useCallback, useEffect } from 'react' +import { useNavigate } from 'react-router-dom' +import { useTranslation } from 'react-i18next' +import TextField from 'widgets/TextField' +import Dialog from 'widgets/Dialog' +import { ErrorCode, isSuccessResponse, errorFormatter } from 'utils' +import { + useState as useGlobalState, + useDispatch, + AppActions, + sendTransaction, + sendCreateSUDTAccountTransaction, + sendSUDTTransaction, +} from 'states' +import { SessionRequest } from '@ckb-connect/walletconnect-wallet-sdk' +import { OfflineSignType, OfflineSignStatus, signAndExportTransaction, signTransactionOnly } from 'services/remote' +import { PasswordIncorrectException } from 'exceptions' +import styles from './wcSignTransactionDialog.module.scss' + +const WCSignTransactionDialog = ({ + wallet, + event, + onDismiss, + onApproveRequest, +}: { + wallet: State.Wallet + event: SessionRequest + onDismiss: () => void + onApproveRequest: (event: SessionRequest, options: any) => void +}) => { + const { + app: { + send: { description }, + }, + experimental, + } = useGlobalState() + + const walletID = wallet.id + const data = event.params.request.params + const { + transaction, + type: signType = OfflineSignType.Regular, + status: signStatus = OfflineSignStatus.Unsigned, + asset_account: assetAccount, + actionType, + } = data + + const isBroadcast = actionType === 'signAndSend' + + const dispatch = useDispatch() + const [t] = useTranslation() + const navigate = useNavigate() + + const [password, setPassword] = useState('') + const [error, setError] = useState('') + const [isSigning, setIsSigning] = useState(false) + + useEffect(() => { + setPassword('') + setError('') + }, [signType, setError, setPassword]) + + const disabled = !password || isSigning + + const signAndExport = useCallback(async () => { + const res = await signAndExportTransaction({ + transaction, + type: signType, + status: signStatus, + walletID, + password, + }) + if (!isSuccessResponse(res)) { + setError(errorFormatter(res.message, t)) + return + } + dispatch({ + type: AppActions.UpdateLoadedTransaction, + payload: res.result!, + }) + onDismiss() + }, [data, dispatch, onDismiss, t, password, walletID]) + + const sign = useCallback(async () => { + const res = await signTransactionOnly({ + transaction, + type: signType, + status: signStatus, + walletID, + password, + }) + if (!isSuccessResponse(res)) { + setError(errorFormatter(res.message, t)) + return + } + onApproveRequest(event, res.result) + onDismiss() + }, [data, dispatch, onDismiss, t, password, walletID]) + + const onSubmit = useCallback( + async (e?: React.FormEvent) => { + if (e) { + e.preventDefault() + } + if (disabled) { + return + } + setIsSigning(true) + if (!isBroadcast) { + await sign() + setIsSigning(false) + return + } + try { + switch (signType) { + case OfflineSignType.Regular: { + if (isSigning) { + break + } + await sendTransaction({ walletID, tx: transaction, description, password })(dispatch).then(res => { + if (isSuccessResponse(res.status)) { + onApproveRequest(event, res.result) + onDismiss() + } else if (res.status === ErrorCode.PasswordIncorrect) { + throw new PasswordIncorrectException() + } + }) + break + } + case OfflineSignType.UnlockDAO: { + if (isSigning) { + break + } + await sendTransaction({ walletID, tx: transaction, description, password })(dispatch).then(res => { + if (isSuccessResponse(res)) { + onApproveRequest(event, res.result) + onDismiss() + } else if (res.status === ErrorCode.PasswordIncorrect) { + throw new PasswordIncorrectException() + } + }) + break + } + case OfflineSignType.CreateSUDTAccount: { + const params: Controller.SendCreateSUDTAccountTransaction.Params = { + walletID, + assetAccount: assetAccount ?? experimental?.assetAccount, + tx: transaction, + password, + } + await sendCreateSUDTAccountTransaction(params)(dispatch).then(res => { + if (isSuccessResponse(res)) { + onApproveRequest(event, res.result) + onDismiss() + } else if (res.status === ErrorCode.PasswordIncorrect) { + throw new PasswordIncorrectException() + } + }) + break + } + case OfflineSignType.SendSUDT: { + const params: Controller.SendSUDTTransaction.Params = { + walletID, + tx: transaction, + password, + } + await sendSUDTTransaction(params)(dispatch).then(res => { + if (isSuccessResponse(res)) { + onApproveRequest(event, res.result) + onDismiss() + } else if (res.status === ErrorCode.PasswordIncorrect) { + throw new PasswordIncorrectException() + } + }) + break + } + default: { + break + } + } + } catch (err) { + if (err instanceof PasswordIncorrectException) { + setError(t(err.message)) + } + } + }, + [ + dispatch, + walletID, + password, + signType, + description, + navigate, + isSigning, + transaction, + disabled, + experimental, + setError, + t, + isBroadcast, + signAndExport, + assetAccount, + ] + ) + + const onChange = useCallback( + (e: React.SyntheticEvent) => { + const { value } = e.target as HTMLInputElement + setPassword(value) + setError('') + }, + [setPassword, setError] + ) + + return ( + + + + ) +} + +WCSignTransactionDialog.displayName = 'WCSignTransactionDialog' + +export default WCSignTransactionDialog diff --git a/packages/neuron-ui/src/components/WCSignTransactionDialog/wcSignTransactionDialog.module.scss b/packages/neuron-ui/src/components/WCSignTransactionDialog/wcSignTransactionDialog.module.scss new file mode 100644 index 0000000000..e3a4d64707 --- /dev/null +++ b/packages/neuron-ui/src/components/WCSignTransactionDialog/wcSignTransactionDialog.module.scss @@ -0,0 +1,10 @@ +@import '../../styles/mixin.scss'; + +.content { + width: 648px; + padding: 16px 16px 0; +} + +.passwordInput { + margin-top: 16px; +} diff --git a/packages/neuron-ui/src/components/WalletConnect/ItemComponents.tsx b/packages/neuron-ui/src/components/WalletConnect/ItemComponents.tsx new file mode 100644 index 0000000000..2c27c9fa59 --- /dev/null +++ b/packages/neuron-ui/src/components/WalletConnect/ItemComponents.tsx @@ -0,0 +1,245 @@ +import React, { useState, useCallback } from 'react' +import { useTranslation } from 'react-i18next' +import Button from 'widgets/Button' +import { clsx, shannonToCKBFormatter, isMainnet as isMainnetUtil } from 'utils' +import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { useState as useGlobalState } from 'states' +import { Proposal, Session, SessionRequest, SignTransactionParams } from '@ckb-connect/walletconnect-wallet-sdk' +import { DetailIcon } from 'widgets/Icons/icon' +import styles from './walletConnect.module.scss' + +interface PrososalItemProps { + data: Proposal + key: string + onApproveSession: (id: string, scriptBases: string[]) => void + onRejectSession: (e: React.SyntheticEvent) => void + userName: string + supportedScriptBases: Record +} + +export const PrososalItem = ({ + data, + key, + onApproveSession, + onRejectSession, + userName, + supportedScriptBases, +}: PrososalItemProps) => { + const [t] = useTranslation() + const scriptBases = + Object.values(supportedScriptBases).filter(item => data?.params?.sessionProperties?.scriptBases?.includes(item)) || + [] + + const initScriptBases = scriptBases.length ? scriptBases : Object.keys(scriptBases) + const [selectHashes, setSelectHashes] = useState(initScriptBases) + const metadata = data?.params?.proposer?.metadata || {} + + const onChangeChecked = useCallback( + (e: React.ChangeEvent) => { + const { hash } = e.target.dataset + if (hash) { + if (e.target.checked && !selectHashes.includes(hash)) { + setSelectHashes([...selectHashes, hash]) + } else { + setSelectHashes(selectHashes.filter(v => v !== hash)) + } + } + }, + [selectHashes, setSelectHashes] + ) + + const handleApprove = useCallback( + async (e: React.ChangeEvent) => { + const { id } = e.target.dataset + if (id) { + await onApproveSession(id, selectHashes) + } + }, + [onApproveSession, selectHashes] + ) + + return ( +
+
+

{metadata.name}

+
+

+ {t('wallet-connect.user-name')}: {userName} +

+
Lock Hash:
+
+ {Object.entries(supportedScriptBases).map(([hashName, hash]) => ( + + ))} +
+
+

{metadata.url}

+
+
+ + +
+
+ ) +} + +interface SessionItemProps { + data: Session + key: string + onDisconnect: (e: React.SyntheticEvent) => void + userName: string + supportedScriptBases: Record +} + +export const SessionItem = ({ data, key, onDisconnect, userName, supportedScriptBases }: SessionItemProps) => { + const [t] = useTranslation() + const scriptBases = data?.sessionProperties?.scriptBases || '' + const { name = '', url = '' } = data?.peer?.metadata || {} + + return ( +
+
+

{name}

+
+

+ {t('wallet-connect.user-name')}: {userName} +

+
Lock Hash:
+
+ {Object.entries(supportedScriptBases).map(([hashName, hash]) => ( + + ))} +
+
+

{url}

+
+ + +
+ ) +} + +interface MessageItemProps { + data: SessionRequest + key: string + approve: (e: React.SyntheticEvent) => void + sessions: Session[] + onRejectRequest: (e: React.SyntheticEvent) => void +} + +export const MessageItem = ({ data, approve, sessions, onRejectRequest, key }: MessageItemProps) => { + const [t] = useTranslation() + const session = sessions.find(item => item.topic === data.topic) + const { name = '', url = '' } = session?.peer?.metadata || {} + + return ( +
+
+

+ {name} {url} +

+

+ {t('wallet-connect.sign-info')}: {data.params.request.params.message} +

+
+
+ + +
+
+ ) +} + +interface TransactionItemProps { + data: SessionRequest + key: string + approve: (e: React.SyntheticEvent) => void + sessions: Session[] + onRejectRequest: (e: React.SyntheticEvent) => void +} + +export const TransactionItem = ({ data, approve, sessions, onRejectRequest, key }: TransactionItemProps) => { + const { + chain: { networkID }, + settings: { networks }, + } = useGlobalState() + const [t] = useTranslation() + const isMainnet = isMainnetUtil(networks, networkID) + const session = sessions.find(item => item.topic === data.topic) + const { name = '', url = '' } = session?.peer?.metadata || {} + const params = data.params.request.params as SignTransactionParams + + const { outputs = [], fee, description } = params.transaction + const firstOutputAddress = outputs.length ? scriptToAddress(outputs[0].lock, isMainnet) : '' + const capacity = outputs.reduce((pre, cur) => BigInt(pre) + BigInt(cur.capacity), BigInt(0)).toString() + + return ( +
+
+

+ {name} {url} +

+

+ {t('wallet-connect.transfer-info')}: {params.description} +

+ +
+
+

{t('transaction.address')}

+

+ + {firstOutputAddress.slice(0, 16)}...{firstOutputAddress.slice(-16)} + {' '} + (+{outputs.length} addresses) +

+

{t('send.fee')}

+

{shannonToCKBFormatter(fee)}

+

{t('send.description')}

+

{description}

+ +
+
+

{t('transaction.amount')}

+

{shannonToCKBFormatter(capacity)}

+

{t('wallet-connect.locked-period')}

+

-

+
+
+ +
+ + +
+
+
+ ) +} diff --git a/packages/neuron-ui/src/components/WalletConnect/hooks.ts b/packages/neuron-ui/src/components/WalletConnect/hooks.ts new file mode 100644 index 0000000000..53b00b15f6 --- /dev/null +++ b/packages/neuron-ui/src/components/WalletConnect/hooks.ts @@ -0,0 +1,73 @@ +import { useCallback, useMemo } from 'react' +import { useState as useGlobalState } from 'states' +import { connect, disconnect, approveSession, rejectSession, approveRequest, rejectRequest } from 'services/remote' +import { ControllerResponse } from 'services/remote/remoteApiWrapper' +import { SessionRequest } from '@ckb-connect/walletconnect-wallet-sdk' + +export const useWalletConnect = () => { + const { + walletConnect: { proposals, sessions, requests, identity, supportedScriptBases = {} }, + } = useGlobalState() + + const onConnect = useCallback(async (uri: string) => { + const res: ControllerResponse = await connect(uri) + return res + }, []) + + const onDisconnect = useCallback(async (e: React.SyntheticEvent) => { + const { topic } = e.currentTarget.dataset + if (topic) { + await disconnect(topic) + } + }, []) + + const onApproveSession = useCallback(async (id, scriptBases) => { + const res: ControllerResponse = await approveSession({ + id: Number(id), + scriptBases, + }) + return res + }, []) + + const onRejectSession = useCallback(async (e: React.SyntheticEvent) => { + const { id } = e.currentTarget.dataset + await rejectSession({ id: Number(id) }) + }, []) + + const onApproveRequest = useCallback( + async (event: SessionRequest, options: any) => { + const res: ControllerResponse = await approveRequest({ event, options }) + return res + }, + [requests] + ) + + const onRejectRequest = useCallback( + async (e: React.SyntheticEvent) => { + const { id } = e.currentTarget.dataset + const event = requests.find(item => item.id === Number(id)) + if (event) { + await rejectRequest({ event }) + } + }, + [requests] + ) + + const userName = useMemo(() => `${identity.slice(0, 6)}...${identity.slice(-6)}`, [identity]) + + return { + proposals, + sessions, + requests, + supportedScriptBases, + onConnect, + onDisconnect, + onRejectRequest, + onApproveRequest, + onRejectSession, + onApproveSession, + userName, + } +} + +export const useSession = () => {} diff --git a/packages/neuron-ui/src/components/WalletConnect/index.tsx b/packages/neuron-ui/src/components/WalletConnect/index.tsx new file mode 100644 index 0000000000..9f49bf5593 --- /dev/null +++ b/packages/neuron-ui/src/components/WalletConnect/index.tsx @@ -0,0 +1,301 @@ +import React, { useState, useCallback } from 'react' +import { useState as useGlobalState } from 'states' +import PageContainer from 'components/PageContainer' +import { useTranslation } from 'react-i18next' +import TextField from 'widgets/TextField' +import Button from 'widgets/Button' +import TableNoData from 'widgets/Icons/TableNoData.png' +import LoadingDialog from 'widgets/LoadingDialog' +import Dialog from 'widgets/Dialog' +import AlertDialog from 'widgets/AlertDialog' +import { PasswordDialog } from 'components/SignAndVerify' +import WCSignTransactionDialog from 'components/WCSignTransactionDialog' +import CameraScanDialog from 'components/CameraScanDialog' +import ScreenScanDialog from 'components/ScreenScanDialog' +import { showErrorMessage, signMessage } from 'services/remote' +import { ControllerResponse } from 'services/remote/remoteApiWrapper' +import { clsx, ErrorCode, isSuccessResponse } from 'utils' +import { Experiment, WalletConnect as WalletConnectIcon, Scan, ScanScreen, NumberScan } from 'widgets/Icons/icon' +import { SessionRequest } from '@ckb-connect/walletconnect-wallet-sdk' +import { useWalletConnect } from './hooks' +import { SessionItem, PrososalItem, MessageItem, TransactionItem } from './ItemComponents' +import styles from './walletConnect.module.scss' + +type DialogType = 'connecting' | 'invalid-qrcode' | 'uri' | 'camera' | 'screen' | 'pwd' | 'signTransaction' | '' + +const WalletConnect = () => { + const { wallet } = useGlobalState() + const [t] = useTranslation() + const [uri, setUri] = useState('') + const [dialogType, setDialogType] = useState('') + const [currentEvent, setCurrentEvent] = useState() + + const { + proposals, + sessions, + requests, + supportedScriptBases, + onConnect, + onDisconnect, + onRejectRequest, + onApproveRequest, + onRejectSession, + onApproveSession, + userName, + } = useWalletConnect() + + const openConnectDialog = useCallback( + (e: React.SyntheticEvent) => { + const { cntype = '' } = e.currentTarget.dataset + setDialogType(cntype as DialogType) + }, + [setDialogType] + ) + + const handleUriChange = useCallback( + (e: React.SyntheticEvent) => { + const { value } = e.target as HTMLInputElement + setUri(value) + }, + [setUri] + ) + + const handleConnect = useCallback( + async (url: string | string[]) => { + setDialogType('connecting') + setUri('') + + const urlArr = typeof url === 'string' ? [url] : url + + if (!urlArr.length) { + setDialogType('invalid-qrcode') + return + } + + let successFlag = true + const callArr = urlArr.map(async item => { + const res = await onConnect(item) + if (!isSuccessResponse(res)) { + successFlag = false + } + }) + + await Promise.all(callArr) + + if (successFlag) { + setTimeout(() => { + setDialogType('') + }, 2000) + } else { + setDialogType('invalid-qrcode') + } + }, + [uri, setUri, setDialogType] + ) + + const hasConnect = proposals.length || sessions.length + + const approveSignMessage = useCallback( + item => { + setCurrentEvent(item) + setDialogType('pwd') + }, + [setCurrentEvent, setDialogType] + ) + + const approveSignTransaction = useCallback( + item => { + setCurrentEvent(item) + setDialogType('signTransaction') + }, + [setCurrentEvent, setDialogType] + ) + + const handleSignMessage = useCallback( + async password => { + const { address, message } = currentEvent!.params.request.params + const res: ControllerResponse = await signMessage({ + walletID: wallet?.id ?? '', + address, + message, + password, + }) + if (isSuccessResponse(res)) { + onApproveRequest(currentEvent!, res.result) + setDialogType('') + } else if (res.status === ErrorCode.PasswordIncorrect) { + // pass through this kind of error + } else if (res.status === ErrorCode.AddressNotFound) { + setDialogType('') + showErrorMessage('Error', 'address-not-found') + } else { + setDialogType('') + showErrorMessage('Error', 'Fail to sign the message') + } + return res + }, + [setDialogType, onApproveRequest, currentEvent] + ) + + const onDismiss = useCallback(() => { + setDialogType('') + setUri('') + setCurrentEvent(undefined) + }, [setDialogType]) + + return ( + + +

{t('wallet-connect.title')}

+ + } + > +
+
+ +
+

{t('wallet-connect.add-title')}

+ +
+ + + +
+
+
+ +
+ {hasConnect ? ( + <> + {sessions.length ? ( + <> +

{t('wallet-connect.connected-session')}

+ {sessions.map(item => ( + + ))} + + ) : null} + + {proposals.length ? ( + <> +

{t('wallet-connect.session-request')}

+ {proposals.map(item => ( + + ))} + + ) : null} + + ) : ( +
+

{t('wallet-connect.session-request')}

+ No Data + {t('wallet-connect.no-session')} +
+ )} +
+ + {requests.length ? ( +
+

{t('wallet-connect.sign-request')}

+ {requests.map(item => ( + <> + {item.params.request.method === 'ckb_signMessage' ? ( + approveSignMessage(item)} + sessions={sessions} + onRejectRequest={onRejectRequest} + /> + ) : null} + {item.params.request.method === 'ckb_signTransaction' ? ( + approveSignTransaction(item)} + sessions={sessions} + onRejectRequest={onRejectRequest} + /> + ) : null} + + ))} +
+ ) : null} +
+ + + + {dialogType === 'uri' ? ( + handleConnect(uri)} + disabled={!uri} + onCancel={onDismiss} + > +
+ +
+
+ ) : null} + + {dialogType === 'camera' ? setDialogType('')} onConfirm={handleConnect} /> : null} + + {dialogType === 'screen' ? setDialogType('')} onConfirm={handleConnect} /> : null} + + { + setDialogType('') + }} + /> + + {dialogType === 'pwd' && currentEvent ? ( + + ) : null} + + {dialogType === 'signTransaction' && currentEvent ? ( + + ) : null} +
+ ) +} + +WalletConnect.displayName = 'WalletConnect' + +export default WalletConnect diff --git a/packages/neuron-ui/src/components/WalletConnect/walletConnect.module.scss b/packages/neuron-ui/src/components/WalletConnect/walletConnect.module.scss new file mode 100644 index 0000000000..d49d411e18 --- /dev/null +++ b/packages/neuron-ui/src/components/WalletConnect/walletConnect.module.scss @@ -0,0 +1,208 @@ +@import '../../styles/mixin.scss'; +.pageHeader { + display: flex; + align-items: center; + p { + margin: 0 8px 0 5px; + } + svg { + g, + path { + fill: var(--main-text-color); + } + } +} + +.container { + p { + margin: 0; + } + .panel { + padding: 24px; + margin-bottom: 16px; + border-radius: 16px; + background: var(--secondary-background-color); + .title { + color: var(--main-text-color); + font-size: 16px; + font-weight: 500; + } + .mt24 { + margin-top: 24px; + } + } + .connectWrap { + position: relative; + .numberScan { + display: none; + } + .content { + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + button { + padding: 0 24px; + svg { + margin-right: 4px; + } + } + .scanBtn { + margin-left: 12px; + svg { + g, + path { + fill: var(--primary-text-color); + } + } + } + .tipBtn { + display: block; + margin: 16px auto 0; + font-size: 12px; + height: 16px; + } + } + &[data-empty='false'] { + .numberScan { + display: block; + position: absolute; + top: 8px; + right: 8px; + height: 16px; + min-width: 16px; + } + .content { + flex-direction: row; + justify-content: space-between; + button { + font-size: 14px; + height: 44px; + } + .logo { + display: none; + } + .tipBtn { + display: none; + } + } + } + } + + .itemWrap { + margin-top: 16px; + padding: 16px; + border-radius: 12px; + border: 1px solid var(--divide-line-color); + display: flex; + justify-content: space-between; + align-items: center; + @include checkbox; + button { + height: 44px; + min-width: 124px; + } + .dangerBtn { + &:hover { + border-color: var(--error-color); + color: var(--error-color); + } + } + .title { + font-size: 14px; + span { + color: var(--third-text-color); + font-weight: 400; + margin-left: 8px; + } + } + .nameWrap { + display: flex; + p { + padding-right: 8px; + margin-right: 8px; + border-right: 1px solid var(--divide-line-color); + } + } + .itemContent { + display: flex; + flex-direction: column; + gap: 10px; + color: var(--third-text-color); + .hashWrap { + margin-left: 12px; + display: flex; + gap: 8px; + } + } + } + + .transactionItem { + display: block; + } +} + +.ml12 { + margin-left: 12px; +} + +.noRecords { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + font-size: 14px; +} + +.uriDialog { + width: 400px; + padding: 24px 24px 0; +} +.infoContent { + padding: 16px; + border-radius: 8px; + background: var(--input-disabled-color); + display: flex; + div { + flex: 1; + h3 { + color: var(--input-second-color); + margin-bottom: 8px; + display: block; + font-size: 14px; + } + .address { + font-weight: 500; + font-family: 'JetBrains Mono'; + } + p { + margin-bottom: 16px; + color: var(--main-text-color); + } + } + .detailButton { + display: flex; + border: none; + background: inherit; + padding: unset; + align-items: center; + color: var(--secondary-text-color); + gap: 5px; + cursor: pointer; + + &:hover { + color: var(--primary-color); + svg > path { + fill: var(--primary-color); + } + } + } +} + +.rightActions { + display: flex; + margin-top: 16px; + justify-content: flex-end; + gap: 12px; +} diff --git a/packages/neuron-ui/src/containers/Navbar/index.tsx b/packages/neuron-ui/src/containers/Navbar/index.tsx index 6c38bdbfe7..8b935db307 100644 --- a/packages/neuron-ui/src/containers/Navbar/index.tsx +++ b/packages/neuron-ui/src/containers/Navbar/index.tsx @@ -3,8 +3,15 @@ import { createPortal } from 'react-dom' import { useLocation, NavLink, useNavigate } from 'react-router-dom' import { useTranslation } from 'react-i18next' import { NeuronWalletActions, showGlobalAlertDialog, useDispatch, useState as useGlobalState } from 'states' -import { VerifyExternalCkbNodeRes, checkForUpdates, getVersion, verifyExternalCkbNode } from 'services/remote' -import { AppUpdater as AppUpdaterSubject } from 'services/subjects' +import { + VerifyExternalCkbNodeRes, + checkForUpdates, + getVersion, + verifyExternalCkbNode, + getWCState, +} from 'services/remote' +import { AppUpdater as AppUpdaterSubject, WalletConnectUpdate as WalletConnectUpdateSubject } from 'services/subjects' +import { AppActions } from 'states/stateProvider/reducer' import Badge from 'widgets/Badge' import Logo from 'widgets/Icons/Logo.png' import { Overview, History, NervosDAO, Settings, Experimental, MenuExpand, ArrowNext } from 'widgets/Icons/icon' @@ -28,6 +35,11 @@ const menuItems = [ children: [ { name: 'navbar.special-assets', key: RoutePath.SpecialAssets, url: RoutePath.SpecialAssets }, { name: 'navbar.s-udt', key: RoutePath.SUDTAccountList, url: RoutePath.SUDTAccountList }, + { + name: 'navbar.wallet-connect', + key: RoutePath.WalletConnect, + url: RoutePath.WalletConnect, + }, ], }, ] @@ -79,8 +91,16 @@ const Navbar = () => { } const appUpdaterSubscription = AppUpdaterSubject.subscribe(onAppUpdaterUpdates) + const walletConnectUpdateSubscription = WalletConnectUpdateSubject.subscribe(payload => { + dispatch({ + type: AppActions.UpdateWalletConnectState, + payload, + }) + }) + return () => { appUpdaterSubscription.unsubscribe() + walletConnectUpdateSubscription.unsubscribe() } }, [dispatch]) @@ -107,6 +127,23 @@ const Navbar = () => { } }, [network?.readonly]) + useEffect(() => { + verifyExternalCkbNode().then(res => { + if (isSuccessResponse(res) && res.result) { + setVerifyCkbResult(res.result) + } + }) + + getWCState().then(res => { + if (isSuccessResponse(res) && res.result) { + dispatch({ + type: AppActions.UpdateWalletConnectState, + payload: res.result, + }) + } + }) + }, []) + useEffect(() => { // isUpdated is true or version is not empty means check update has return if (!verifyCkbResult || (isUpdated !== true && !version)) { diff --git a/packages/neuron-ui/src/locales/en.json b/packages/neuron-ui/src/locales/en.json index 0720469ccc..5ad05c009b 100644 --- a/packages/neuron-ui/src/locales/en.json +++ b/packages/neuron-ui/src/locales/en.json @@ -23,6 +23,7 @@ "connecting": "Connecting", "experimental-functions": "Experimental", "s-udt": "Asset Accounts", + "wallet-connect": "Wallet Connect", "update-neuron-with-ckb": "The version of the CKB node does not match Neuron (v{{ version }}), which may cause compatibility issues. Please update to the latest version of Neuron.", "ckb-node-compatible": "CKB node is not compatible with Neuron (v{{ version }}), please check before further operation.", "ckb-without-indexer": "Please add '--indexer' option to start local node" @@ -1141,6 +1142,44 @@ "locate-first-tx": "Locate the first transaction", "view-block": "View the block" }, + "wallet-connect": { + "title": "Connecting to DAPP via WalletConnect", + "add-title": "Add WalletConnect connection", + "scan-with-camera": "Scanning with the camera", + "scan-qrcode": "Scan the QR code in the screen", + "no-camera-tip": "Don't have a camera? Use the uri to connect", + "camera-fail": "Unable to acquire camera data", + "camera-connecting": "Connecting Camera...", + "camera-msg": "Please check that the settings allow Neuron to access the camera", + "screen-fail": "Unable to get screen data", + "screen-msg": "Please check that the settings allow Neuron to access the screen", + "session-request": "Connection Requests", + "no-session": "No connection requests", + "reject": "Reject", + "approve": "Approve", + "next": "Next Step", + "user-name": "Username", + "use-uri": "Use the uri to connect", + "uri-placeholder": "Please input the uri", + "connect": "Connect", + "connecting": "Connecting your wallet via WalletConnect now", + "scanning": "Scanning the QR code in the screen", + "invalid-qrcode": "Invalid QR code", + "invalid-qrcode-tip": "Make sure the WalletConnect QR code on the screen/camera feed is valid", + "connected-session": "Established connections", + "disconnect": "Disconnect", + "toast": { + "connected": "Wallet connected", + "signMessage": "You have a new WalletConnect Signature Information request", + "sign-success": "Signed successfully" + }, + "sign-request": "Request for signature", + "sign-info": "Signature Information", + "transfer-info": "Payment Information", + "view-details": "View Details", + "locked-period": "Locked Period", + "sign-confirmation": "Signature Confirmation" + }, "main": { "external-node-detected-dialog": { "title": "External node detected", diff --git a/packages/neuron-ui/src/locales/zh-tw.json b/packages/neuron-ui/src/locales/zh-tw.json index 66ecd3fc35..61f2bd0788 100644 --- a/packages/neuron-ui/src/locales/zh-tw.json +++ b/packages/neuron-ui/src/locales/zh-tw.json @@ -23,6 +23,7 @@ "connecting": "正在連接節點", "experimental-functions": "實驗性功能", "s-udt": "資產賬戶", + "wallet-connect": "Wallet Connect", "update-neuron-with-ckb": "CKB 節點版本與 Neuron (v{{ version }}) 不匹配,可能導致兼容性問題。請更新到最新版 Neuron。", "ckb-node-compatible": "CKB 節點版本與 Neuron (v{{ version }}) 不兼容,請謹慎使用。", "ckb-without-indexer": "請添加 '--indexer' 參數來啟動本地節點" @@ -1112,6 +1113,44 @@ "locate-first-tx": "定位第一筆交易", "view-block": "查看區塊" }, + "wallet-connect": { + "title": "通過WalletConnect連結DAPP", + "add-title": "新增WalletConnect連結", + "scan-with-camera": "使用攝像頭掃描", + "scan-qrcode": "掃描屏幕二維碼", + "no-camera-tip": "沒有攝像頭?使用連結碼連結", + "camera-fail": "無法獲取攝像頭數據", + "camera-connecting": "正在連結攝像頭", + "camera-msg": "請檢查設置是否允許Neuron訪問攝像頭", + "screen-fail": "無法獲取屏幕數據", + "screen-msg": "請檢查設置是否允許Neuron訪問屏幕", + "session-request": "連結請求", + "no-session": "沒有連結請求", + "reject": "拒絕", + "approve": "授權", + "next": "下一步", + "user-name": "用戶名", + "use-uri": "使用連結碼連結", + "uri-placeholder": "請輸入連結碼", + "connect": "連結", + "connecting": "正在通過WalletConnect連結你的錢包", + "scanning": "正在掃描屏幕二維碼", + "invalid-qrcode": "無效的二維碼", + "invalid-qrcode-tip": "請確保屏幕上/攝像頭畫面中的WalletConnect二維碼有效", + "connected-session": "已建立的連結", + "disconnect": "斷開連結", + "toast": { + "connected": "錢包已連結", + "signMessage": "您有一筆新的WalletConnect簽名信息請求", + "sign-success": "簽名成功" + }, + "sign-request": "簽名請求", + "sign-info": "簽名信息", + "transfer-info": "支付信息", + "view-details": "查看詳情", + "locked-period": "鎖定時間", + "sign-confirmation": "簽名確認" + }, "main": { "external-node-detected-dialog": { "title": "檢測到外部節點", diff --git a/packages/neuron-ui/src/locales/zh.json b/packages/neuron-ui/src/locales/zh.json index 7d24c9dc24..e5b0322543 100644 --- a/packages/neuron-ui/src/locales/zh.json +++ b/packages/neuron-ui/src/locales/zh.json @@ -23,6 +23,7 @@ "connecting": "正在连接节点", "experimental-functions": "实验性功能", "s-udt": "资产账户", + "wallet-connect": "Wallet Connect", "update-neuron-with-ckb": "CKB 节点版本与 Neuron (v{{ version }}) 不匹配,可能导致兼容性问题。请更新到最新版 Neuron。", "ckb-node-compatible": "CKB 节点版本与 Neuron (v{{ version }}) 不兼容,请谨慎使用。", "ckb-without-indexer": "请添加 '--indexer' 参数来启动本地节点" @@ -1133,6 +1134,44 @@ "locate-first-tx": "定位第一笔交易", "view-block": "查看区块" }, + "wallet-connect": { + "title": "通过WalletConnect连接DAPP", + "add-title": "新增WalletConnect连接", + "scan-with-camera": "使用摄像头扫描", + "scan-qrcode": "扫描屏幕二维码", + "no-camera-tip": "没有摄像头?使用连接码连接", + "camera-fail": "无法获取摄像头数据", + "camera-connecting": "正在连接摄像头", + "camera-msg": "请检查设置是否允许Neuron访问摄像头", + "screen-fail": "无法获取屏幕数据", + "screen-msg": "请检查设置是否允许Neuron访问屏幕", + "session-request": "连接请求", + "no-session": "没有连接请求", + "reject": "拒绝", + "approve": "授权", + "next": "下一步", + "user-name": "用户名", + "use-uri": "使用连接码连接", + "uri-placeholder": "请输入连接码", + "connect": "连接", + "connecting": "正在通过WalletConnect连接你的钱包", + "scanning": "正在扫描屏幕二维码", + "invalid-qrcode": "无效的二维码", + "invalid-qrcode-tip": "请确保屏幕上/摄像头画面中的WalletConnect二维码有效", + "connected-session": "已建立的连接", + "disconnect": "断开连接", + "toast": { + "connected": "钱包已连接", + "signMessage": "您有一笔新的WalletConnect签名信息请求", + "sign-success": "签名成功" + }, + "sign-request": "签名请求", + "sign-info": "签名信息", + "transfer-info": "支付信息", + "view-details": "查看详情", + "locked-period": "锁定时间", + "sign-confirmation": "签名确认" + }, "main": { "external-node-detected-dialog": { "title": "检测到外部节点", diff --git a/packages/neuron-ui/src/router.tsx b/packages/neuron-ui/src/router.tsx index 76114bd4f2..8ba3b6032f 100644 --- a/packages/neuron-ui/src/router.tsx +++ b/packages/neuron-ui/src/router.tsx @@ -21,6 +21,7 @@ import OfflineSign from 'components/OfflineSign' import Settings from 'components/Settings' import SignAndVerify from 'components/SignAndVerify' import MultisigAddress from 'components/MultisigAddress' +import WalletConnect from 'components/WalletConnect' import CellManagement from 'components/CellManagement' const toolsRouters = [ @@ -203,6 +204,17 @@ const mainRouterConfig: RouteObject[] = [ ), children: [...toolsRouters], }, + + { + path: RoutePath.WalletConnect, + element: ( + <> + + + + ), + children: [...toolsRouters], + }, { path: RoutePath.SUDTSend, children: [ diff --git a/packages/neuron-ui/src/services/remote/hardware.ts b/packages/neuron-ui/src/services/remote/hardware.ts index c0c1cf19d8..db8f0c41e2 100644 --- a/packages/neuron-ui/src/services/remote/hardware.ts +++ b/packages/neuron-ui/src/services/remote/hardware.ts @@ -39,3 +39,5 @@ export const connectDevice = remoteApi('connect-device') export const createHardwareWallet = remoteApi( 'create-hardware-wallet' ) +export const askForCameraAccess = remoteApi('ask-camera-access') +export const captureScreen = remoteApi('capture-screen') diff --git a/packages/neuron-ui/src/services/remote/index.ts b/packages/neuron-ui/src/services/remote/index.ts index 6d839a5fcf..4283994020 100644 --- a/packages/neuron-ui/src/services/remote/index.ts +++ b/packages/neuron-ui/src/services/remote/index.ts @@ -14,6 +14,7 @@ export * from './hardware' export * from './offline' export * from './nft' export * from './multisig' +export * from './walletConnect' export * from './cellManage' const REMOTE_MODULE_NOT_FOUND = diff --git a/packages/neuron-ui/src/services/remote/offline.ts b/packages/neuron-ui/src/services/remote/offline.ts index 2860ab770d..543ed1c38d 100644 --- a/packages/neuron-ui/src/services/remote/offline.ts +++ b/packages/neuron-ui/src/services/remote/offline.ts @@ -1,4 +1,5 @@ /* eslint-disable camelcase */ +import { Transaction } from '@ckb-connect/walletconnect-wallet-sdk' import { remoteApi } from './remoteApiWrapper' import { MultisigEntity } from './multisig' @@ -17,7 +18,7 @@ export enum OfflineSignType { Invalid = 'Invalid', } -interface MultisigConfigs { +export interface MultisigConfigs { [hash: string]: { sighash_addresses: string[] require_first_n: number @@ -34,14 +35,30 @@ export interface OfflineSignJSON { multisig_configs?: MultisigConfigs } -export type SignProps = OfflineSignJSON & { walletID: string; password: string; multisigConfig?: MultisigEntity } +export interface WalletConnectSignJSON { + transaction: Transaction + status: OfflineSignStatus + type: OfflineSignType + description?: string + asset_account?: Pick + multisig_configs?: MultisigConfigs +} + +export type SignProps = (OfflineSignJSON | WalletConnectSignJSON) & { + walletID: string + password: string + multisigConfig?: MultisigEntity +} export type BroadcastProps = OfflineSignJSON & { walletID: string } -export const exportTransactionAsJSON = remoteApi('export-transaction-as-json') -export const signTransactionOnly = remoteApi('sign-transaction-only') -export const broadcastTransaction = remoteApi('broadcast-transaction-only') -export const signAndExportTransaction = remoteApi( - 'sign-and-export-transaction' +export const exportTransactionAsJSON = remoteApi( + 'export-transaction-as-json' ) +export const signTransactionOnly = remoteApi('sign-transaction-only') +export const broadcastTransaction = remoteApi('broadcast-transaction-only') +export const signAndExportTransaction = remoteApi< + SignProps, + { filePath: string; json: OfflineSignJSON | WalletConnectSignJSON } +>('sign-and-export-transaction') export const signAndBroadcastTransaction = remoteApi('sign-and-broadcast-transaction') diff --git a/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts b/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts index 3ca2ffdff6..e2f77ca91f 100644 --- a/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts +++ b/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts @@ -151,6 +151,16 @@ type Action = | 'get-hold-sudt-cell-capacity' | 'start-migrate' | 'get-sync-progress-by-addresses' + // walletconnect + | 'wc-connect' + | 'wc-disconnect' + | 'wc-approve-session' + | 'wc-reject-session' + | 'wc-approve-request' + | 'wc-reject-request' + | 'wc-get-state' + | 'ask-camera-access' + | 'capture-screen' // spore | 'generate-transfer-spore-tx' // cell-manage diff --git a/packages/neuron-ui/src/services/remote/walletConnect.ts b/packages/neuron-ui/src/services/remote/walletConnect.ts new file mode 100644 index 0000000000..1c2979f01e --- /dev/null +++ b/packages/neuron-ui/src/services/remote/walletConnect.ts @@ -0,0 +1,22 @@ +import { ErrorResponse, SessionRequest } from '@ckb-connect/walletconnect-wallet-sdk' +import { remoteApi } from './remoteApiWrapper' + +export const connect = remoteApi('wc-connect') +export const disconnect = remoteApi('wc-disconnect') +export const getWCState = remoteApi('wc-get-state') +export const approveSession = remoteApi<{ + id: number + scriptBases: string[] +}>('wc-approve-session') +export const rejectSession = remoteApi<{ + id: number + reason?: ErrorResponse +}>('wc-reject-session') +export const approveRequest = remoteApi<{ + event: SessionRequest + options?: any +}>('wc-approve-request') +export const rejectRequest = remoteApi<{ + event: SessionRequest + error?: ErrorResponse +}>('wc-reject-request') diff --git a/packages/neuron-ui/src/services/subjects.ts b/packages/neuron-ui/src/services/subjects.ts index b78aebf9d2..5e893e06db 100644 --- a/packages/neuron-ui/src/services/subjects.ts +++ b/packages/neuron-ui/src/services/subjects.ts @@ -31,7 +31,8 @@ const SubjectConstructor = ( | 'device-sign-index' | 'multisig-output-update' | 'migrate' - | 'show-global-dialog', + | 'show-global-dialog' + | 'wallet-connect-updated', isMulti?: boolean ) => { return ipcRenderer @@ -69,6 +70,7 @@ export const SetLocale = SubjectConstructor<(typeof LOCALES)[number]>('set-local export const DeviceSignIndex = SubjectConstructor('device-sign-index') export const MultisigOutputUpdate = SubjectConstructor('multisig-output-update') export const Migrate = SubjectConstructor<'need-migrate' | 'migrating' | 'failed' | 'finish'>('migrate', true) +export const WalletConnectUpdate = SubjectConstructor('wallet-connect-updated') export default { DataUpdate, @@ -85,4 +87,5 @@ export default { DeviceSignIndex, MultisigOutputUpdate, Migrate, + WalletConnectUpdate, } diff --git a/packages/neuron-ui/src/states/init/index.ts b/packages/neuron-ui/src/states/init/index.ts index fda355db12..438e3d599b 100644 --- a/packages/neuron-ui/src/states/init/index.ts +++ b/packages/neuron-ui/src/states/init/index.ts @@ -4,6 +4,7 @@ import wallet from './wallet' import settings from './settings' import nervosDAO from './nervosDAO' import updater from './updater' +import walletConnect from './walletConnect' export * from './app' export * from './chain' @@ -11,6 +12,7 @@ export * from './wallet' export * from './settings' export * from './nervosDAO' export * from './updater' +export * from './walletConnect' export const initStates = { app, @@ -21,6 +23,7 @@ export const initStates = { updater, experimental: null, sUDTAccounts: [], + walletConnect, } export default initStates diff --git a/packages/neuron-ui/src/states/init/walletConnect.ts b/packages/neuron-ui/src/states/init/walletConnect.ts new file mode 100644 index 0000000000..1e548a325e --- /dev/null +++ b/packages/neuron-ui/src/states/init/walletConnect.ts @@ -0,0 +1,9 @@ +export const walletConnectState: State.WalletConnect = { + proposals: [], + sessions: [], + requests: [], + identity: '', + supportedScriptBases: {}, +} + +export default walletConnectState diff --git a/packages/neuron-ui/src/states/stateProvider/reducer.ts b/packages/neuron-ui/src/states/stateProvider/reducer.ts index 5579dcd438..5eb80c816f 100644 --- a/packages/neuron-ui/src/states/stateProvider/reducer.ts +++ b/packages/neuron-ui/src/states/stateProvider/reducer.ts @@ -1,6 +1,6 @@ import type { OutPoint } from '@ckb-lumos/base' import produce, { Draft } from 'immer' -import { OfflineSignJSON } from 'services/remote' +import { OfflineSignJSON, WalletConnectSignJSON } from 'services/remote' import initStates from 'states/init' import { ConnectionStatus, ErrorCode, getCurrentUrl, getSyncStatus, sortAccounts } from 'utils' @@ -67,6 +67,8 @@ export enum AppActions { UpdateCountDown = 'updateCountDown', SignVerify = 'signVerify', + // walletConnect + UpdateWalletConnectState = 'updateWalletConnectState', // Cell manage UpdateConsumeCells = 'UpdateConsumeCells', } @@ -100,7 +102,10 @@ export type StateAction = | { type: AppActions.ToggleIsAllowedToFetchList; payload?: boolean } | { type: AppActions.Ignore; payload?: any } | { type: AppActions.UpdateExperimentalParams; payload: State.Experimental | null } - | { type: AppActions.UpdateLoadedTransaction; payload: { filePath?: string; json: OfflineSignJSON } } + | { + type: AppActions.UpdateLoadedTransaction + payload: { filePath?: string; json: OfflineSignJSON | WalletConnectSignJSON } + } | { type: AppActions.SetPageNotice; payload?: Omit } | { type: AppActions.HideWaitForFullySynced } | { type: AppActions.GetFeeRateStats; payload: State.FeeRateStatsType } @@ -120,6 +125,10 @@ export type StateAction = | { type: NeuronWalletActions.UpdateAppUpdaterStatus; payload: State.AppUpdater } | { type: NeuronWalletActions.GetSUDTAccountList; payload: Controller.GetSUDTAccountList.Response } | { type: AppActions.SignVerify; payload: string } + | { + type: AppActions.UpdateWalletConnectState + payload: State.WalletConnect + } | { type: AppActions.UpdateConsumeCells; payload?: { outPoint: OutPoint; capacity: string }[] } export type StateDispatch = React.Dispatch // TODO: add type of payload @@ -414,6 +423,10 @@ export const reducer = produce((state: Draft, action: state.app.showWaitForFullySynced = false break } + case AppActions.UpdateWalletConnectState: { + state.walletConnect = action.payload + break + } case AppActions.UpdateConsumeCells: { state.consumeCells = action.payload diff --git a/packages/neuron-ui/src/types/App/index.d.ts b/packages/neuron-ui/src/types/App/index.d.ts index 3916fb842d..bee6626ca4 100644 --- a/packages/neuron-ui/src/types/App/index.d.ts +++ b/packages/neuron-ui/src/types/App/index.d.ts @@ -1,3 +1,5 @@ +/// + declare namespace State { interface Transaction { type: 'send' | 'receive' | 'create' | 'destroy' @@ -332,6 +334,15 @@ declare namespace State { sUDTAccounts: SUDTAccount[] experimental: Experimental | null consumeCells?: { outPoint: OutPoint; capacity: string }[] + walletConnect: State.WalletConnect + } + + interface WalletConnect { + proposals: Proposal[] + sessions: Session[] + requests: SessionRequest[] + identity: string + supportedScriptBases: Record } enum LockScriptCategory { diff --git a/packages/neuron-ui/src/types/Controller/index.d.ts b/packages/neuron-ui/src/types/Controller/index.d.ts index 012dd89cac..7eab968d0c 100644 --- a/packages/neuron-ui/src/types/Controller/index.d.ts +++ b/packages/neuron-ui/src/types/Controller/index.d.ts @@ -395,4 +395,10 @@ declare namespace Controller { assetAccount?: AssetAccount } } + + interface CaptureScreenSource { + id: string + name: string + dataUrl: string + } } diff --git a/packages/neuron-ui/src/types/Subject/index.d.ts b/packages/neuron-ui/src/types/Subject/index.d.ts index fcba2123dd..19e8b4eb75 100644 --- a/packages/neuron-ui/src/types/Subject/index.d.ts +++ b/packages/neuron-ui/src/types/Subject/index.d.ts @@ -69,4 +69,6 @@ declare namespace Subject { type: 'success' | 'failed' | 'warning' action?: 'ok' | 'cancel' } + + type WalletConnectState = State.WalletConnect } diff --git a/packages/neuron-ui/src/utils/enums.ts b/packages/neuron-ui/src/utils/enums.ts index ce71adb71e..ac1c98671b 100644 --- a/packages/neuron-ui/src/utils/enums.ts +++ b/packages/neuron-ui/src/utils/enums.ts @@ -28,6 +28,7 @@ export enum RoutePath { OfflineSign = 'offline-sign', SignVerify = 'sign-verify', MultisigAddress = 'multisig-address', + WalletConnect = '/wallet-connect', } export enum CapacityUnit { diff --git a/packages/neuron-ui/src/widgets/Icons/NumberScan.svg b/packages/neuron-ui/src/widgets/Icons/NumberScan.svg new file mode 100644 index 0000000000..df6f652f36 --- /dev/null +++ b/packages/neuron-ui/src/widgets/Icons/NumberScan.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/neuron-ui/src/widgets/Icons/Scan.svg b/packages/neuron-ui/src/widgets/Icons/Scan.svg old mode 100755 new mode 100644 index 3c4c722134..6c47b3171a --- a/packages/neuron-ui/src/widgets/Icons/Scan.svg +++ b/packages/neuron-ui/src/widgets/Icons/Scan.svg @@ -1,8 +1,10 @@ - - - - Scan - - - - \ No newline at end of file + + + + + + + + + + diff --git a/packages/neuron-ui/src/widgets/Icons/ScanScreen.svg b/packages/neuron-ui/src/widgets/Icons/ScanScreen.svg new file mode 100644 index 0000000000..ecbc31eae7 --- /dev/null +++ b/packages/neuron-ui/src/widgets/Icons/ScanScreen.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/neuron-ui/src/widgets/Icons/WalletConnect.svg b/packages/neuron-ui/src/widgets/Icons/WalletConnect.svg new file mode 100644 index 0000000000..e063501a7b --- /dev/null +++ b/packages/neuron-ui/src/widgets/Icons/WalletConnect.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/neuron-ui/src/widgets/Icons/icon.tsx b/packages/neuron-ui/src/widgets/Icons/icon.tsx index 464dc6e7d1..8e360104ba 100644 --- a/packages/neuron-ui/src/widgets/Icons/icon.tsx +++ b/packages/neuron-ui/src/widgets/Icons/icon.tsx @@ -44,6 +44,11 @@ import { ReactComponent as OverviewSendSvg } from './OverviewSend.svg' import { ReactComponent as OverviewReceiveSvg } from './OverviewReceive.svg' import { ReactComponent as AddressbookSvg } from './Addressbook.svg' import { ReactComponent as AddSvg } from './Add.svg' +import { ReactComponent as ExperimentSvg } from './Experiment.svg' +import { ReactComponent as WalletConnectSvg } from './WalletConnect.svg' +import { ReactComponent as ScanSvg } from './Scan.svg' +import { ReactComponent as ScanScreenSvg } from './ScanScreen.svg' +import { ReactComponent as NumberScanSvg } from './NumberScan.svg' import { ReactComponent as AddSimpleSvg } from './AddSimple.svg' import { ReactComponent as SwitchSvg } from './Switch.svg' import { ReactComponent as CellManageSvg } from './CellManage.svg' @@ -111,6 +116,11 @@ export const OverviewSend = WrapSvg(OverviewSendSvg) export const OverviewReceive = WrapSvg(OverviewReceiveSvg) export const Addressbook = WrapSvg(AddressbookSvg, styles.withTheme) export const Add = WrapSvg(AddSvg) +export const Experiment = WrapSvg(ExperimentSvg) +export const WalletConnect = WrapSvg(WalletConnectSvg) +export const Scan = WrapSvg(ScanSvg) +export const ScanScreen = WrapSvg(ScanScreenSvg) +export const NumberScan = WrapSvg(NumberScanSvg) export const Switch = WrapSvg(SwitchSvg) export const AddSimple = WrapSvg(AddSimpleSvg) export const CellManage = WrapSvg(CellManageSvg, styles.withTheme) diff --git a/packages/neuron-ui/src/widgets/LoadingDialog/index.tsx b/packages/neuron-ui/src/widgets/LoadingDialog/index.tsx new file mode 100644 index 0000000000..1cc52c8ceb --- /dev/null +++ b/packages/neuron-ui/src/widgets/LoadingDialog/index.tsx @@ -0,0 +1,18 @@ +import React from 'react' +import Spinner from 'widgets/Spinner' +import Dialog from 'widgets/Dialog' +import styles from './loadingDialog.module.scss' + +const LoadingDialog = ({ show, message }: { show: boolean; message: string }) => { + return ( + +
+ +

{message}

+
+
+ ) +} + +LoadingDialog.displayName = 'LoadingDialog' +export default LoadingDialog diff --git a/packages/neuron-ui/src/widgets/LoadingDialog/loadingDialog.module.scss b/packages/neuron-ui/src/widgets/LoadingDialog/loadingDialog.module.scss new file mode 100644 index 0000000000..35aa897f11 --- /dev/null +++ b/packages/neuron-ui/src/widgets/LoadingDialog/loadingDialog.module.scss @@ -0,0 +1,15 @@ +@import '../../styles/mixin.scss'; + +.loadingDialog { + height: 180px; + width: 360px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + p { + font-weight: 500; + font-size: 16px; + color: var(--main-text-color); + } +} diff --git a/packages/neuron-wallet/.env b/packages/neuron-wallet/.env index 5c7ab981bd..ee8ae70604 100644 --- a/packages/neuron-wallet/.env +++ b/packages/neuron-wallet/.env @@ -118,3 +118,5 @@ MULTISIG_CODE_HASH=0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc963 # CKB NODE OPTIONS CKB_NODE_ASSUME_VALID_TARGET='0x79cecdd6f41361e2474290224751284312a018528d1d92f4e18dd6d542feddfe' + +WALLET_CONNECT_PROJECT_ID=9200911ea59e455fe56bd123a15ff7d2 diff --git a/packages/neuron-wallet/package.json b/packages/neuron-wallet/package.json index f85c7e1d8a..42c92fb256 100644 --- a/packages/neuron-wallet/package.json +++ b/packages/neuron-wallet/package.json @@ -42,6 +42,7 @@ ] }, "dependencies": { + "@ckb-connect/walletconnect-wallet-sdk": "0.0.1-alpha.2", "@ckb-lumos/base": "0.21.0-next.2", "@ckb-lumos/bi": "0.21.0-next.2", "@ckb-lumos/ckb-indexer": "0.21.0-next.2", @@ -53,6 +54,7 @@ "@ckb-lumos/rpc": "0.21.0-next.2", "@iarna/toml": "2.2.5", "@ledgerhq/hw-transport-node-hid": "6.27.22", + "@walletconnect/core": "2.10.2", "@spore-sdk/core": "0.1.0-beta.9", "archiver": "5.3.2", "async": "3.2.5", diff --git a/packages/neuron-wallet/src/controllers/api.ts b/packages/neuron-wallet/src/controllers/api.ts index 45f5f4c8f2..2c48fe3a00 100644 --- a/packages/neuron-wallet/src/controllers/api.ts +++ b/packages/neuron-wallet/src/controllers/api.ts @@ -62,6 +62,7 @@ import NodeService from '../services/node' import SyncProgressService from '../services/sync-progress' import { resetSyncTaskQueue } from '../block-sync-renderer' import DataUpdateSubject from '../models/subjects/data-update' +import WalletConnectController from './wallet-connect' import CellManagement from './cell-management' import { UpdateCellLocalInfo } from '../database/chain/entities/cell-local-info' @@ -80,6 +81,7 @@ export default class ApiController { #offlineSignController = new OfflineSignController() #sudtController = new SUDTController() #multisigController = new MultisigController() + #walletConnectController = new WalletConnectController() public async mount() { this.#registerHandlers() @@ -749,6 +751,14 @@ export default class ApiController { return this.#hardwareController.getPublicKey() }) + handle('ask-camera-access', async () => { + return this.#hardwareController.askForCameraAccess() + }) + + handle('capture-screen', async () => { + return this.#hardwareController.captureScreen() + }) + handle('create-hardware-wallet', async (_, params: ExtendedPublicKey & { walletName: string }) => { return await this.#walletsController.importHardwareWallet(params) }) @@ -830,6 +840,35 @@ export default class ApiController { } }) + // walletconnect + handle('wc-connect', async (_, params) => { + return this.#walletConnectController.connect(params) + }) + + handle('wc-disconnect', async (_, params) => { + return this.#walletConnectController.disconnect(params) + }) + + handle('wc-approve-session', async (_, params) => { + return this.#walletConnectController.approveSession(params) + }) + + handle('wc-reject-session', async (_, params) => { + return this.#walletConnectController.rejectSession(params) + }) + + handle('wc-approve-request', async (_, params) => { + return this.#walletConnectController.approveRequest(params) + }) + + handle('wc-reject-request', async (_, params) => { + return this.#walletConnectController.rejectRequest(params) + }) + + handle('wc-get-state', async _ => { + return this.#walletConnectController.getState() + }) + // cell manager handle('get-live-cells', async () => { return { diff --git a/packages/neuron-wallet/src/controllers/app/subscribe.ts b/packages/neuron-wallet/src/controllers/app/subscribe.ts index 8de629a2cd..8105d13be2 100644 --- a/packages/neuron-wallet/src/controllers/app/subscribe.ts +++ b/packages/neuron-wallet/src/controllers/app/subscribe.ts @@ -16,6 +16,7 @@ import MigrateSubject from '../../models/subjects/migrate-subject' import startMonitor, { stopMonitor } from '../../services/monitor' import { clearCkbNodeCache } from '../../services/ckb-runner' import ShowGlobalDialogSubject from '../../models/subjects/show-global-dialog' +import { WalletConnectSubject } from '../../models/subjects/wallet-connect-subject' interface AppResponder { sendMessage: (channel: string, arg: any) => void @@ -124,4 +125,8 @@ export const subscribe = (dispatcher: AppResponder) => { ShowGlobalDialogSubject.subscribe(params => { BrowserWindow.getFocusedWindow()?.webContents.send('show-global-dialog', params) }) + + WalletConnectSubject.subscribe(data => { + dispatcher.sendMessage('wallet-connect-updated', data) + }) } diff --git a/packages/neuron-wallet/src/controllers/hardware.ts b/packages/neuron-wallet/src/controllers/hardware.ts index 41cd9f0d8a..2469ee95cb 100644 --- a/packages/neuron-wallet/src/controllers/hardware.ts +++ b/packages/neuron-wallet/src/controllers/hardware.ts @@ -1,7 +1,8 @@ +import { desktopCapturer, screen, BrowserWindow, systemPreferences } from 'electron' import { DeviceInfo, ExtendedPublicKey, PublicKey } from '../services/hardware/common' import { ResponseCode } from '../utils/const' import HardwareWalletService from '../services/hardware' -import { connectDeviceFailed } from '../exceptions' +import { connectDeviceFailed, AskAccessFailed } from '../exceptions' import { AccountExtendedPublicKey } from '../models/keys/key' export default class HardwareController { @@ -68,4 +69,50 @@ export default class HardwareController { result: pubkey, } } + + public async askForCameraAccess() { + const status = await systemPreferences.getMediaAccessStatus('camera') + if (status === 'granted') { + return { + status: ResponseCode.Success, + } + } + + const canAccess = await systemPreferences.askForMediaAccess('camera') + if (canAccess) { + return { + status: ResponseCode.Success, + } + } + + throw new AskAccessFailed() + } + + public async captureScreen() { + const status = await systemPreferences.getMediaAccessStatus('screen') + if (status === 'denied') { + throw new AskAccessFailed() + } + + const currentWindow = BrowserWindow.getFocusedWindow() + currentWindow?.hide() + const display = screen.getPrimaryDisplay() + const sources = await desktopCapturer.getSources({ + types: ['screen'], + thumbnailSize: { + height: display.bounds.height * display.scaleFactor, + width: display.bounds.width * display.scaleFactor, + }, + }) + currentWindow?.show() + const result = sources.map(item => ({ + id: item.id, + name: item.name, + dataUrl: item.thumbnail.toDataURL(), + })) + return { + status: ResponseCode.Success, + result, + } + } } diff --git a/packages/neuron-wallet/src/controllers/wallet-connect.ts b/packages/neuron-wallet/src/controllers/wallet-connect.ts new file mode 100644 index 0000000000..b5a7458073 --- /dev/null +++ b/packages/neuron-wallet/src/controllers/wallet-connect.ts @@ -0,0 +1,419 @@ +import { Core } from '@walletconnect/core' +import { debounceTime } from 'rxjs/operators' +import { + CkbWallet, + CKBWalletAdapter, + GetAddressesParams, + SignTransactionParams, + SignMessageParams, + Address, + ApproveParams, + ErrorResponse, + Proposal, + Session, + SessionRequest, + SignedTransaction, +} from '@ckb-connect/walletconnect-wallet-sdk' +import WalletConnectSubject from '../models/subjects/wallet-connect-subject' +import { CurrentWalletSubject } from '../models/subjects/wallets' +import { CurrentNetworkIDSubject } from '../models/subjects/networks' +import { AccountExtendedPublicKey } from '../models/keys/key' +import { Address as AddressInterface } from '../models/address' +import AssetAccount from '../models/asset-account' +import { AddressType } from '../models/keys/address' +import TxDbChangedSubject from '../models/subjects/tx-db-changed-subject' +import AddressDbChangedSubject from '../models/subjects/address-db-changed-subject' +import logger from '../utils/logger' +import { ResponseCode } from '../utils/const' +import WalletsService from '../services/wallets' +import NetworksService from '../services/networks' +import AddressService from '../services/addresses' +import AssetAccountController from './asset-account' + +function getSupportedScriptBases(): Record { + const isMainnet = NetworksService.getInstance().isMainnet() + const acp = isMainnet ? process.env.MAINNET_ACP_SCRIPT_CODEHASH : process.env.TESTNET_ACP_SCRIPT_CODEHASH + return { + 'SECP256K1/blake160': process.env.SECP256K1_CODE_HASH as string, + ACP: acp as string, + } +} + +class Adapter implements CKBWalletAdapter { + private walletID: string = '' + private extendedKey: AccountExtendedPublicKey + + constructor(props: { walletID: string; extendedKey: string }) { + this.walletID = props.walletID + this.extendedKey = AccountExtendedPublicKey.parse(props.extendedKey) + } + + public async ckb_getAddresses(params: GetAddressesParams): Promise<{ + [scriptBase: string]: Address[] + }> { + const scriptBaseList = Object.keys(params) + if (scriptBaseList.length === 0) { + return {} + } + const supportedScriptBases = getSupportedScriptBases() + const result = <{ [scriptBase: string]: Address[] }>{} + const list = scriptBaseList.map(async hashKey => { + const { page, type } = params[hashKey] + const { size = 10, before, after } = page + if (hashKey === supportedScriptBases['SECP256K1/blake160']) { + let resList = [] as AddressInterface[] + if (type === 'generate') { + resList = + (await AddressService.generateAndSaveForExtendedKey({ + walletId: this.walletID, + extendedKey: this.extendedKey, + receivingAddressCount: size, + })) || [] + } else { + const list = (await AddressService.getAddressesWithBalancesByWalletId(this.walletID)).filter( + item => item.addressType === AddressType.Receiving + ) + + if (before) { + const beforeItem = list.find(item => item.address === before) + if (beforeItem) { + resList = list.filter(item => item.addressIndex < beforeItem.addressIndex).slice(-size) + } + } else if (after) { + const afterItem = list.find(item => item.address === after) + if (afterItem) { + resList = list.filter(item => item.addressIndex > afterItem.addressIndex).slice(size) + } + } else { + resList = list.slice(0, size) + } + } + + return resList.map( + ({ address, blake160: identifier, balance, description = '', addressIndex: index = '' }) => ({ + address, + identifier, + description, + balance: balance!, + index, + }) + ) + } + if (hashKey === supportedScriptBases.ACP) { + let resList = [] as (AssetAccount & { address: string })[] + if (type === 'generate') { + resList = [] + } else { + const { status, result } = await new AssetAccountController().getAll({ walletID: this.walletID }) + if (status === ResponseCode.Success && result) { + if (before) { + const beforeItem = result.findIndex(item => item.address === before) + if (beforeItem) { + resList = result.filter((_, index) => index < beforeItem).slice(-size) + } + } else if (after) { + const afterItem = result.findIndex(item => item.address === after) + if (afterItem) { + resList = result.filter((_, index) => index > afterItem).slice(size) + } + } else { + resList = result.slice(0, size) + } + } + } + return resList.map(({ address, blake160: identifier, balance, ...other }) => ({ + address, + identifier, + balance: balance!, + ...other, + })) + } + return [] + }) + const resultList = await Promise.all(list) + + resultList.forEach((item, index) => { + result[scriptBaseList[index]] = item + }) + + logger.info('resultList-----', resultList, scriptBaseList, result) + return result + } + + public async ckb_signTransaction( + params: SignTransactionParams, + options?: any + ): Promise<{ transaction?: SignedTransaction; hash?: string }> { + logger.info('ckb_signTransaction-----', params, options) + return Promise.resolve(options) + } + + public async ckb_signMessage( + params: SignMessageParams, + options?: any + ): Promise<{ + signature: string + }> { + logger.info('ckb_signMessage-----', params, options) + + return Promise.resolve({ signature: options }) + } +} + +export default class WalletConnectController { + static client?: CkbWallet + + private proposals: Proposal[] = [] + private sessions: Session[] = [] + private requests: SessionRequest[] = [] + + private addresses: Address[] = [] + + public getState(): { + status: ResponseCode + result: { + proposals: Proposal[] + sessions: Session[] + requests: SessionRequest[] + identity: string + supportedScriptBases: Record + } + } { + return { + status: ResponseCode.Success, + result: { + proposals: this.proposals, + sessions: this.sessions, + requests: this.requests, + identity: this.getWallet().identity, + supportedScriptBases: getSupportedScriptBases(), + }, + } + } + + private getWallet() { + const currentWallet = WalletsService.getInstance().getCurrent() + if (currentWallet) { + const { extendedKey, id, name } = currentWallet.toJSON() + const identity = AccountExtendedPublicKey.parse(extendedKey).addressPublicKey(AddressType.Receiving, 0) + + return { + identity, + id, + extendedKey, + accountName: name, + } + } + return { + identity: '', + } + } + + private getNetwork() { + const network = NetworksService.getInstance().getCurrent() + switch (network?.chain) { + case 'ckb': + return 'mainnet' + case 'ckb_testnet': + case 'light_client_testnet': + return 'testnet' + case 'ckb_dev': + return 'devnet' + default: + return 'devnet' + } + } + + private async init() { + const wallet = this.getWallet() + + if (!wallet.id) { + return + } + + const core = new Core({ + projectId: process.env.WALLET_CONNECT_PROJECT_ID, + }) + + WalletConnectController.client = await CkbWallet.init({ + // @ts-ignore + core, + metadata: { + name: 'Neuron', + url: 'https://github.com/nervosnetwork/neuron/releases', + icons: [], + description: 'Neuron Wallet is a CKB wallet produced by Nervos Foundation. ', + }, + adapter: new Adapter({ + walletID: wallet.id, + extendedKey: wallet.extendedKey, + }), + }) + + WalletConnectController.client.emitter.on('proposals', (proposals: Proposal[]) => { + this.proposals = proposals + this.notify() + }) + WalletConnectController.client.emitter.on('sessions', (sessions: Session[]) => { + this.sessions = sessions + this.notify() + }) + + WalletConnectController.client.emitter.on('requests', (requests: SessionRequest[]) => { + this.requests = requests + this.notify() + }) + } + + private async updateAddresses(emitEvent: boolean = true) { + const { id } = this.getWallet() + if (id) { + const list = await AddressService.getAddressesWithBalancesByWalletId(id) + const receriveList = list.filter(item => item.addressType === AddressType.Receiving) + + if (!this.addresses.length) { + this.addresses = receriveList + return + } + + if (receriveList.length > this.addresses.length) { + const addresses = receriveList + .slice(this.addresses.length) + .map(({ address, blake160: identifier, balance, description = '', addressIndex: index = '' }) => ({ + address, + identifier, + description, + balance: balance!, + index, + })) + if (emitEvent) { + WalletConnectController.client?.changeAddresses({ + addresses, + changeType: 'add', + }) + } + } else if (receriveList.length === this.addresses.length) { + const addresses = [] as Address[] + receriveList.forEach((item, index) => { + if (item.txCount && (this.addresses[index]?.txCount || 0) < item.txCount) + addresses.push({ + address: item.address, + identifier: item.blake160, + description: item.description || '', + balance: item.balance!, + index, + }) + }) + if (emitEvent) { + WalletConnectController.client?.changeAddresses({ + addresses, + changeType: 'consume', + }) + } + } + this.addresses = receriveList + } + } + + constructor() { + this.init() + + CurrentWalletSubject.pipe(debounceTime(50)).subscribe(async params => { + if (params.currentWallet && WalletConnectController.client) { + const { identity, id, extendedKey, accountName } = this.getWallet() + if (id) { + WalletConnectController.client.updateAdapter(new Adapter({ walletID: id, extendedKey })) + WalletConnectController.client.changeAccount({ + identity, + accountName, + }) + this.updateAddresses(false) + this.notify() + } + } + }) + + CurrentNetworkIDSubject.subscribe(() => { + if (WalletConnectController.client) { + WalletConnectController.client.disconnectAllSessions() + this.init() + } + }) + + TxDbChangedSubject.getSubject() + .pipe(debounceTime(500)) + .subscribe(async () => { + this.updateAddresses() + }) + + AddressDbChangedSubject.getSubject() + .pipe(debounceTime(200)) + .subscribe(async () => { + this.updateAddresses() + }) + } + + public async connect(uri: string) { + if (!WalletConnectController.client) { + await this.init() + } + + await WalletConnectController?.client?.connect(uri) + return { + status: ResponseCode.Success, + } + } + + public async disconnect(topic: string) { + await WalletConnectController.client?.disconnect(topic) + return { + status: ResponseCode.Success, + } + } + + public async approveSession(params: { id: number; scriptBases: string[] }) { + const { identity, accountName } = this.getWallet() + await WalletConnectController.client?.approve({ + id: params.id, + network: this.getNetwork(), + identity, + scriptBases: params.scriptBases, + accountName, + } as ApproveParams) + this.updateAddresses(false) + return { + status: ResponseCode.Success, + } + } + + public async rejectSession({ id, reason }: { id: number; reason?: ErrorResponse }) { + await WalletConnectController.client?.reject(id, reason) + return { + status: ResponseCode.Success, + } + } + + public async approveRequest({ event, options }: { event: SessionRequest; options?: any }) { + await WalletConnectController.client?.approveRequest(event, options) + return { + status: ResponseCode.Success, + } + } + + public async rejectRequest({ event, error }: { event: SessionRequest; error?: ErrorResponse }) { + await WalletConnectController.client?.rejectRequest(event, error) + return { + status: ResponseCode.Success, + } + } + + private notify() { + WalletConnectSubject.next({ + proposals: this.proposals, + sessions: this.sessions, + requests: this.requests, + identity: this.getWallet().identity, + supportedScriptBases: getSupportedScriptBases(), + }) + } +} diff --git a/packages/neuron-wallet/src/exceptions/hardware.ts b/packages/neuron-wallet/src/exceptions/hardware.ts index eeb3b88c28..18a5ca7525 100644 --- a/packages/neuron-wallet/src/exceptions/hardware.ts +++ b/packages/neuron-wallet/src/exceptions/hardware.ts @@ -19,3 +19,7 @@ export class UnsupportedManufacturer extends Error { super(t('messages.unsupported-manufacturer', { manufacturer })) } } + +export class AskAccessFailed extends Error { + public code = 408 +} diff --git a/packages/neuron-wallet/src/models/keys/key.ts b/packages/neuron-wallet/src/models/keys/key.ts index 5e5ae9c939..b22c126dda 100644 --- a/packages/neuron-wallet/src/models/keys/key.ts +++ b/packages/neuron-wallet/src/models/keys/key.ts @@ -60,7 +60,7 @@ export class AccountExtendedPublicKey extends ExtendedPublicKey { return Address.fromPublicKey(this.addressPublicKey(type, index), Address.pathFor(type, index), isMainnet) } - private addressPublicKey = (type = AddressType.Receiving, index: number) => { + addressPublicKey = (type = AddressType.Receiving, index: number) => { const keychain = Keychain.fromPublicKey( Buffer.from(this.publicKey, 'hex'), Buffer.from(this.chainCode, 'hex'), diff --git a/packages/neuron-wallet/src/models/subjects/wallet-connect-subject.ts b/packages/neuron-wallet/src/models/subjects/wallet-connect-subject.ts new file mode 100644 index 0000000000..1c608c2d58 --- /dev/null +++ b/packages/neuron-wallet/src/models/subjects/wallet-connect-subject.ts @@ -0,0 +1,5 @@ +import { Subject } from 'rxjs' + +export const WalletConnectSubject = new Subject() + +export default WalletConnectSubject diff --git a/packages/neuron-wallet/src/types/controller.d.ts b/packages/neuron-wallet/src/types/controller.d.ts index ea54bc7f0f..e89075ea0e 100644 --- a/packages/neuron-wallet/src/types/controller.d.ts +++ b/packages/neuron-wallet/src/types/controller.d.ts @@ -1,3 +1,5 @@ +/// + declare namespace Controller { interface Response { status: number @@ -102,4 +104,12 @@ declare namespace Controller { description: string balance: string } + + interface WalletConnect { + proposals: Proposal[] + sessions: Session[] + requests: SessionRequest[] + identity: string + supportedScriptBases: Record + } } diff --git a/yarn.lock b/yarn.lock index bfda35675f..0aa7eaa906 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1743,6 +1743,19 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@ckb-connect/walletconnect-wallet-sdk@0.0.1-alpha.2": + version "0.0.1-alpha.2" + resolved "https://registry.yarnpkg.com/@ckb-connect/walletconnect-wallet-sdk/-/walletconnect-wallet-sdk-0.0.1-alpha.2.tgz#70bc9e8355be973f2701c2f11fa8e12245d4b866" + integrity sha512-eWV+yNhlCDFRTi9sFUwjwW4KeXNgr4RWb4eWOaZZhXYzt/wPKlpMRGcGyCkh4IiMGZ8mt1GLPQltDcyyMg7W4w== + dependencies: + "@types/events" "^3.0.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + "@walletconnect/web3wallet" "1.9.0" + events "^3.3.0" + lokijs "^1.5.12" + "@ckb-lumos/base@0.20.0", "@ckb-lumos/base@^0.20.0": version "0.20.0" resolved "https://registry.yarnpkg.com/@ckb-lumos/base/-/base-0.20.0.tgz#d18164ec60eae3f3a97a4bc48e1399e6e0c190d9" @@ -2319,6 +2332,168 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.54.0.tgz#4fab9a2ff7860082c304f750e94acd644cf984cf" integrity sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ== +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@fal-works/esbuild-plugin-global-externals@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz#c05ed35ad82df8e6ac616c68b92c2282bd083ba4" @@ -2477,6 +2652,11 @@ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== +"@ioredis/commands@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" + integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -3338,6 +3518,75 @@ dependencies: "@octokit/openapi-types" "^18.0.0" +"@parcel/watcher-android-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz#d82e74bb564ebd4d8a88791d273a3d2bd61e27ab" + integrity sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA== + +"@parcel/watcher-darwin-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz#c9cd03f8f233d512fcfc873d5b4e23f1569a82ad" + integrity sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw== + +"@parcel/watcher-darwin-x64@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz#83c902994a2a49b9e1ab5050dba24876fdc2c219" + integrity sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow== + +"@parcel/watcher-freebsd-x64@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz#7a0f4593a887e2752b706aff2dae509aef430cf6" + integrity sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw== + +"@parcel/watcher-linux-arm-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz#3fc90c3ebe67de3648ed2f138068722f9b1d47da" + integrity sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ== + +"@parcel/watcher-linux-arm64-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz#f7bbbf2497d85fd11e4c9e9c26ace8f10ea9bcbc" + integrity sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA== + +"@parcel/watcher-linux-arm64-musl@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz#de131a9fcbe1fa0854e9cbf4c55bed3b35bcff43" + integrity sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw== + +"@parcel/watcher-linux-x64-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz#193dd1c798003cdb5a1e59470ff26300f418a943" + integrity sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow== + +"@parcel/watcher-linux-x64-musl@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz#6dbdb86d96e955ab0fe4a4b60734ec0025a689dd" + integrity sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g== + +"@parcel/watcher-wasm@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-wasm/-/watcher-wasm-2.3.0.tgz#73b66c6fbd2a3326ae86a1ec77eab7139d0dd725" + integrity sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA== + dependencies: + is-glob "^4.0.3" + micromatch "^4.0.5" + napi-wasm "^1.1.0" + +"@parcel/watcher-win32-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz#59da26a431da946e6c74fa6b0f30b120ea6650b6" + integrity sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw== + +"@parcel/watcher-win32-ia32@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz#3ee6a18b08929cd3b788e8cc9547fd9a540c013a" + integrity sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow== + +"@parcel/watcher-win32-x64@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz#14e7246289861acc589fd608de39fe5d8b4bb0a7" + integrity sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA== + "@parcel/watcher@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" @@ -3346,6 +3595,29 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" +"@parcel/watcher@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.3.0.tgz#803517abbc3981a1a1221791d9f59dc0590d50f9" + integrity sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.3.0" + "@parcel/watcher-darwin-arm64" "2.3.0" + "@parcel/watcher-darwin-x64" "2.3.0" + "@parcel/watcher-freebsd-x64" "2.3.0" + "@parcel/watcher-linux-arm-glibc" "2.3.0" + "@parcel/watcher-linux-arm64-glibc" "2.3.0" + "@parcel/watcher-linux-arm64-musl" "2.3.0" + "@parcel/watcher-linux-x64-glibc" "2.3.0" + "@parcel/watcher-linux-x64-musl" "2.3.0" + "@parcel/watcher-win32-arm64" "2.3.0" + "@parcel/watcher-win32-ia32" "2.3.0" + "@parcel/watcher-win32-x64" "2.3.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -3491,6 +3763,140 @@ resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== +"@stablelib/aead@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/aead/-/aead-1.0.1.tgz#c4b1106df9c23d1b867eb9b276d8f42d5fc4c0c3" + integrity sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/bytes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" + integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== + +"@stablelib/chacha20poly1305@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" + integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== + dependencies: + "@stablelib/aead" "^1.0.1" + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/constant-time" "^1.0.1" + "@stablelib/poly1305" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/constant-time@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/constant-time/-/constant-time-1.0.1.tgz#bde361465e1cf7b9753061b77e376b0ca4c77e35" + integrity sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== + +"@stablelib/ed25519@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/ed25519/-/ed25519-1.0.3.tgz#f8fdeb6f77114897c887bb6a3138d659d3f35996" + integrity sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== + dependencies: + "@stablelib/random" "^1.0.2" + "@stablelib/sha512" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hash@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hash/-/hash-1.0.1.tgz#3c944403ff2239fad8ebb9015e33e98444058bc5" + integrity sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== + +"@stablelib/hkdf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hkdf/-/hkdf-1.0.1.tgz#b4efd47fd56fb43c6a13e8775a54b354f028d98d" + integrity sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g== + dependencies: + "@stablelib/hash" "^1.0.1" + "@stablelib/hmac" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/hmac@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/hmac/-/hmac-1.0.1.tgz#3d4c1b8cf194cb05d28155f0eed8a299620a07ec" + integrity sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/keyagreement@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz#4612efb0a30989deb437cd352cee637ca41fc50f" + integrity sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== + dependencies: + "@stablelib/bytes" "^1.0.1" + +"@stablelib/poly1305@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/poly1305/-/poly1305-1.0.1.tgz#93bfb836c9384685d33d70080718deae4ddef1dc" + integrity sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== + dependencies: + "@stablelib/constant-time" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" + integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha256@1.0.1", "@stablelib/sha256@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" + integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/sha512@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/sha512/-/sha512-1.0.1.tgz#6da700c901c2c0ceacbd3ae122a38ac57c72145f" + integrity sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/hash" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/x25519@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" + integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== + dependencies: + "@stablelib/keyagreement" "^1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/wipe" "^1.0.1" + "@storybook/addon-actions@7.0.24": version "7.0.24" resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-7.0.24.tgz#6bdbd8118acfc46f140207a108a5a35cc980d948" @@ -4696,6 +5102,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/events@^3.0.1": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.3.tgz#a8ef894305af28d1fc6d2dfdfc98e899591ea529" + integrity sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.35" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" @@ -5401,6 +5812,353 @@ resolved "https://registry.yarnpkg.com/@vespaiach/axios-fetch-adapter/-/axios-fetch-adapter-0.3.1.tgz#b0c08167bec9cc558f578a1b9ccff52ead1cf1cb" integrity sha512-+1F52VWXmQHSRFSv4/H0wtnxfvjRMPK5531e880MIjypPdUSX6QZuoDgEVeCE1vjhzDdxCVX7rOqkub7StEUwQ== +"@walletconnect/auth-client@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@walletconnect/auth-client/-/auth-client-2.1.1.tgz#45548fc5d5e5ac155503d1b42ac97a96a2cba98d" + integrity sha512-rFGBG3pLkmwCc5DcL9JRCsvOAmPjUcHGxm+KlX31yXNOT1QACT8Gyd8ODSOmtvz5CXZS5dPWBuvO03LUSRbPkw== + dependencies: + "@ethersproject/hash" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "^1.0.1" + "@walletconnect/core" "^2.9.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "^1.2.1" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/utils" "^2.9.0" + events "^3.3.0" + isomorphic-unfetch "^3.1.0" + +"@walletconnect/core@2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.10.0.tgz#b659de4dfb374becd938964abd4f2150d410e617" + integrity sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.13" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + +"@walletconnect/core@2.10.2": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.10.2.tgz#a1bf6e3e87b33f9df795ce0970d8ddd400fdc8a3" + integrity sha512-JQz/xp3SLEpTeRQctdck2ugSBVEpMxoSE+lFi2voJkZop1hv6P+uqr6E4PzjFluAjeAnKlT1xvra0aFWjPWVcw== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.13" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.2" + "@walletconnect/utils" "2.10.2" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + +"@walletconnect/core@^2.9.0": + version "2.10.5" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.10.5.tgz#d61706c6459d9baaef05e83907df8cab82a03251" + integrity sha512-QnGHkA05KzJrtqExPqXm/TsstM1uTDI8tQT0x86/DuR6LdiYEntzSpVjnv7kKK6Mo9UxlXfud431dNRfOW5uJg== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.14" + "@walletconnect/keyvaluestorage" "^1.1.1" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.5" + "@walletconnect/utils" "2.10.5" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + +"@walletconnect/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7" + integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg== + dependencies: + tslib "1.14.1" + +"@walletconnect/events@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" + integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== + dependencies: + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" + +"@walletconnect/heartbeat@1.2.1", "@walletconnect/heartbeat@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" + integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-provider@1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" + integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/safe-json" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" + integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== + dependencies: + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" + +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" + integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== + dependencies: + "@walletconnect/environment" "^1.0.1" + "@walletconnect/jsonrpc-types" "^1.0.3" + tslib "1.14.1" + +"@walletconnect/jsonrpc-ws-connection@1.0.13": + version "1.0.13" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.13.tgz#23b0cdd899801bfbb44a6556936ec2b93ef2adf4" + integrity sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + tslib "1.14.1" + ws "^7.5.1" + +"@walletconnect/jsonrpc-ws-connection@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz#eec700e74766c7887de2bd76c91a0206628732aa" + integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== + dependencies: + "@walletconnect/jsonrpc-utils" "^1.0.6" + "@walletconnect/safe-json" "^1.0.2" + events "^3.3.0" + ws "^7.5.1" + +"@walletconnect/keyvaluestorage@^1.0.2", "@walletconnect/keyvaluestorage@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842" + integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== + dependencies: + "@walletconnect/safe-json" "^1.0.1" + idb-keyval "^6.2.1" + unstorage "^1.9.0" + +"@walletconnect/logger@2.0.1", "@walletconnect/logger@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" + integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== + dependencies: + pino "7.11.0" + tslib "1.14.1" + +"@walletconnect/relay-api@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" + integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== + dependencies: + "@walletconnect/jsonrpc-types" "^1.0.2" + tslib "1.14.1" + +"@walletconnect/relay-auth@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" + integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@walletconnect/safe-json" "^1.0.1" + "@walletconnect/time" "^1.0.2" + tslib "1.14.1" + uint8arrays "^3.0.0" + +"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" + integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== + dependencies: + tslib "1.14.1" + +"@walletconnect/sign-client@2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.10.0.tgz#0fee8f12821e37783099f0c7bd64e6efdfbd9d86" + integrity sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw== + dependencies: + "@walletconnect/core" "2.10.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + events "^3.3.0" + +"@walletconnect/time@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" + integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== + dependencies: + tslib "1.14.1" + +"@walletconnect/types@2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.0.tgz#5d63235b49e03d609521402a4b49627dbc4ed514" + integrity sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/types@2.10.2": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.2.tgz#68e433a29ec2cf42d79d8b50c77bd5c1d91db721" + integrity sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/types@2.10.5": + version "2.10.5" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.5.tgz#bf4e692cf736b6e71423f96a106d7a96089245de" + integrity sha512-N8xaN7/Kob93rKxKDaT6oy6symgIkAwyLqq0/dLJEhXfv7S/gyNvDka4SosjVVTc4oTvE1+OmxNIR8pB1DuwJw== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.1.1" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/utils@2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.0.tgz#6918d12180d797b8bd4a19fb2ff128e394e181d6" + integrity sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.0" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/utils@2.10.2": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.2.tgz#1f2c6a2f1bb95bcc4517b1e94aa7164c9286eb46" + integrity sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.2" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/utils@2.10.5", "@walletconnect/utils@^2.9.0": + version "2.10.5" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.5.tgz#8c8ef90c9e2b59886aae002ab8cbbdb35da1df9a" + integrity sha512-3yeclD9/AlPEIHBqBVzrHUO/KRAEIXVK0ViIQ5oUH+zT3TpdsDGDiW1Z0TsAQ1EiYoiiz8dOQzd80a3eZVwnrg== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.5" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/web3wallet@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@walletconnect/web3wallet/-/web3wallet-1.9.0.tgz#ad4094e1e2ed757bc75efa961121b66b2eeb4306" + integrity sha512-3uu6GbOz2uwcmVaIpijkPlReywC1GsFtwJOB1bJZOkc8wjtNmR3jUMwqxWUv8ojbmDVVWQl1HN7Sptkrmq9Xyw== + dependencies: + "@walletconnect/auth-client" "2.1.1" + "@walletconnect/core" "2.10.0" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.0.1" + "@walletconnect/sign-client" "2.10.0" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + +"@walletconnect/window-getters@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" + integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== + dependencies: + tslib "1.14.1" + +"@walletconnect/window-metadata@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" + integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== + dependencies: + "@walletconnect/window-getters" "^1.0.1" + tslib "1.14.1" + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -5681,16 +6439,16 @@ acorn@^7.1.1, acorn@^7.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.10.0, acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: version "8.9.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== -acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== - add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" @@ -5863,7 +6621,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -5923,6 +6681,11 @@ app-root-path@^3.0.0: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + archiver-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" @@ -6239,6 +7002,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + autoprefixer@^10.4.13: version "10.4.14" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" @@ -6673,7 +7441,7 @@ bn.js@4.12.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.3: +bn.js@^5.1.3, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -7248,6 +8016,13 @@ ci-info@^3.2.0, ci-info@^3.6.1: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== +citty@^0.1.3, citty@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.5.tgz#fe37ceae5dc764af75eb2fece99d2bf527ea4e50" + integrity sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ== + dependencies: + consola "^3.2.3" + cjs-module-lexer@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" @@ -7346,6 +8121,15 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +clipboardy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" + integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg== + dependencies: + arch "^2.2.0" + execa "^5.1.1" + is-wsl "^2.2.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -7385,6 +8169,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +cluster-key-slot@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== + cmd-shim@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" @@ -7631,6 +8420,11 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -7731,6 +8525,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie-es@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.0.0.tgz#4759684af168dfc54365b2c2dda0a8d7ee1e4865" + integrity sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -8135,7 +8934,7 @@ decimal.js@^10.2.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decode-uri-component@^0.2.0: +decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -8276,6 +9075,11 @@ defu@^6.1.2: resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.2.tgz#1217cba167410a1765ba93893c6dbac9ed9d9e5c" integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ== +defu@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.3.tgz#6d7f56bc61668e844f9f593ace66fd67ef1205fd" + integrity sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ== + del@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" @@ -8300,6 +9104,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -8320,11 +9129,21 @@ dequal@^2.0.2, dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +destr@^2.0.1, destr@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.2.tgz#8d3c0ee4ec0a76df54bc8b819bca215592a8c218" + integrity sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-browser@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" + integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== + detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" @@ -8335,6 +9154,11 @@ detect-indent@^6.1.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-libc@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -8641,6 +9465,16 @@ duplexify@^3.5.0, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +duplexify@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -9801,6 +10635,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-redact@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -9898,6 +10737,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + finalhandler@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" @@ -10266,6 +11110,11 @@ get-pkg-repo@^4.2.1: through2 "^2.0.0" yargs "^16.2.0" +get-port-please@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/get-port-please/-/get-port-please-3.1.1.tgz#2556623cddb4801d823c0a6a15eec038abb483be" + integrity sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA== + get-port@5.1.1, get-port@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" @@ -10599,6 +11448,20 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" +h3@^1.8.1, h3@^1.8.2: + version "1.9.0" + resolved "https://registry.yarnpkg.com/h3/-/h3-1.9.0.tgz#c5f512a93026df9837db6f30c9ef51135dd46752" + integrity sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA== + dependencies: + cookie-es "^1.0.0" + defu "^6.1.3" + destr "^2.0.2" + iron-webcrypto "^1.0.0" + radix3 "^1.1.0" + ufo "^1.3.2" + uncrypto "^0.1.3" + unenv "^1.7.4" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -10708,7 +11571,7 @@ has@^1.0.0, has@^1.0.3: dependencies: function-bind "^1.1.1" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -10943,6 +11806,11 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-shutdown@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/http-shutdown/-/http-shutdown-1.2.2.tgz#41bc78fc767637c4c95179bc492f312c0ae64c5f" + integrity sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw== + http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -11038,6 +11906,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb-keyval@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" + integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== + idb@^7.0.1: version "7.1.1" resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" @@ -11201,6 +12074,21 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +ioredis@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" + integrity sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA== + dependencies: + "@ioredis/commands" "^1.1.1" + cluster-key-slot "^1.1.0" + debug "^4.3.4" + denque "^2.1.0" + lodash.defaults "^4.2.0" + lodash.isarguments "^3.1.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + ip@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" @@ -11216,6 +12104,11 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +iron-webcrypto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz#e3b689c0c61b434a0a4cb82d0aeabbc8b672a867" + integrity sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg== + is-absolute-url@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" @@ -12394,6 +13287,11 @@ jiti@^1.18.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== +jiti@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + joi@^17.7.0: version "17.9.2" resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" @@ -12405,6 +13303,11 @@ joi@^17.7.0: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -12565,7 +13468,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -jsonc-parser@3.2.0: +jsonc-parser@3.2.0, jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== @@ -12626,6 +13529,11 @@ keyv@^4.0.0: dependencies: json-buffer "3.0.1" +keyvaluestorage-interface@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" + integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -12936,6 +13844,29 @@ lint-staged@13.3.0: string-argv "0.3.2" yaml "2.3.1" +listhen@^1.5.5: + version "1.5.5" + resolved "https://registry.yarnpkg.com/listhen/-/listhen-1.5.5.tgz#58915512af70f770aa3e9fb19367adf479bb58c4" + integrity sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA== + dependencies: + "@parcel/watcher" "^2.3.0" + "@parcel/watcher-wasm" "2.3.0" + citty "^0.1.4" + clipboardy "^3.0.0" + consola "^3.2.3" + defu "^6.1.2" + get-port-please "^3.1.1" + h3 "^1.8.1" + http-shutdown "^1.2.2" + jiti "^1.20.0" + mlly "^1.4.2" + node-forge "^1.3.1" + pathe "^1.1.1" + std-env "^3.4.3" + ufo "^1.3.0" + untun "^0.1.2" + uqr "^0.1.2" + listr2@6.6.1: version "6.6.1" resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" @@ -13052,7 +13983,12 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== -lodash.isequal@^4.5.0: +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== + +lodash.isequal@4.5.0, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== @@ -13116,6 +14052,11 @@ log-update@^5.0.1: strip-ansi "^7.0.1" wrap-ansi "^8.0.1" +lokijs@^1.5.12: + version "1.5.12" + resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.5.12.tgz#cb55b37009bdf09ee7952a6adddd555b893653a0" + integrity sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -13135,6 +14076,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^10.0.2: + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -13412,6 +14358,11 @@ mime@^2.0.3, mime@^2.5.2: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -13623,6 +14574,16 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mlly@^1.2.0, mlly@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e" + integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg== + dependencies: + acorn "^8.10.0" + pathe "^1.1.1" + pkg-types "^1.0.3" + ufo "^1.3.0" + modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -13666,6 +14627,11 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + multimatch@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -13738,6 +14704,11 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +napi-wasm@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" + integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -13818,6 +14789,11 @@ node-addon-api@^6.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== +node-addon-api@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.0.0.tgz#8136add2f510997b3b94814f4af1cce0b0e3962e" + integrity sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA== + node-dir@^0.1.10, node-dir@^0.1.17: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -13830,6 +14806,11 @@ node-fetch-native@^1.0.2: resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.2.0.tgz#13ec6df98f33168958dbfb6945f10aedf42e7ea8" integrity sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ== +node-fetch-native@^1.4.0, node-fetch-native@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.4.1.tgz#5a336e55b4e1b1e72b9927da09fecd2b374c9be5" + integrity sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w== + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -13851,7 +14832,7 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-forge@^1: +node-forge@^1, node-forge@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== @@ -14307,6 +15288,15 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +ofetch@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.3.3.tgz#588cb806a28e5c66c2c47dd8994f9059a036d8c0" + integrity sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg== + dependencies: + destr "^2.0.1" + node-fetch-native "^1.4.0" + ufo "^1.3.0" + office-ui-fabric-react@7.204.0: version "7.204.0" resolved "https://registry.yarnpkg.com/office-ui-fabric-react/-/office-ui-fabric-react-7.204.0.tgz#1bec4d14f91bee8fddf2fc05bdc1a8af462211fa" @@ -14328,6 +15318,11 @@ office-ui-fabric-react@7.204.0: prop-types "^15.7.2" tslib "^1.10.0" +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -14759,7 +15754,7 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.0: +pathe@^1.1.0, pathe@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== @@ -14823,6 +15818,36 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== + dependencies: + duplexify "^4.1.2" + split2 "^4.0.0" + +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz#1791ccd2539c091ae49ce9993205e2cd5dbba1e2" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@7.11.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: version "4.0.6" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" @@ -14849,6 +15874,15 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -15531,6 +16565,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -15692,6 +16731,16 @@ qs@^6.10.0: dependencies: side-channel "^1.0.4" +query-string@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== + dependencies: + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -15702,6 +16751,11 @@ queue-microtask@^1.2.2, queue-microtask@^1.2.3: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -15712,6 +16766,11 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +radix3@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.0.tgz#9745df67a49c522e94a33d0a93cf743f104b6e0d" + integrity sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A== + raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -16146,6 +17205,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== + realpath-native@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" @@ -16194,6 +17258,18 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== + dependencies: + redis-errors "^1.0.0" + reflect-metadata@0.1.13, reflect-metadata@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -16591,6 +17667,11 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-stable-stringify@^2.1.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -17072,6 +18153,13 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== + dependencies: + atomic-sleep "^1.0.0" + sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -17208,6 +18296,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -17222,6 +18315,11 @@ split2@^3.2.2: dependencies: readable-stream "^3.0.0" +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -17293,6 +18391,11 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +standard-as-callback@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== + stat-mode@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" @@ -17316,6 +18419,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +std-env@^3.4.3: + version "3.5.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.5.0.tgz#83010c9e29bd99bf6f605df87c19012d82d63b97" + integrity sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -17347,6 +18455,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + string-argv@0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" @@ -17850,6 +18963,13 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-0.15.2.tgz#fb95ad87d2f1e28f07116eb23d85aba3bc0425f4" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== + dependencies: + real-require "^0.1.0" + throat@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" @@ -18040,16 +19160,16 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: version "2.6.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" @@ -18209,11 +19329,23 @@ typescript@5.3.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== +ufo@^1.3.0, ufo@^1.3.1, ufo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" + integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== + uglify-js@^3.1.4: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== +uint8arrays@^3.0.0, uint8arrays@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -18224,6 +19356,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +uncrypto@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" + integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== + undici@5.26.2: version "5.26.2" resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.2.tgz#fa61bfe40f732540d15e58b0c1271872d8e3c995" @@ -18231,6 +19368,17 @@ undici@5.26.2: dependencies: "@fastify/busboy" "^2.0.0" +unenv@^1.7.4: + version "1.8.0" + resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.8.0.tgz#0f860d5278405700bd95d47b23bc01f3a735d68c" + integrity sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg== + dependencies: + consola "^3.2.3" + defu "^6.1.3" + mime "^3.0.0" + node-fetch-native "^1.4.1" + pathe "^1.1.1" + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -18374,11 +19522,37 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +unstorage@^1.9.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.10.1.tgz#bf8cc00a406e40a6293e893da9807057d95875b0" + integrity sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw== + dependencies: + anymatch "^3.1.3" + chokidar "^3.5.3" + destr "^2.0.2" + h3 "^1.8.2" + ioredis "^5.3.2" + listhen "^1.5.5" + lru-cache "^10.0.2" + mri "^1.2.0" + node-fetch-native "^1.4.1" + ofetch "^1.3.3" + ufo "^1.3.1" + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +untun@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/untun/-/untun-0.1.2.tgz#fa42a62ae24c1c5c6f3209692a2b0e1f573f1353" + integrity sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q== + dependencies: + citty "^0.1.3" + consola "^3.2.3" + pathe "^1.1.1" + unzip-crx-3@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz#d5324147b104a8aed9ae8639c95521f6f7cda292" @@ -18406,6 +19580,11 @@ update-browserslist-db@^1.0.11: escalade "^3.1.1" picocolors "^1.0.0" +uqr@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/uqr/-/uqr-0.1.2.tgz#5c6cd5dcff9581f9bb35b982cb89e2c483a41d7d" + integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -19174,7 +20353,7 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -ws@^7.4.6: +ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==