From ff24a4a3ba337f19324d253ca9c07634bed526e0 Mon Sep 17 00:00:00 2001 From: Matthew Russell Date: Mon, 21 Feb 2022 22:40:55 -0800 Subject: [PATCH] add dialog to ui-toolkit, add functionality to provider to render connect dialog and connectors ui --- apps/trading/next.config.js | 4 + apps/trading/pages/_app.page.tsx | 21 +++ apps/trading/pages/index.page.tsx | 7 +- libs/react-helpers/src/index.ts | 1 + .../src/lib/vega-wallet/connect-dialog.tsx | 63 +++++++ .../src/lib/vega-wallet/hooks.ts | 10 ++ .../src/lib/vega-wallet/index.ts | 3 + .../lib/vega-wallet/rest-connector-form.tsx | 57 +++++++ .../lib/vega-wallet/vega-wallet-connectors.ts | 86 ++++++++++ .../lib/vega-wallet/vega-wallet-context.ts | 16 ++ .../lib/vega-wallet/vega-wallet-provider.tsx | 67 ++++++++ libs/storage/src/index.ts | 28 +++ .../src/components/dialog/index.tsx | 24 +++ libs/ui-toolkit/src/index.ts | 1 + package.json | 3 + tsconfig.base.json | 3 +- yarn.lock | 161 ++++++++++++++++++ 17 files changed, 549 insertions(+), 6 deletions(-) create mode 100644 libs/react-helpers/src/lib/vega-wallet/connect-dialog.tsx create mode 100644 libs/react-helpers/src/lib/vega-wallet/hooks.ts create mode 100644 libs/react-helpers/src/lib/vega-wallet/index.ts create mode 100644 libs/react-helpers/src/lib/vega-wallet/rest-connector-form.tsx create mode 100644 libs/react-helpers/src/lib/vega-wallet/vega-wallet-connectors.ts create mode 100644 libs/react-helpers/src/lib/vega-wallet/vega-wallet-context.ts create mode 100644 libs/react-helpers/src/lib/vega-wallet/vega-wallet-provider.tsx create mode 100644 libs/storage/src/index.ts create mode 100644 libs/ui-toolkit/src/components/dialog/index.tsx diff --git a/apps/trading/next.config.js b/apps/trading/next.config.js index 5b054d1d1..d1ba03cb6 100644 --- a/apps/trading/next.config.js +++ b/apps/trading/next.config.js @@ -11,6 +11,10 @@ const nextConfig = { svgr: false, }, pageExtensions: ['page.tsx', 'page.jsx'], + experimental: { + // https://github.com/vercel/next.js/issues/32360 + esmExternals: false, + }, }; module.exports = withNx(nextConfig); diff --git a/apps/trading/pages/_app.page.tsx b/apps/trading/pages/_app.page.tsx index afd82c7d8..b73870b31 100644 --- a/apps/trading/pages/_app.page.tsx +++ b/apps/trading/pages/_app.page.tsx @@ -5,6 +5,7 @@ import { useCallback, useMemo } from 'react'; import { Navbar } from '../components/navbar'; import { createClient } from '../lib/apollo-client'; import { ThemeSwitcher } from '@vegaprotocol/ui-toolkit'; +import { useVegaWallet } from '@vegaprotocol/react-helpers'; import './styles.css'; function VegaTradingApp({ Component, pageProps }: AppProps) { @@ -38,6 +39,7 @@ function VegaTradingApp({ Component, pageProps }: AppProps) {
+
@@ -48,4 +50,23 @@ function VegaTradingApp({ Component, pageProps }: AppProps) { ); } +const VegaWalletButton = () => { + const { setConnectDialog, disconnect, publicKeys } = useVegaWallet(); + const isConnected = publicKeys !== null; + + const handleClick = () => { + if (isConnected) { + disconnect(); + } else { + setConnectDialog(); + } + }; + + return ( + + ); +}; + export default VegaTradingApp; diff --git a/apps/trading/pages/index.page.tsx b/apps/trading/pages/index.page.tsx index 34a6921eb..6245e1005 100644 --- a/apps/trading/pages/index.page.tsx +++ b/apps/trading/pages/index.page.tsx @@ -1,11 +1,7 @@ import { Callout, Button } from '@vegaprotocol/ui-toolkit'; export function Index() { - /* - * Replace the elements below with your own. - * - * Note: The corresponding styles are in the ./index.scss file. - */ + const vegaWallet = useVegaWallet(); return (
+
{JSON.stringify(vegaWallet, null, 2)}
); } diff --git a/libs/react-helpers/src/index.ts b/libs/react-helpers/src/index.ts index afaebe2fe..8135a80d0 100644 --- a/libs/react-helpers/src/index.ts +++ b/libs/react-helpers/src/index.ts @@ -1,2 +1,3 @@ export * from './lib/react-helpers'; export * from './lib/trading'; +export * from './lib/vega-wallet'; diff --git a/libs/react-helpers/src/lib/vega-wallet/connect-dialog.tsx b/libs/react-helpers/src/lib/vega-wallet/connect-dialog.tsx new file mode 100644 index 000000000..ea127ad69 --- /dev/null +++ b/libs/react-helpers/src/lib/vega-wallet/connect-dialog.tsx @@ -0,0 +1,63 @@ +import { useState } from 'react'; +import { Dialog } from '@vegaprotocol/ui-toolkit'; +import { + InjectedConnector, + RestConnector, + VegaConnector, +} from './vega-wallet-connectors'; +import { RestConnectorForm } from './rest-connector-form'; +import { useEffect } from 'react'; + +export const Connectors = { + injected: new InjectedConnector(), + rest: new RestConnector(), +}; + +interface ConnectDialogProps { + dialogOpen: boolean; + setDialogOpen: (isOpen: boolean) => void; + connect: (connector: VegaConnector) => void; +} + +export function ConnectDialog({ + dialogOpen, + setDialogOpen, + connect, +}: ConnectDialogProps) { + const [isRestConnector, setIsRestConnector] = useState(false); + + useEffect(() => { + if (!dialogOpen) { + setIsRestConnector(false); + } + }, [dialogOpen]); + + return ( + +
+ {isRestConnector ? ( + + ) : ( +
+ {Object.entries(Connectors).map(([key, connector]) => ( + + ))} +
+ )} +
+
+ ); +} diff --git a/libs/react-helpers/src/lib/vega-wallet/hooks.ts b/libs/react-helpers/src/lib/vega-wallet/hooks.ts new file mode 100644 index 000000000..c85a2ae1b --- /dev/null +++ b/libs/react-helpers/src/lib/vega-wallet/hooks.ts @@ -0,0 +1,10 @@ +import { useContext } from 'react'; +import { VegaWalletContext } from '.'; + +export function useVegaWallet() { + const context = useContext(VegaWalletContext); + if (context === undefined) { + throw new Error('useVegaWallet must be used within VegaWalletProvider'); + } + return context; +} diff --git a/libs/react-helpers/src/lib/vega-wallet/index.ts b/libs/react-helpers/src/lib/vega-wallet/index.ts new file mode 100644 index 000000000..ff51a2552 --- /dev/null +++ b/libs/react-helpers/src/lib/vega-wallet/index.ts @@ -0,0 +1,3 @@ +export * from './vega-wallet-provider'; +export * from './vega-wallet-context'; +export * from './hooks'; diff --git a/libs/react-helpers/src/lib/vega-wallet/rest-connector-form.tsx b/libs/react-helpers/src/lib/vega-wallet/rest-connector-form.tsx new file mode 100644 index 000000000..3d43a1ea8 --- /dev/null +++ b/libs/react-helpers/src/lib/vega-wallet/rest-connector-form.tsx @@ -0,0 +1,57 @@ +import { useForm } from 'react-hook-form'; +import { useVegaWallet } from '.'; +import { Connectors } from './connect-dialog'; + +interface FormFields { + wallet: string; + passphrase: string; +} + +interface RestConnectorFormProps { + setDialogOpen: (isOpen: boolean) => void; +} + +export function RestConnectorForm({ setDialogOpen }: RestConnectorFormProps) { + const { connect } = useVegaWallet(); + const { register, handleSubmit } = useForm(); + + async function onSubmit(fields: FormFields) { + try { + const success = await Connectors.rest.authenticate({ + wallet: fields.wallet, + passphrase: fields.passphrase, + }); + + if (success) { + connect(Connectors.rest); + setDialogOpen(false); + } else { + throw new Error('Authentication failed'); + } + } catch (err) { + console.error(err); + } + } + + return ( +
+
+ +
+
+ +
+ +
+ ); +} diff --git a/libs/react-helpers/src/lib/vega-wallet/vega-wallet-connectors.ts b/libs/react-helpers/src/lib/vega-wallet/vega-wallet-connectors.ts new file mode 100644 index 000000000..4e7bc5a56 --- /dev/null +++ b/libs/react-helpers/src/lib/vega-wallet/vega-wallet-connectors.ts @@ -0,0 +1,86 @@ +import { + DefaultApi, + createConfiguration, + Configuration, + VegaKey, +} from '@vegaprotocol/vegawallet-service-api-client'; +import { LocalStorage } from '@vegaprotocol/storage'; + +export interface VegaConnector { + connect(): Promise; + disconnect(): Promise; +} + +export class RestConnector implements VegaConnector { + apiConfig: Configuration; + service: DefaultApi; + + constructor() { + this.apiConfig = createConfiguration({ + authMethods: { + bearer: `Bearer ${LocalStorage.getItem('vega_wallet_token')}`, + }, + promiseMiddleware: [ + { + pre: async (requestContext) => { + const headers = requestContext.getHeaders(); + if ( + 'Authorization' in headers && + headers['Authorization'] === 'Bearer null' + ) { + console.log('first login: getting and setting auth header'); + requestContext.setHeaderParam( + 'Authorization', + `Bearer ${LocalStorage.getItem('vega_wallet_token')}` + ); + } + return requestContext; + }, + post: async (requestContext) => { + return requestContext; + }, + }, + ], + }); + this.service = new DefaultApi(this.apiConfig); + } + + async authenticate(params: { wallet: string; passphrase: string }) { + try { + const tokenRes = await this.service.authTokenPost(params); + LocalStorage.setItem('vega_wallet_token', tokenRes.token); + return true; + } catch (err) { + console.error(err); + return false; + } + } + + async connect() { + const res = await this.service.keysGet(); + return res.keys; + } + + async disconnect() { + await this.service.authTokenDelete(); + LocalStorage.removeItem('vega_wallet_token'); + } +} + +export class InjectedConnector implements VegaConnector { + async connect() { + return [ + { + index: 9, + pub: '0x123', + algorithm: { name: 'algo', version: 2 }, + tainted: false, + meta: [], + }, + ]; + } + + async disconnect() { + return; + } +} diff --git a/libs/react-helpers/src/lib/vega-wallet/vega-wallet-context.ts b/libs/react-helpers/src/lib/vega-wallet/vega-wallet-context.ts new file mode 100644 index 000000000..39472be04 --- /dev/null +++ b/libs/react-helpers/src/lib/vega-wallet/vega-wallet-context.ts @@ -0,0 +1,16 @@ +import { VegaKey } from '@vegaprotocol/vegawallet-service-api-client'; +import { createContext } from 'react'; +import { VegaConnector } from './vega-wallet-connectors'; + +interface VegaWalletContextShape { + publicKey: VegaKey | null; + publicKeys: VegaKey[] | null; + setConnectDialog: (isOpen?: boolean) => void; + connect: (connector: VegaConnector) => Promise; + disconnect: () => Promise; + connector: VegaConnector | null; +} + +export const VegaWalletContext = createContext< + VegaWalletContextShape | undefined +>(undefined); diff --git a/libs/react-helpers/src/lib/vega-wallet/vega-wallet-provider.tsx b/libs/react-helpers/src/lib/vega-wallet/vega-wallet-provider.tsx new file mode 100644 index 000000000..3a067e2ac --- /dev/null +++ b/libs/react-helpers/src/lib/vega-wallet/vega-wallet-provider.tsx @@ -0,0 +1,67 @@ +import { VegaKey } from '@vegaprotocol/vegawallet-service-api-client'; +import { ReactNode, useCallback, useMemo, useRef, useState } from 'react'; +import { ConnectDialog } from './connect-dialog'; +import { VegaConnector } from './vega-wallet-connectors'; +import { VegaWalletContext } from './vega-wallet-context'; + +interface VegaWalletProviderProps { + children: ReactNode; +} + +export const VegaWalletProvider = ({ children }: VegaWalletProviderProps) => { + const [dialogOpen, setDialogOpen] = useState(false); + const [publicKey, setPublicKey] = useState(null); + const [publicKeys, setPublicKeys] = useState(null); + const connector = useRef(null); + + const setConnectDialog = useCallback((isOpen?: boolean) => { + setDialogOpen((curr) => { + if (isOpen === undefined) return !curr; + return isOpen; + }); + }, []); + + const connect = useCallback(async (c: VegaConnector) => { + connector.current = c; + try { + const res = await c.connect(); + setPublicKeys(res); + } catch (err) { + console.log('connect failed'); + } + }, []); + + const disconnect = useCallback(async () => { + if (!connector.current) return; + try { + await connector.current.disconnect(); + setPublicKeys(null); + setPublicKey(null); + connector.current = null; + } catch (err) { + console.log('disconnect failed', err); + } + }, []); + + const contextValue = useMemo(() => { + return { + publicKey, + publicKeys, + setConnectDialog, + connect, + disconnect, + connector: connector.current, + }; + }, [publicKey, publicKeys, connect, disconnect, setConnectDialog, connector]); + + return ( + + {children} + + + ); +}; diff --git a/libs/storage/src/index.ts b/libs/storage/src/index.ts new file mode 100644 index 000000000..6f5add3fc --- /dev/null +++ b/libs/storage/src/index.ts @@ -0,0 +1,28 @@ +// TODO: fine for now however will leak state between tests (we don't really have) in future. Ideally should use a provider +export const LocalStorage = { + getItem: (key: string) => { + if (typeof window === 'undefined') return null; + try { + const item = window.localStorage.getItem(key); + return item ? JSON.parse(item) : null; + } catch (error) { + console.error(error); + } + }, + setItem: (key: string, value: any) => { + if (typeof window === 'undefined') return; + try { + window.localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.error(error); + } + }, + removeItem: (key: string) => { + if (typeof window === 'undefined') return; + try { + window.localStorage.removeItem(key); + } catch (error) { + console.error(error); + } + }, +}; diff --git a/libs/ui-toolkit/src/components/dialog/index.tsx b/libs/ui-toolkit/src/components/dialog/index.tsx new file mode 100644 index 000000000..71cbf6506 --- /dev/null +++ b/libs/ui-toolkit/src/components/dialog/index.tsx @@ -0,0 +1,24 @@ +import * as DialogPrimitives from '@radix-ui/react-dialog'; +import { ReactNode } from 'react'; + +interface DialogProps { + children: ReactNode; + open: boolean; + setOpen: (isOpen: boolean) => void; +} + +export function Dialog({ children, open, setOpen }: DialogProps) { + return ( + setOpen(x)}> + + + + {children} + + + + ); +} diff --git a/libs/ui-toolkit/src/index.ts b/libs/ui-toolkit/src/index.ts index 5a2cbaf06..1085ffb63 100644 --- a/libs/ui-toolkit/src/index.ts +++ b/libs/ui-toolkit/src/index.ts @@ -10,3 +10,4 @@ export { InputError } from './components/input-error'; export { Select } from './components/select'; export { TextArea } from './components/text-area'; export { ThemeSwitcher } from './components/theme-switcher'; +export { Dialog } from './components/dialog'; diff --git a/package.json b/package.json index e69c700d5..9c3e98dcf 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,8 @@ "apollo": "^2.33.9", "autoprefixer": "^10.4.2", "classnames": "^2.3.1", + "@radix-ui/react-dialog": "^0.1.5", + "@vegaprotocol/vegawallet-service-api-client": "^0.3.0", "core-js": "^3.6.5", "env-cmd": "^10.1.0", "graphql": "^15.7.2", @@ -35,6 +37,7 @@ "react-syntax-highlighter": "^15.4.5", "react-use-websocket": "^3.0.0", "react-virtualized-auto-sizer": "^1.0.6", + "react-hook-form": "^7.27.0", "regenerator-runtime": "0.13.7", "tailwindcss": "^3.0.23", "tslib": "^2.0.0", diff --git a/tsconfig.base.json b/tsconfig.base.json index 7b50969ae..5f463b770 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -19,7 +19,8 @@ "@vegaprotocol/tailwindcss-config": [ "libs/tailwindcss-config/src/index.js" ], - "@vegaprotocol/ui-toolkit": ["libs/ui-toolkit/src/index.ts"] + "@vegaprotocol/ui-toolkit": ["libs/ui-toolkit/src/index.ts"], + "@vegaprotocol/storage": ["libs/storage/src/index.ts"] } }, "exclude": ["node_modules", "tmp"] diff --git a/yarn.lock b/yarn.lock index ae5240e19..ce3cad42b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2721,6 +2721,158 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/primitive@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-0.1.0.tgz#6206b97d379994f0d1929809db035733b337e543" + integrity sha512-tqxZKybwN5Fa3VzZry4G6mXAAb9aAqKmPtnVbZpL0vsBwvOHTBwsjHVPXylocYLwEtBY9SCe665bYnNB515uoA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-compose-refs@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-0.1.0.tgz#cff6e780a0f73778b976acff2c2a5b6551caab95" + integrity sha512-eyclbh+b77k+69Dk72q3694OHrn9B3QsoIRx7ywX341U9RK1ThgQjMFZoPtmZNQTksXHLNEiefR8hGVeFyInGg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-0.1.1.tgz#06996829ea124d9a1bc1dbe3e51f33588fab0875" + integrity sha512-PkyVX1JsLBioeu0jB9WvRpDBBLtLZohVDT3BB5CTSJqActma8S8030P57mWZb4baZifMvN7KKWPAA40UmWKkQg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dialog@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-0.1.5.tgz#4310659607f5ad0b8796623d5f7490dc47d3d295" + integrity sha512-WftvXcQSszUphCTLQkkpBIkrYYU0IYqgIvACLQady4BN4YHDgdNlrwdg2ti9QrXgq1PZ+0S/6BIaA1dmSuRQ2g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "0.1.0" + "@radix-ui/react-compose-refs" "0.1.0" + "@radix-ui/react-context" "0.1.1" + "@radix-ui/react-dismissable-layer" "0.1.3" + "@radix-ui/react-focus-guards" "0.1.0" + "@radix-ui/react-focus-scope" "0.1.3" + "@radix-ui/react-id" "0.1.4" + "@radix-ui/react-portal" "0.1.3" + "@radix-ui/react-presence" "0.1.1" + "@radix-ui/react-primitive" "0.1.3" + "@radix-ui/react-slot" "0.1.2" + "@radix-ui/react-use-controllable-state" "0.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "^2.4.0" + +"@radix-ui/react-dismissable-layer@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-0.1.3.tgz#d427c7520c3799d2b957e40e7d67045d96120356" + integrity sha512-3veE7M8K13Qb+6+tC3DHWmWV9VMuuRoZvRLdrvz7biSraK/qkGBN4LbKZDaTdw2D2HS7RNpSd/sF8pFd3TaAgA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "0.1.0" + "@radix-ui/react-context" "0.1.1" + "@radix-ui/react-primitive" "0.1.3" + "@radix-ui/react-use-body-pointer-events" "0.1.0" + "@radix-ui/react-use-callback-ref" "0.1.0" + "@radix-ui/react-use-escape-keydown" "0.1.0" + +"@radix-ui/react-focus-guards@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-0.1.0.tgz#ba3b6f902cba7826569f8edc21ff8223dece7def" + integrity sha512-kRx/swAjEfBpQ3ns7J3H4uxpXuWCqN7MpALiSDOXiyo2vkWv0L9sxvbpZeTulINuE3CGMzicVMuNc/VWXjFKOg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-scope@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-0.1.3.tgz#b1cc825b6190001d731417ed90d192d13b41bce1" + integrity sha512-bKi+lw14SriQqYWMBe13b/wvxSqYMC+3FylMUEwOKA6JrBoldpkhX5XffGDdpDRTTpjbncdH3H7d1PL5Bs7Ikg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "0.1.0" + "@radix-ui/react-primitive" "0.1.3" + "@radix-ui/react-use-callback-ref" "0.1.0" + +"@radix-ui/react-id@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-0.1.4.tgz#4cd6126e6ac8a43ebe6d52948a068b797cc9ad71" + integrity sha512-/hq5m/D0ZfJWOS7TLF+G0l08KDRs87LBE46JkAvgKkg1fW4jkucx9At9D9vauIPSbdNmww5kXEp566hMlA8eXA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "0.1.0" + +"@radix-ui/react-portal@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-0.1.3.tgz#56826e789b3d4e37983f6d23666e3f1b1b9ee358" + integrity sha512-DrV+sPYLs0HhmX5/b7yRT6nLM9Nl6FtQe2KUG+46kiCOKQ+0XzNMO5hmeQtyq0mRf/qlC02rFu6OMsWpIqVsJg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "0.1.3" + "@radix-ui/react-use-layout-effect" "0.1.0" + +"@radix-ui/react-presence@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-0.1.1.tgz#2088dec6f4f8042f83dd2d6bf9e8ef09dadbbc15" + integrity sha512-LsL+NcWDpFUAYCmXeH02o4pgqcSLpwxP84UIjCtpIKrsPe2vLuhcp79KC/jZJeXz+of2lUpMAxpM+eCpxFZtlg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "0.1.0" + "@radix-ui/react-use-layout-effect" "0.1.0" + +"@radix-ui/react-primitive@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-0.1.3.tgz#585c35ef2ec06bab0ea9e0fc5c916e556661b881" + integrity sha512-fcyADaaAx2jdqEDLsTs6aX50S3L1c9K9CC6XMpJpuXFJCU4n9PGTFDZRtY2gAoXXoRCPIBsklCopSmGb6SsDjQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "0.1.2" + +"@radix-ui/react-slot@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-0.1.2.tgz#e6f7ad9caa8ce81cc8d532c854c56f9b8b6307c8" + integrity sha512-ADkqfL+agEzEguU3yS26jfB50hRrwf7U4VTwAOZEmi/g+ITcBWe12yM46ueS/UCIMI9Py+gFUaAdxgxafFvY2Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "0.1.0" + +"@radix-ui/react-use-body-pointer-events@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-body-pointer-events/-/react-use-body-pointer-events-0.1.0.tgz#29b211464493f8ca5149ce34b96b95abbc97d741" + integrity sha512-svPyoHCcwOq/vpWNEvdH/yD91vN9p8BtiozNQbjVmJRxQ/vS12zqk70AxTGWe+2ZKHq2sggpEQNTv1JHyVFlnQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "0.1.0" + +"@radix-ui/react-use-callback-ref@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-0.1.0.tgz#934b6e123330f5b3a6b116460e6662cbc663493f" + integrity sha512-Va041McOFFl+aV+sejvl0BS2aeHx86ND9X/rVFmEFQKTXCp6xgUK0NGUAGcgBlIjnJSbMYPGEk1xKSSlVcN2Aw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-controllable-state@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-0.1.0.tgz#4fced164acfc69a4e34fb9d193afdab973a55de1" + integrity sha512-zv7CX/PgsRl46a52Tl45TwqwVJdmqnlQEQhaYMz/yBOD2sx2gCkCFSoF/z9mpnYWmS6DTLNTg5lIps3fV6EnXg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "0.1.0" + +"@radix-ui/react-use-escape-keydown@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-0.1.0.tgz#dc80cb3753e9d1bd992adbad9a149fb6ea941874" + integrity sha512-tDLZbTGFmvXaazUXXv8kYbiCcbAE8yKgng9s95d8fCO+Eundv0Jngbn/hKPhDDs4jj9ChwRX5cDDnlaN+ugYYQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "0.1.0" + +"@radix-ui/react-use-layout-effect@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-0.1.0.tgz#ebf71bd6d2825de8f1fbb984abf2293823f0f223" + integrity sha512-+wdeS51Y+E1q1Wmd+1xSSbesZkpVj4jsg0BojCbopWvgq5iBvixw5vgemscdh58ep98BwUbsFYnrywFhV9yrVg== + dependencies: + "@babel/runtime" "^7.13.10" + "@rollup/plugin-babel@^5.3.0": version "5.3.0" resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz" @@ -5069,6 +5221,15 @@ "@typescript-eslint/types" "5.10.2" eslint-visitor-keys "^3.0.0" +"@vegaprotocol/vegawallet-service-api-client@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@vegaprotocol/vegawallet-service-api-client/-/vegawallet-service-api-client-0.3.0.tgz#93ef25f94a2fb3280928053eceed945d00bb0a3a" + integrity sha512-JQHdKI/B6hvnqdXQpWi+zsU2tiJJzkNaZE/aOFFbrdl9gUooF94piDzc5PPBx3YO4NA7mWKwaf4VqRckzjVKXw== + dependencies: + es6-promise "^4.2.4" + url-parse "^1.4.3" + whatwg-fetch "^3.0.0" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz"