From ed79946e0ee25015d76454bf75621d28403cf254 Mon Sep 17 00:00:00 2001 From: Vitor Marthendal Nunes Date: Mon, 24 Jul 2023 20:21:02 -0300 Subject: [PATCH] Fear: Add Livepeer integration and latest TurboETH fixes (#7) * feat: add livepeer integration * feat: add CLI CTA to homepage * refactor: remove nested button from link and non existing css style * chore: turn site_url env public --- package.json | 2 +- src/config/env-variables.ts | 2 +- src/config/integrations.ts | 28 + src/types.ts | 1 + template/base/.env.example | 9 +- .../sign-in-with-ethereum/page.tsx | 4 +- template/base/app/(general)/layout.tsx | 2 +- template/base/app/(general)/page.tsx | 60 +- template/base/app/admin/layout.tsx | 2 +- template/base/app/dashboard/layout.tsx | 2 +- template/base/app/layout.tsx | 2 +- template/base/components/layout/header.tsx | 6 +- .../layout/navigation-menu-general.tsx | 2 +- template/base/components/shared/card.tsx | 4 +- .../ui/social/og-image-integrations.tsx | 2 +- template/base/config/site.ts | 4 + template/base/data/turbo-integrations.ts | 8 + template/base/env.mjs | 6 +- template/base/lib/utils/index.ts | 2 +- template/base/package.json | 3 + template/base/pnpm-lock.yaml | 1421 ++++++++++++----- .../base/public/integrations/livepeer.svg | 12 + .../connext/pages/connext/layout.tsx | 6 +- .../integrations/disco/pages/disco/page.tsx | 4 +- .../integrations/erc20/pages/erc20/page.tsx | 4 +- .../integrations/erc721/pages/erc721/page.tsx | 4 +- .../etherscan/pages/etherscan/page.tsx | 4 +- .../pages/lit-protocol/layout.tsx | 12 +- .../livepeer/core/livepeer/README.md | 103 ++ .../core/livepeer/assets/default_poster.png | Bin 0 -> 7345 bytes .../core/livepeer/components/button-share.tsx | 43 + .../livepeer/components/create-stream.tsx | 195 +++ .../components/dialog-stop-stream.tsx | 25 + .../components/form-livepeer-api-key.tsx | 96 ++ .../components/form-livepeer-asset.tsx | 35 + .../components/form-livepeer-stream.tsx | 35 + .../core/livepeer/components/player.tsx | 63 + .../core/livepeer/components/spinner.tsx | 22 + .../core/livepeer/components/upload-file.tsx | 121 ++ .../hooks/use-check-livepeer-api-key.ts | 57 + .../livepeer/hooks/use-livepeer-api-key.ts | 19 + .../livepeer/core/livepeer/livepeer-client.ts | 9 + .../core/livepeer/livepeer-provider.tsx | 33 + .../livepeer/pages/livepeer/layout.tsx | 69 + .../livepeer/livestream/[streamId]/page.tsx | 59 + .../livepeer/livestream/new/browser/page.tsx | 5 + .../livepeer/livestream/new/obs/page.tsx | 5 + .../pages/livepeer/livestream/new/page.tsx | 4 + .../pages/livepeer/livestream/page.tsx | 34 + .../pages/livepeer/livestream/watch/page.tsx | 5 + .../pages/livepeer/opengraph-image.tsx | 9 + .../livepeer/pages/livepeer/page.tsx | 5 + .../livepeer/pages/livepeer/twitter-image.tsx | 9 + .../pages/livepeer/vod/[assetId]/page.tsx | 60 + .../livepeer/pages/livepeer/vod/new/page.tsx | 5 + .../livepeer/pages/livepeer/vod/page.tsx | 27 + .../pages/livepeer/vod/watch/page.tsx | 5 + .../integrations/openai/pages/openai/page.tsx | 4 +- .../pages/pooltogether-v4/layout.tsx | 12 +- .../session-keys/pages/session-keys/page.tsx | 4 +- .../starter/pages/starter/layout.tsx | 4 +- 61 files changed, 2309 insertions(+), 490 deletions(-) create mode 100644 template/base/public/integrations/livepeer.svg create mode 100644 template/integrations/livepeer/core/livepeer/README.md create mode 100644 template/integrations/livepeer/core/livepeer/assets/default_poster.png create mode 100644 template/integrations/livepeer/core/livepeer/components/button-share.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/create-stream.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/dialog-stop-stream.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/form-livepeer-api-key.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/form-livepeer-asset.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/form-livepeer-stream.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/player.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/spinner.tsx create mode 100644 template/integrations/livepeer/core/livepeer/components/upload-file.tsx create mode 100644 template/integrations/livepeer/core/livepeer/hooks/use-check-livepeer-api-key.ts create mode 100644 template/integrations/livepeer/core/livepeer/hooks/use-livepeer-api-key.ts create mode 100644 template/integrations/livepeer/core/livepeer/livepeer-client.ts create mode 100644 template/integrations/livepeer/core/livepeer/livepeer-provider.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/layout.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/livestream/[streamId]/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/livestream/new/browser/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/livestream/new/obs/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/livestream/new/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/livestream/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/livestream/watch/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/opengraph-image.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/twitter-image.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/vod/[assetId]/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/vod/new/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/vod/page.tsx create mode 100644 template/integrations/livepeer/pages/livepeer/vod/watch/page.tsx diff --git a/package.json b/package.json index 7b331d7..5eae2fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "create-turbo-eth", - "version": "0.1.3", + "version": "0.2.0", "description": "Create web3 apps in turbo mode.", "author": "Vitor @marthendalnunes", "license": "MIT", diff --git a/src/config/env-variables.ts b/src/config/env-variables.ts index 4b0ec4a..44cb084 100644 --- a/src/config/env-variables.ts +++ b/src/config/env-variables.ts @@ -44,7 +44,7 @@ export const envVariables: EnvVariables = { return 'Please enter a valid list of admin addresses' }, }, - SITE_URL: { + NEXT_PUBLIC_SITE_URL: { message: 'What is going to be the URL of your website?', required: false, validate: (input: string) => { diff --git a/src/config/integrations.ts b/src/config/integrations.ts index 80443e4..fe1b75b 100644 --- a/src/config/integrations.ts +++ b/src/config/integrations.ts @@ -201,6 +201,34 @@ export const integrationOptions: Integrations = { }, ], }, + livepeer: { + name: 'Livepeer', + pageDependencies: [ + { + dependencyPath: dataConfigPath, + type: 'snippet', + regexList: [/\n\s*livepeer: \{\s*name: 'Livepeer',[\s\S]*?imgDark: '\/integrations\/livepeer.svg',\s*\},/g], + }, + { + dependencyPath: indexPagePath, + type: 'snippet', + regexList: [/\n\s*{\s*title: turboIntegrations\.livepeer\.name,[\s\S]*?<\/IsDarkTheme>\s*<\/div>\s*\),\s*},/g], + }, + ], + env: { + NEXT_PUBLIC_LIVEPEER_API_KEY: { + message: 'What is your Livepeer API Key?', + instructions: 'You can get your OpenAI API Key at https://livepeer.studio/', + validate: (input: string) => { + if (z.string().min(1).safeParse(input).success) { + return true + } + + return 'Livepeer API Key is required' + }, + }, + }, + }, starter: { name: 'Starter', pageDependencies: [ diff --git a/src/types.ts b/src/types.ts index 73e89a6..03dd51e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -70,6 +70,7 @@ export type AvailableIntegrations = | 'pooltogether-v4' | 'session-keys' | 'connext' + | 'livepeer' | 'starter' export type Integrations = Record diff --git a/template/base/.env.example b/template/base/.env.example index 67f580c..7ef9041 100644 --- a/template/base/.env.example +++ b/template/base/.env.example @@ -13,6 +13,12 @@ NEXT_PUBLIC_INFURA_API_KEY= # Enables the use of production networks in the development environment NEXT_PUBLIC_PROD_NETWORKS_DEV=false +# Livepeer: https://livepeer.com +NEXT_PUBLIC_LIVEPEER_API_KEY= + +# Website URL +NEXT_PUBLIC_SITE_URL= + # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # Private Variables # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- @@ -26,9 +32,6 @@ DATABASE_URL= # Example: "0x123,0x456" APP_ADMINS="" -# Website URL -SITE_URL= - # Disco: https://docs.disco.xyz # Request API access at https://discoxyz.typeform.com/requestapi DISCO_API_KEY= diff --git a/template/base/app/(general)/integration/sign-in-with-ethereum/page.tsx b/template/base/app/(general)/integration/sign-in-with-ethereum/page.tsx index 6578bf4..4659a43 100644 --- a/template/base/app/(general)/integration/sign-in-with-ethereum/page.tsx +++ b/template/base/app/(general)/integration/sign-in-with-ethereum/page.tsx @@ -48,8 +48,8 @@ export default function PageIntegration() { {turboIntegrations.siwe.description} - - + + Documentation diff --git a/template/base/app/(general)/layout.tsx b/template/base/app/(general)/layout.tsx index 4a038fc..48f881d 100644 --- a/template/base/app/(general)/layout.tsx +++ b/template/base/app/(general)/layout.tsx @@ -9,7 +9,7 @@ import { Toaster } from '@/components/ui/toaster' export default function GeneralLayout({ children }: { children: ReactNode }) { return ( <> -
+
{children}
diff --git a/template/base/app/(general)/page.tsx b/template/base/app/(general)/page.tsx index 40cbf3b..8cf8ac7 100644 --- a/template/base/app/(general)/page.tsx +++ b/template/base/app/(general)/page.tsx @@ -1,8 +1,11 @@ 'use client' +import { useState } from 'react' + import { motion } from 'framer-motion' import Image from 'next/image' -import { FaGithub } from 'react-icons/fa' +import CopyToClipboard from 'react-copy-to-clipboard' +import { FaCheck, FaCopy, FaDiscord, FaGithub } from 'react-icons/fa' import Balancer from 'react-wrap-balancer' import { WalletAddress } from '@/components/blockchain/wallet-address' @@ -24,6 +27,8 @@ import { IsSignedIn } from '@/integrations/siwe/components/is-signed-in' import { IsSignedOut } from '@/integrations/siwe/components/is-signed-out' export default function Home() { + const [copied, setCopied] = useState(false) + return ( <>
@@ -51,29 +56,31 @@ export default function Home() { {siteConfig.description} - - - - - -

Deploy to Vercel

-
- + + href={siteConfig.links.github}>

Star on GitHub

-
+ + + +

Join us on Discord

+
- ⚡️TurboETH is in active development. + setCopied(true)}> + +
pnpm create turbo-eth@latest
+ + {copied ? : } + +
+
-
), }, + { + title: turboIntegrations.livepeer.name, + description: turboIntegrations.livepeer.description, + href: turboIntegrations.livepeer.href, + demo: ( +
+ + Livepeer logo + + + Livepeer logo + +
+ ), + }, { title: turboIntegrations.connext.name, description: turboIntegrations.connext.description, diff --git a/template/base/app/admin/layout.tsx b/template/base/app/admin/layout.tsx index 6ee1b26..b25b53d 100644 --- a/template/base/app/admin/layout.tsx +++ b/template/base/app/admin/layout.tsx @@ -16,7 +16,7 @@ import { siteConfig } from '@/config/site' export default function AdminLayout({ children }: { children: ReactNode }) { return ( -
+
diff --git a/template/base/app/dashboard/layout.tsx b/template/base/app/dashboard/layout.tsx index 1728ebb..c6b9423 100644 --- a/template/base/app/dashboard/layout.tsx +++ b/template/base/app/dashboard/layout.tsx @@ -18,7 +18,7 @@ import { siteConfig } from '@/config/site' export default function DashboardLayout({ children }: { children: ReactNode }) { return ( <> -
+
diff --git a/template/base/app/layout.tsx b/template/base/app/layout.tsx index 71d1b72..7e1509a 100644 --- a/template/base/app/layout.tsx +++ b/template/base/app/layout.tsx @@ -12,7 +12,7 @@ import { siteConfig } from '@/config/site' import { env } from '@/env.mjs' import { cn } from '@/lib/utils' -const url = env.SITE_URL || 'http://localhost:3000' +const url = env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000' export const metadata = { metadataBase: new URL(url), diff --git a/template/base/components/layout/header.tsx b/template/base/components/layout/header.tsx index 980a960..61a9eae 100644 --- a/template/base/components/layout/header.tsx +++ b/template/base/components/layout/header.tsx @@ -61,10 +61,8 @@ export function Header({ className, ...props }: HTMLAttributes) {
- - + + Dashboard
diff --git a/template/base/components/layout/navigation-menu-general.tsx b/template/base/components/layout/navigation-menu-general.tsx index 2f7ebd7..2ba5f24 100644 --- a/template/base/components/layout/navigation-menu-general.tsx +++ b/template/base/components/layout/navigation-menu-general.tsx @@ -67,7 +67,7 @@ export function NavigationMenuGeneral() { Integrations - +
    {Object.values(turboIntegrations).map((component) => ( diff --git a/template/base/components/shared/card.tsx b/template/base/components/shared/card.tsx index 764f3e9..3dbed0a 100644 --- a/template/base/components/shared/card.tsx +++ b/template/base/components/shared/card.tsx @@ -52,8 +52,8 @@ export default function Card({
{!href ? null : ( - - + + Demo )}
diff --git a/template/base/components/ui/social/og-image-integrations.tsx b/template/base/components/ui/social/og-image-integrations.tsx index c083083..86ea349 100644 --- a/template/base/components/ui/social/og-image-integrations.tsx +++ b/template/base/components/ui/social/og-image-integrations.tsx @@ -12,7 +12,7 @@ export const size = { export const contentType = 'image/png' -const url = env.SITE_URL || 'http://localhost:3000' +const url = env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000' export function IntegrationOgImage(integration: keyof typeof turboIntegrations) { const integrationData = turboIntegrations[integration] diff --git a/template/base/config/site.ts b/template/base/config/site.ts index 7ed03f8..4605d06 100644 --- a/template/base/config/site.ts +++ b/template/base/config/site.ts @@ -9,6 +9,8 @@ interface SiteConfig { previewImg: string localeDefault: string links: { + docs: string + discord: string twitter: string github: string } @@ -24,6 +26,8 @@ export const siteConfig: SiteConfig = { previewImg: `${SITE_CANONICAL}/preview.png`, localeDefault: 'en', links: { + docs: 'https://docs.turboeth.xyz/overview', + discord: 'https://discord.gg/U4jy7Xfh76', twitter: 'https://twitter.com/district_labs', github: 'https://github.com/turbo-eth', }, diff --git a/template/base/data/turbo-integrations.ts b/template/base/data/turbo-integrations.ts index 2868763..4600bda 100644 --- a/template/base/data/turbo-integrations.ts +++ b/template/base/data/turbo-integrations.ts @@ -72,6 +72,14 @@ export const turboIntegrations = { imgLight: '/integrations/pooltogether.svg', imgDark: '/integrations/pooltogether.svg', }, + livepeer: { + name: 'Livepeer', + href: '/integration/livepeer', + url: 'https://livepeer.org/', + description: 'Livepeer is a decentralized video streaming network.', + imgLight: '/integrations/livepeer.svg', + imgDark: '/integrations/livepeer.svg', + }, connext: { name: 'Connext', href: '/integration/connext', diff --git a/template/base/env.mjs b/template/base/env.mjs index 2238d9f..9bd6241 100644 --- a/template/base/env.mjs +++ b/template/base/env.mjs @@ -11,7 +11,6 @@ export const env = createEnv({ .string() .regex(/^(0x[a-fA-F0-9]{40}( *, *0x[a-fA-F0-9]{40})* *)*$/) .optional(), - SITE_URL: z.string().url().optional(), DISCO_API_KEY: z.string().min(1).optional(), OPENAI_API_KEY: z.string().min(1).optional(), ETHERSCAN_API_KEY: z.string().min(1).optional(), @@ -24,12 +23,13 @@ export const env = createEnv({ NEXT_PUBLIC_PROD_NETWORKS_DEV: z.enum(['true', 'false']).default('false'), NEXT_PUBLIC_ALCHEMY_API_KEY: z.string().min(1).optional(), NEXT_PUBLIC_INFURA_API_KEY: z.string().min(1).optional(), + NEXT_PUBLIC_LIVEPEER_API_KEY: z.string().min(1).optional(), + NEXT_PUBLIC_SITE_URL: z.string().url().optional(), }, runtimeEnv: { NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, DATABASE_URL: process.env.DATABASE_URL, APP_ADMINS: process.env.APP_ADMINS, - SITE_URL: process.env.SITE_URL, DISCO_API_KEY: process.env.DISCO_API_KEY, OPENAI_API_KEY: process.env.OPENAI_API_KEY, NEXT_PUBLIC_PROD_NETWORKS_DEV: process.env.NEXT_PUBLIC_PROD_NETWORKS_DEV, @@ -40,5 +40,7 @@ export const env = createEnv({ NEXT_PUBLIC_USE_PUBLIC_PROVIDER: process.env.NEXT_PUBLIC_USE_PUBLIC_PROVIDER, NEXT_PUBLIC_ALCHEMY_API_KEY: process.env.NEXT_PUBLIC_ALCHEMY_API_KEY, NEXT_PUBLIC_INFURA_API_KEY: process.env.NEXT_PUBLIC_INFURA_API_KEY, + NEXT_PUBLIC_LIVEPEER_API_KEY: process.env.NEXT_PUBLIC_LIVEPEER_API_KEY, + NEXT_PUBLIC_SITE_URL: process.env.NEXT_PUBLIC_SITE_URL, }, }) diff --git a/template/base/lib/utils/index.ts b/template/base/lib/utils/index.ts index b183d1c..e88a5d6 100644 --- a/template/base/lib/utils/index.ts +++ b/template/base/lib/utils/index.ts @@ -17,7 +17,7 @@ export function formatDate(input: string | number): string { } export function absoluteUrl(path: string) { - return `${env.SITE_URL || 'http://localhost:3000'}${path}` + return `${env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000'}${path}` } export function trimFormattedBalance(balance: string | undefined, decimals = 4) { diff --git a/template/base/package.json b/template/base/package.json index 6bae55e..28eb52b 100644 --- a/template/base/package.json +++ b/template/base/package.json @@ -40,6 +40,7 @@ "@connext/nxtp-utils": "^2.0.3", "@connext/sdk": "2.0.4-alpha.2", "@lit-protocol/lit-node-client": "2.1.161", + "@livepeer/react": "^2.6.0", "@prisma/client": "^4.8.1", "@radix-ui/react-accordion": "^1.1.0", "@radix-ui/react-alert-dialog": "^1.0.2", @@ -77,6 +78,7 @@ "clsx": "^1.2.1", "dexie": "^3.2.3", "dexie-react-hooks": "^1.1.3", + "ethers": "^5.6.9", "eventsource-parser": "^1.0.0", "framer-motion": "^8.4.3", "iron-session": "^6.3.1", @@ -88,6 +90,7 @@ "react": "^18.2.0", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", "react-hook-form": "^7.43.9", "react-icons": "^4.9.0", "react-markdown": "^8.0.4", diff --git a/template/base/pnpm-lock.yaml b/template/base/pnpm-lock.yaml index 5cf858f..052b58a 100644 --- a/template/base/pnpm-lock.yaml +++ b/template/base/pnpm-lock.yaml @@ -3,13 +3,16 @@ lockfileVersion: '6.0' dependencies: '@connext/nxtp-utils': specifier: ^2.0.3 - version: 2.0.3(sinon@15.2.0) + version: 2.0.4(sinon@15.2.0) '@connext/sdk': specifier: 2.0.4-alpha.2 version: 2.0.4-alpha.2(sinon@15.2.0)(ts-node@10.9.1)(typescript@4.9.4) '@lit-protocol/lit-node-client': specifier: 2.1.161 version: 2.1.161(@ethersproject/contracts@5.7.0)(@ethersproject/hash@5.7.0)(@ethersproject/providers@5.7.2)(@ethersproject/wallet@5.7.0)(react@18.2.0) + '@livepeer/react': + specifier: ^2.6.0 + version: 2.6.0(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) '@prisma/client': specifier: ^4.8.1 version: 4.11.0(prisma@4.11.0) @@ -121,6 +124,9 @@ dependencies: dexie-react-hooks: specifier: ^1.1.3 version: 1.1.3(@types/react@18.0.26)(dexie@3.2.3)(react@18.2.0) + ethers: + specifier: ^5.6.9 + version: 5.7.2 eventsource-parser: specifier: ^1.0.0 version: 1.0.0 @@ -154,6 +160,9 @@ dependencies: react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) + react-dropzone: + specifier: ^14.2.3 + version: 14.2.3(react@18.2.0) react-hook-form: specifier: ^7.43.9 version: 7.43.9(react@18.2.0) @@ -174,7 +183,7 @@ dependencies: version: 0.3.0(react@18.2.0) siwe: specifier: 1.1.6 - version: 1.1.6(ethers@5.5.1) + version: 1.1.6(ethers@5.7.2) tailwind-merge: specifier: ^1.8.1 version: 1.10.0 @@ -254,7 +263,7 @@ devDependencies: version: 8.7.0(eslint@8.30.0) eslint-plugin-import: specifier: ^2.26.0 - version: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.30.0) + version: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint@8.30.0) eslint-plugin-jest: specifier: ^26.4.6 version: 26.9.0(@typescript-eslint/eslint-plugin@5.59.11)(eslint@8.30.0)(typescript@4.9.4) @@ -358,7 +367,7 @@ packages: '@babel/traverse': 7.21.2 '@babel/types': 7.21.2 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -380,7 +389,7 @@ packages: '@babel/traverse': 7.21.2 '@babel/types': 7.21.2 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.0 @@ -487,7 +496,7 @@ packages: '@babel/core': 7.21.0 '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.2 semver: 6.3.0 @@ -1633,7 +1642,7 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.2 '@babel/types': 7.21.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -1650,7 +1659,7 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.8 '@babel/types': 7.21.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -1983,6 +1992,34 @@ packages: - utf-8-validate dev: false + /@connext/nxtp-utils@2.0.4(sinon@15.2.0): + resolution: {integrity: sha512-aZmpxRBMhRr06TiKwJAZgnpsKZJDF3Tyx/8R9z+yMqlhkVW5Q1VGHPqSkPXz2/w3XCmeu5p08Vignd+FKiLr+A==} + dependencies: + '@maticnetwork/maticjs': 3.6.0-beta.11 + '@maticnetwork/maticjs-web3': 1.0.4(@maticnetwork/maticjs@3.6.0-beta.11) + '@sinclair/typebox': 0.25.21 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + axios: 1.3.3 + chai: 4.3.7 + chai-as-promised: 7.1.1(chai@4.3.7) + chai-subset: 1.6.0 + ethers: 5.7.2 + hyperid: 3.1.1 + interval-promise: 1.4.0 + merkletreejs: 0.3.9 + pino: 8.10.0 + secp256k1: 4.0.3 + sinon-chai: 3.7.0(chai@4.3.7)(sinon@15.2.0) + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - sinon + - supports-color + - utf-8-validate + dev: false + /@connext/sdk@2.0.4-alpha.2(sinon@15.2.0)(ts-node@10.9.1)(typescript@4.9.4): resolution: {integrity: sha512-FP8IBRVIAnhRouY+O+inTcIhsk18rWAexW2eLMMztgO3iJ7c7Oi7Nng+Nfbp+l8ls9+3tyX2DrEw2LHKGIE3jQ==} dependencies: @@ -2194,7 +2231,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 espree: 9.5.0 globals: 13.20.0 ignore: 5.2.4 @@ -2213,7 +2250,7 @@ packages: '@openzeppelin/contracts': 4.7.3 '@openzeppelin/contracts-upgradeable': 4.7.3 ethers: 5.7.2 - hardhat: 2.16.1(ts-node@10.9.1)(typescript@4.9.4) + hardhat: 2.17.0(ts-node@10.9.1)(typescript@4.9.4) transitivePeerDependencies: - bufferutil - supports-color @@ -2306,7 +2343,7 @@ packages: /@ethereumjs/tx@3.3.2: resolution: {integrity: sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==} dependencies: - '@ethereumjs/common': 2.6.5 + '@ethereumjs/common': 2.5.0 ethereumjs-util: 7.1.5 dev: false @@ -2317,20 +2354,6 @@ packages: ethereumjs-util: 7.1.5 dev: false - /@ethersproject/abi@5.5.0: - resolution: {integrity: sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: false - /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} dependencies: @@ -2344,18 +2367,6 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/abstract-provider@5.5.1: - resolution: {integrity: sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - dev: false - /@ethersproject/abstract-provider@5.7.0: resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} dependencies: @@ -2367,16 +2378,6 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - /@ethersproject/abstract-signer@5.5.0: - resolution: {integrity: sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==} - 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 - dev: false - /@ethersproject/abstract-signer@5.7.0: resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} dependencies: @@ -2386,16 +2387,6 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 - /@ethersproject/address@5.5.0: - resolution: {integrity: sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==} - 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 - dev: false - /@ethersproject/address@5.7.0: resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} dependencies: @@ -2405,38 +2396,17 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 - /@ethersproject/base64@5.5.0: - resolution: {integrity: sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==} - dependencies: - '@ethersproject/bytes': 5.7.0 - dev: false - /@ethersproject/base64@5.7.0: resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} dependencies: '@ethersproject/bytes': 5.7.0 - /@ethersproject/basex@5.5.0: - resolution: {integrity: sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 - dev: false - /@ethersproject/basex@5.7.0: resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 - /@ethersproject/bignumber@5.5.0: - resolution: {integrity: sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 4.12.0 - dev: false - /@ethersproject/bignumber@5.7.0: resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} dependencies: @@ -2444,43 +2414,16 @@ packages: '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 - /@ethersproject/bytes@5.5.0: - resolution: {integrity: sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/bytes@5.7.0: resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/constants@5.5.0: - resolution: {integrity: sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - dev: false - /@ethersproject/constants@5.7.0: resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: '@ethersproject/bignumber': 5.7.0 - /@ethersproject/contracts@5.5.0: - resolution: {integrity: sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - dev: false - /@ethersproject/contracts@5.7.0: resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} dependencies: @@ -2495,19 +2438,6 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 - /@ethersproject/hash@5.5.0: - resolution: {integrity: sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 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 - dev: false - /@ethersproject/hash@5.7.0: resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} dependencies: @@ -2521,23 +2451,6 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/hdnode@5.5.0: - resolution: {integrity: sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - dev: false - /@ethersproject/hdnode@5.7.0: resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} dependencies: @@ -2554,24 +2467,6 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - /@ethersproject/json-wallets@5.5.0: - resolution: {integrity: sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - dev: false - /@ethersproject/json-wallets@5.7.0: resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} dependencies: @@ -2589,88 +2484,31 @@ packages: aes-js: 3.0.0 scrypt-js: 3.0.1 - /@ethersproject/keccak256@5.5.0: - resolution: {integrity: sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - dev: false - /@ethersproject/keccak256@5.7.0: resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 - /@ethersproject/logger@5.5.0: - resolution: {integrity: sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==} - dev: false - /@ethersproject/logger@5.7.0: resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - /@ethersproject/networks@5.5.0: - resolution: {integrity: sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/networks@5.7.1: resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/pbkdf2@5.5.0: - resolution: {integrity: sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 - dev: false - /@ethersproject/pbkdf2@5.7.0: resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 - /@ethersproject/properties@5.5.0: - resolution: {integrity: sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==} - dependencies: - '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/properties@5.7.0: resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/providers@5.5.0: - resolution: {integrity: sha512-xqMbDnS/FPy+J/9mBLKddzyLLAQFjrVff5g00efqxPzcAwXiR+SiCGVy6eJ5iAIirBOATjx7QLhDNPGV+AEQsw==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - /@ethersproject/providers@5.7.2: resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: @@ -2698,40 +2536,18 @@ packages: - bufferutil - utf-8-validate - /@ethersproject/random@5.5.0: - resolution: {integrity: sha512-egGYZwZ/YIFKMHcoBUo8t3a8Hb/TKYX8BCBoLjudVCZh892welR3jOxgOmb48xznc9bTcMm7Tpwc1gHC1PFNFQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/random@5.7.0: resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/rlp@5.5.0: - resolution: {integrity: sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/rlp@5.7.0: resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/sha2@5.5.0: - resolution: {integrity: sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 - dev: false - /@ethersproject/sha2@5.7.0: resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} dependencies: @@ -2739,17 +2555,6 @@ packages: '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 - /@ethersproject/signing-key@5.5.0: - resolution: {integrity: sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 4.12.0 - elliptic: 6.5.4 - hash.js: 1.1.7 - dev: false - /@ethersproject/signing-key@5.7.0: resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} dependencies: @@ -2760,17 +2565,6 @@ packages: elliptic: 6.5.4 hash.js: 1.1.7 - /@ethersproject/solidity@5.5.0: - resolution: {integrity: sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: false - /@ethersproject/solidity@5.7.0: resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} dependencies: @@ -2781,14 +2575,6 @@ packages: '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/strings@5.5.0: - resolution: {integrity: sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/strings@5.7.0: resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} dependencies: @@ -2796,20 +2582,6 @@ packages: '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/transactions@5.5.0: - resolution: {integrity: sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==} - 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 - dev: false - /@ethersproject/transactions@5.7.0: resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} dependencies: @@ -2823,14 +2595,6 @@ packages: '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 - /@ethersproject/units@5.5.0: - resolution: {integrity: sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: false - /@ethersproject/units@5.7.0: resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} dependencies: @@ -2838,8 +2602,8 @@ packages: '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/wallet@5.5.0: - resolution: {integrity: sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q==} + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -2856,36 +2620,6 @@ packages: '@ethersproject/signing-key': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - dev: false - - /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - /@ethersproject/web@5.5.0: - resolution: {integrity: sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA==} - 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 - dev: false /@ethersproject/web@5.7.1: resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} @@ -2896,16 +2630,6 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/wordlists@5.5.0: - resolution: {integrity: sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: false - /@ethersproject/wordlists@5.7.0: resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} dependencies: @@ -2919,12 +2643,22 @@ packages: resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} dev: false + /@floating-ui/core@1.3.1: + resolution: {integrity: sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==} + dev: false + /@floating-ui/dom@0.5.4: resolution: {integrity: sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==} dependencies: '@floating-ui/core': 0.7.3 dev: false + /@floating-ui/dom@1.4.4: + resolution: {integrity: sha512-21hhDEPOiWkGp0Ys4Wi6Neriah7HweToKra626CIK712B5m9qkdz54OP9gVldUg+URnBTpv/j/bi/skmGdstXQ==} + dependencies: + '@floating-ui/core': 1.3.1 + dev: false + /@floating-ui/react-dom@0.7.2(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==} peerDependencies: @@ -2939,12 +2673,23 @@ packages: - '@types/react' dev: false + /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.4.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3311,6 +3056,72 @@ packages: dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 + /@livepeer/core-react@1.6.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6lsrWJ/iJSF9bL3y8O+gkvRJ17tT6g9z3l1/E7pf30tIlELjwFb4KklK/k3SFtuYYskkx8v5DvU2LaOd2yhQYA==} + peerDependencies: + react: '>=17.0.0' + dependencies: + '@livepeer/core': 1.6.0(react@18.2.0) + '@tanstack/query-async-storage-persister': 4.22.4(@tanstack/query-core@4.22.4) + '@tanstack/query-core': 4.22.4 + '@tanstack/react-query': 4.22.4(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-persist-client': 4.22.4(@tanstack/query-core@4.22.4)(@tanstack/react-query@4.22.4) + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + zustand: 4.3.8(react@18.2.0) + transitivePeerDependencies: + - encoding + - immer + - react-dom + - react-native + dev: false + + /@livepeer/core@1.6.0(react@18.2.0): + resolution: {integrity: sha512-MhyrtsXFrndnWn16GViavVG9UNjGroavw1FttgfstQ1IPWxrP2HEEvX52zATXF0JX/xfH5MCsfLNcVC9MF399g==} + peerDependencies: + react: '>=17.0.0' + peerDependenciesMeta: + react: + optional: true + dependencies: + cross-fetch: 3.1.5 + ms: 3.0.0-canary.1 + multiformats: 9.9.0 + react: 18.2.0 + tus-js-client: 3.1.0 + zustand: 4.3.8(react@18.2.0) + transitivePeerDependencies: + - encoding + - immer + dev: false + + /@livepeer/react@2.6.0(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CH5hpONn4eiL6Qqf3neVzduvMbEkYa9DP1wliEGTpq/rAb8kfdrKGVOeEKkx7GoIIdHNPf0GIwFIggiqu/l8yw==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + peerDependenciesMeta: + react-dom: + optional: true + dependencies: + '@livepeer/core-react': 1.6.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.4(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popover': 1.0.6(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': 1.2.2(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@stitches/react': 1.2.8(react@18.2.0) + core-js: 3.31.0 + livepeer: 2.6.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.3.8(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - encoding + - immer + - react-native + dev: false + /@maticnetwork/maticjs-web3@1.0.4(@maticnetwork/maticjs@3.6.0-beta.11): resolution: {integrity: sha512-cMnp42jjGNfVZRL80yUYfD9abcyUC2VpKvjFQtU44A3A0M9sbCtOOMMkE4k8FWoccxIPi891rtc+nowdNahKxg==} peerDependencies: @@ -3382,7 +3193,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@types/debug': 4.1.7 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 semver: 7.5.0 superstruct: 1.0.3 transitivePeerDependencies: @@ -3629,7 +3440,7 @@ packages: '@nomicfoundation/ethereumjs-tx': 5.0.1 '@nomicfoundation/ethereumjs-util': 9.0.1 abstract-level: 1.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 ethereum-cryptography: 0.1.3 level: 8.0.0 lru-cache: 5.1.1 @@ -3670,7 +3481,7 @@ packages: '@nomicfoundation/ethereumjs-common': 4.0.1 '@nomicfoundation/ethereumjs-tx': 5.0.1 '@nomicfoundation/ethereumjs-util': 9.0.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 rustbn.js: 0.2.0 @@ -3691,7 +3502,7 @@ packages: dependencies: '@nomicfoundation/ethereumjs-common': 4.0.1 '@nomicfoundation/ethereumjs-rlp': 5.0.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 ethereum-cryptography: 0.1.3 ethers: 5.7.2 js-sdsl: 4.3.0 @@ -3749,7 +3560,7 @@ packages: '@nomicfoundation/ethereumjs-trie': 6.0.1 '@nomicfoundation/ethereumjs-tx': 5.0.1 '@nomicfoundation/ethereumjs-util': 9.0.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 rustbn.js: 0.2.0 @@ -3985,12 +3796,24 @@ packages: '@babel/runtime': 7.21.5 dev: false + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + dependencies: + '@babel/runtime': 7.21.5 + dev: false + /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: '@babel/runtime': 7.21.5 dev: false + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.21.5 + dev: false + /@radix-ui/react-accordion@1.1.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-TQtyyRubYe8DD6DYCovNLTjd2D+TFrNCpr99T5M3cYUbR7BsRxWsxfInjbQ1nHsdy2uPTcnJS5npyXPVfP0piw==} peerDependencies: @@ -4042,6 +3865,27 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-aspect-ratio@1.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-YCujQYnwcVcakbdhE8eTjhh4QR8CsngEcRlSzIPWw1vp3KPC9orETo8CxuVM65j5HAp0oFoOlIy6v7SuF+9P+Q==} peerDependencies: @@ -4122,6 +3966,30 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -4131,6 +3999,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-context-menu@2.1.3(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-T+Jpbl/L9eJmlNGdgrl39NUqYTrtHJz4FmjdSc2WDUiZXWMmokK+1K8t/xEcx9q2PvVYfL5UDy9dkzU9UouyGw==} peerDependencies: @@ -4159,6 +4041,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-context@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-dialog@1.0.3(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-owNhq36kNPqC2/a+zJRioPg6HHnTn5B/sh/NjTY8r4W9g1L5VJlrzZIVcBr7R9Mg8iLjVmh6MGgMlfoVf/WO/A==} peerDependencies: @@ -4186,6 +4082,40 @@ packages: - '@types/react' dev: false + /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.0.26)(react@18.2.0) + dev: false + /@radix-ui/react-direction@1.0.0(react@18.2.0): resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==} peerDependencies: @@ -4195,6 +4125,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-direction@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-dismissable-layer@1.0.3(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-nXZOvFjOuHS1ovumntGV7NNoLaEp9JEvTht3MBjP44NSW5hUKj/8OnfN3+8WmB+CEhN44XaGhpHoSsUIEl5P7Q==} peerDependencies: @@ -4211,6 +4155,31 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-dropdown-menu@2.0.4(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-y6AT9+MydyXcByivdK1+QpjWoKaC7MLjkS/cH1Q3keEyMvDkiY85m8o2Bi6+Z1PPUlCsMULopxagQOSfN0wahg==} peerDependencies: @@ -4240,6 +4209,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-focus-scope@1.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-spwXlNTfeIprt+kaEWE/qYuYT3ZAqJiAGjN/JgdvgVDTu8yc+HuX+WOWXrKliKnLnwck0F6JDkqIERncnih+4A==} peerDependencies: @@ -4254,6 +4237,29 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-form@0.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+WQU4Gs4MqjYsHwh5d19Ka4CMcWeXd7WPuWYCYGtNbDRMHFG2TtgM9PlEK4Yrk7wG1f5/da6Bgtteky2ggDXUg==} peerDependencies: @@ -4303,6 +4309,21 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-id@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-label@2.0.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-qcfbS3B8hTYmEO44RNcXB6pegkxRsJIbdxTMu0PEX0Luv5O2DvTIwwVYxQfUwLpM88EL84QRPLOLgwUSApMsLQ==} peerDependencies: @@ -4422,6 +4443,41 @@ packages: - '@types/react' dev: false + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.0.26)(react@18.2.0) + dev: false + /@radix-ui/react-popper@1.1.1(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-keYDcdMPNMjSC8zTsZ8wezUMiWM9Yj14wtF3s0PTIs9srnEPC9Kt2Gny1T3T81mmSeyDjZxsD9N5WCwNNb712w==} peerDependencies: @@ -4445,6 +4501,36 @@ packages: - '@types/react' dev: false + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-portal@1.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-swu32idoCW7KA2VEiUZGBSu9nB6qwGdV6k6HYhUoOo3M1FFpD+VgLzUqtt3mwL1ssz7r2x8MggpLSQach2Xy/Q==} peerDependencies: @@ -4457,6 +4543,27 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} peerDependencies: @@ -4470,6 +4577,28 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-primitive@1.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw==} peerDependencies: @@ -4482,6 +4611,27 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-slot': 1.0.2(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-progress@1.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-c16RVM43ct2koRcMmPw4b47JWFNs89qe5p4Um9dwoPs0yi+d7It1MJ35EpsX+93o31Mqdwe4vQyu0SrHrygdCg==} peerDependencies: @@ -4590,6 +4740,47 @@ packages: - '@types/react' dev: false + /@radix-ui/react-select@1.2.2(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.0.26)(react@18.2.0) + dev: false + /@radix-ui/react-separator@1.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lZoAG/rS2jzb/OSvyBrpN3dmikw20ewmWx1GkM1VldbDyD0DACCbH9LIXSrqyS/2mE1VYKOHmyq5W90Dx4ryqA==} peerDependencies: @@ -4634,6 +4825,21 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-slot@1.0.2(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-switch@1.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BcG/LKehxt36NXG0wPnoCitIfSMtU9Xo7BmythYA1PAMLtsMvW7kALfBzmduQoHTWcKr0AVcFyh0gChBUp9TiQ==} peerDependencies: @@ -4728,6 +4934,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: @@ -4738,6 +4958,21 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-use-escape-keydown@1.0.2(react@18.2.0): resolution: {integrity: sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==} peerDependencies: @@ -4748,6 +4983,21 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} peerDependencies: @@ -4757,6 +5007,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + /@radix-ui/react-use-previous@1.0.0(react@18.2.0): resolution: {integrity: sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==} peerDependencies: @@ -4766,34 +5030,99 @@ packages: react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.0(react@18.2.0): - resolution: {integrity: sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==} + /@radix-ui/react-use-previous@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.0(react@18.2.0): + resolution: {integrity: sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/rect': 1.0.0 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.0.26 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.0(react@18.2.0): + resolution: {integrity: sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.5 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.0.26)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: + '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.21.5 - '@radix-ui/rect': 1.0.0 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.0.26)(react@18.2.0) + '@types/react': 18.0.26 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.0(react@18.2.0): - resolution: {integrity: sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==} + /@radix-ui/react-visually-hidden@1.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qirnJxtYn73HEk1rXL12/mXnu2rwsNHDID10th2JGtdK25T9wX+mxRmGt7iPSahw512GbZOc0syZX1nLQGoEOg==} peerDependencies: react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: '@babel/runtime': 7.21.5 - '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-visually-hidden@1.0.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qirnJxtYn73HEk1rXL12/mXnu2rwsNHDID10th2JGtdK25T9wX+mxRmGt7iPSahw512GbZOc0syZX1nLQGoEOg==} + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: '@babel/runtime': 7.21.5 - '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.10)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -4804,6 +5133,12 @@ packages: '@babel/runtime': 7.21.5 dev: false + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.21.5 + dev: false + /@rainbow-me/rainbowkit@1.0.1(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0)(viem@1.0.0)(wagmi@1.1.0): resolution: {integrity: sha512-P+2lgHaN5X84K1e+MARUydyhYRS+nStN4H470QloBBWP5UsidHZpSJGd4qi0WFtfR6zBff96N6kmsfJo7PjFhQ==} engines: {node: '>=12.4'} @@ -5143,6 +5478,18 @@ packages: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 + /@stitches/core@1.2.8: + resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + dev: false + + /@stitches/react@1.2.8(react@18.2.0): + resolution: {integrity: sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==} + peerDependencies: + react: '>= 16.3.0' + dependencies: + react: 18.2.0 + dev: false + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.21.0): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} @@ -5366,6 +5713,18 @@ packages: tailwindcss: 3.2.7(postcss@8.4.21)(ts-node@10.9.1) dev: false + /@tanstack/query-async-storage-persister@4.22.4(@tanstack/query-core@4.22.4): + resolution: {integrity: sha512-8DWEt+bmxyjp12aqGnYhpgroOZgvgzvs+mMqBIyZVET4eWQNKAuQSFXTlkztmq9/sxbvTnp+xu7KRZExyurZPA==} + dependencies: + '@tanstack/query-persist-client-core': 4.22.4(@tanstack/query-core@4.22.4) + transitivePeerDependencies: + - '@tanstack/query-core' + dev: false + + /@tanstack/query-core@4.22.4: + resolution: {integrity: sha512-t79CMwlbBnj+yL82tEcmRN93bL4U3pae2ota4t5NN2z3cIeWw74pzdWrKRwOfTvLcd+b30tC+ciDlfYOKFPGUw==} + dev: false + /@tanstack/query-core@4.26.1: resolution: {integrity: sha512-Zrx2pVQUP4ndnsu6+K/m8zerXSVY8QM+YSbxA1/jbBY21GeCd5oKfYl92oXPK0hPEUtoNuunIdiq0ZMqLos+Zg==} dev: false @@ -5373,6 +5732,14 @@ packages: /@tanstack/query-core@4.29.5: resolution: {integrity: sha512-xXIiyQ/4r9KfaJ3k6kejqcaqFXXBTzN2aOJ5H1J6aTJE9hl/nbgAdfF6oiIu0CD5xowejJEJ6bBg8TO7BN4NuQ==} + /@tanstack/query-persist-client-core@4.22.4(@tanstack/query-core@4.22.4): + resolution: {integrity: sha512-F5rCLczSw8RjFlwWASD3oRR7D4oyG90QbBFaOqBCjGbvE3bcD+m/E4GGCp1qfACoLuH4KtxhdwdOFfE+e0TRZQ==} + peerDependencies: + '@tanstack/query-core': 4.22.4 + dependencies: + '@tanstack/query-core': 4.22.4 + dev: false + /@tanstack/query-persist-client-core@4.29.5: resolution: {integrity: sha512-IjLtEZiEUnzpcFVdHoZGqtjv2g0smLK5WOWk8hP/2ndlXe5kaSbtCKWO2WFbw7yWPYVMM2m9zyglZqg5kU1DMA==} dependencies: @@ -5383,6 +5750,17 @@ packages: dependencies: '@tanstack/query-persist-client-core': 4.29.5 + /@tanstack/react-query-persist-client@4.22.4(@tanstack/query-core@4.22.4)(@tanstack/react-query@4.22.4): + resolution: {integrity: sha512-vnRD28T0BLsbDRlantC6W34eLCbjSoZEkYL4t2QYRyuEcmUya2Ddbn+DN+RfZHqxoMiSJNfMdmRXsMPpNHZ1QA==} + peerDependencies: + '@tanstack/react-query': 4.22.4 + dependencies: + '@tanstack/query-persist-client-core': 4.22.4(@tanstack/query-core@4.22.4) + '@tanstack/react-query': 4.22.4(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@tanstack/query-core' + dev: false + /@tanstack/react-query-persist-client@4.29.5(@tanstack/react-query@4.29.5): resolution: {integrity: sha512-zvQChSqO/HpRHWjCn+4L4M45Yr2eslogJcQr2HFxRw27Wj/5WlFYhnQFo5SCCR+gZh09tMnkzD+zFhN76wMEGw==} peerDependencies: @@ -5391,6 +5769,24 @@ packages: '@tanstack/query-persist-client-core': 4.29.5 '@tanstack/react-query': 4.29.5(react-dom@18.2.0)(react@18.2.0) + /@tanstack/react-query@4.22.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-e5j5Z88XUQGeEPMyz5XF1V0mMf6Da+6URXiTpZfUb9nuHs2nlNoA+EoIvnhccE5b9YT6Yg7kARhn2L7u94M/4A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.22.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + /@tanstack/react-query@4.26.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-i3dnz4TOARGIXrXQ5P7S25Zfi4noii/bxhcwPurh2nrf5EUCcAt/95TB2HSmMweUBx206yIMWUMEQ7ptd6zwDg==} peerDependencies: @@ -5688,7 +6084,6 @@ packages: resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==} dependencies: '@types/react': 18.0.26 - dev: true /@types/react-table@7.7.14: resolution: {integrity: sha512-TYrv7onCiakaG1uAu/UpQ9FojNEt/4/ht87EgJQaEGFoWV606ZLWUZAcUHzMxgc3v1mywP1cDyz3qB4ho3hWOw==} @@ -5764,7 +6159,7 @@ packages: '@typescript-eslint/scope-manager': 5.59.11 '@typescript-eslint/type-utils': 5.59.11(eslint@8.30.0)(typescript@4.9.4) '@typescript-eslint/utils': 5.59.11(eslint@8.30.0)(typescript@4.9.4) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.30.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 @@ -5789,7 +6184,7 @@ packages: '@typescript-eslint/scope-manager': 5.59.11 '@typescript-eslint/types': 5.59.11 '@typescript-eslint/typescript-estree': 5.59.11(typescript@4.9.4) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.30.0 typescript: 4.9.4 transitivePeerDependencies: @@ -5824,7 +6219,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.59.11(typescript@4.9.4) '@typescript-eslint/utils': 5.59.11(eslint@8.30.0)(typescript@4.9.4) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.30.0 tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 @@ -5853,7 +6248,7 @@ packages: dependencies: '@typescript-eslint/types': 5.54.1 '@typescript-eslint/visitor-keys': 5.54.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.0 @@ -5874,7 +6269,7 @@ packages: dependencies: '@typescript-eslint/types': 5.59.11 '@typescript-eslint/visitor-keys': 5.59.11 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.0 @@ -6739,7 +7134,7 @@ packages: engines: {node: '>=6'} dependencies: buffer: 5.7.1 - immediate: 3.3.0 + immediate: 3.2.3 level-concat-iterator: 2.0.1 level-supports: 1.0.1 xtend: 4.0.2 @@ -6750,7 +7145,7 @@ packages: engines: {node: '>=6'} dependencies: buffer: 5.7.1 - immediate: 3.3.0 + immediate: 3.2.3 level-concat-iterator: 2.0.1 level-supports: 1.0.1 xtend: 4.0.2 @@ -6812,7 +7207,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false @@ -6821,7 +7216,7 @@ packages: resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 depd: 2.0.0 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -7069,6 +7464,11 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + /attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + dev: false + /autoprefixer@10.4.14(postcss@8.4.21): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} @@ -7105,14 +7505,14 @@ packages: /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 transitivePeerDependencies: - debug /axios@1.3.3: resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -7122,7 +7522,7 @@ packages: /axios@1.3.4: resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -7826,6 +8226,13 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true + /combine-errors@3.0.3: + resolution: {integrity: sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==} + dependencies: + custom-error-instance: 2.1.1 + lodash.uniqby: 4.5.0 + dev: false + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -7970,6 +8377,11 @@ packages: browserslist: 4.21.5 dev: true + /core-js@3.31.0: + resolution: {integrity: sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==} + requiresBuild: true + dev: false + /core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: false @@ -8130,6 +8542,10 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false + /custom-error-instance@2.1.1: + resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} + dev: false + /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -8194,6 +8610,17 @@ packages: ms: 2.1.3 dev: true + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -8205,6 +8632,7 @@ packages: dependencies: ms: 2.1.2 supports-color: 8.1.1 + dev: false /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -8446,7 +8874,7 @@ packages: /dns-over-http-resolver@1.2.3(node-fetch@2.6.9): resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 native-fetch: 3.0.0(node-fetch@2.6.9) receptacle: 1.3.2 transitivePeerDependencies: @@ -9059,7 +9487,7 @@ packages: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 enhanced-resolve: 5.13.0 eslint: 8.30.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.30.0) @@ -9106,6 +9534,35 @@ packages: - supports-color dev: true + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint@8.30.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.59.11(eslint@8.30.0)(typescript@4.9.4) + debug: 3.2.7 + eslint: 8.30.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.30.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} @@ -9169,6 +9626,39 @@ packages: - supports-color dev: true + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.11)(eslint@8.30.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.59.11(eslint@8.30.0)(typescript@4.9.4) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.30.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint@8.30.0) + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + semver: 6.3.0 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-jest-dom@4.0.3(eslint@8.30.0): resolution: {integrity: sha512-9j+n8uj0+V0tmsoS7bYC7fLhQmIvjRqRYEcbDSi+TKPsTThLLXCyj5swMSSf/hTleeMktACnn+HFqXBr5gbcbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} @@ -9391,7 +9881,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 @@ -9597,44 +10087,6 @@ packages: rlp: 2.2.7 dev: false - /ethers@5.5.1: - resolution: {integrity: sha512-RodEvUFZI+EmFcE6bwkuJqpCYHazdzeR1nMzg+YWQSmQEsNtfl1KHGfp/FWZYl48bI/g7cgBeP2IlPthjiVngw==} - dependencies: - '@ethersproject/abi': 5.5.0 - '@ethersproject/abstract-provider': 5.5.1 - '@ethersproject/abstract-signer': 5.5.0 - '@ethersproject/address': 5.5.0 - '@ethersproject/base64': 5.5.0 - '@ethersproject/basex': 5.5.0 - '@ethersproject/bignumber': 5.5.0 - '@ethersproject/bytes': 5.5.0 - '@ethersproject/constants': 5.5.0 - '@ethersproject/contracts': 5.5.0 - '@ethersproject/hash': 5.5.0 - '@ethersproject/hdnode': 5.5.0 - '@ethersproject/json-wallets': 5.5.0 - '@ethersproject/keccak256': 5.5.0 - '@ethersproject/logger': 5.5.0 - '@ethersproject/networks': 5.5.0 - '@ethersproject/pbkdf2': 5.5.0 - '@ethersproject/properties': 5.5.0 - '@ethersproject/providers': 5.5.0 - '@ethersproject/random': 5.5.0 - '@ethersproject/rlp': 5.5.0 - '@ethersproject/sha2': 5.5.0 - '@ethersproject/signing-key': 5.5.0 - '@ethersproject/solidity': 5.5.0 - '@ethersproject/strings': 5.5.0 - '@ethersproject/transactions': 5.5.0 - '@ethersproject/units': 5.5.0 - '@ethersproject/wallet': 5.5.0 - '@ethersproject/web': 5.5.0 - '@ethersproject/wordlists': 5.5.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - /ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} dependencies: @@ -9906,6 +10358,13 @@ packages: flat-cache: 3.0.4 dev: true + /file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + dependencies: + tslib: 2.5.0 + dev: false + /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -9980,7 +10439,7 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects@1.15.2(debug@4.3.4): + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -9988,8 +10447,6 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -10386,9 +10843,9 @@ packages: engines: {node: '>=6'} dev: true - /hardhat@2.16.1(ts-node@10.9.1)(typescript@4.9.4): - resolution: {integrity: sha512-QpBjGXFhhSYoYBGEHyoau/A63crZOP+i3GbNxzLGkL6IklzT+piN14+wGnINNCg5BLSKisQI/RAySPzaWRcx/g==} - engines: {node: '>=14.0.0'} + /hardhat@2.17.0(ts-node@10.9.1)(typescript@4.9.4): + resolution: {integrity: sha512-CaEGa13tkJNe2/rdaBiive4pmdNShwxvdWVhr1zfb6aVpRhQt9VNO0l/UIBt/zzajz38ZFjvhfM2bj8LDXo9gw==} + engines: {node: '>=16.0.0'} hasBin: true peerDependencies: ts-node: '*' @@ -10422,7 +10879,7 @@ packages: chalk: 2.4.2 chokidar: 3.5.3 ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 enquirer: 2.3.6 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -10431,7 +10888,7 @@ packages: fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.3.0 + immutable: 4.3.1 io-ts: 1.10.4 keccak: 3.0.3 lodash: 4.17.21 @@ -10528,6 +10985,10 @@ packages: /hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + /hls.js@1.4.7: + resolution: {integrity: sha512-dvwJXLlYES6wb7DR42uuTrio5sUTsIoWbuNeQS4xHMqfVBZ0KAlJlBmjFAo4s20/0XRhsMjWf5bx0kq5Lgvv1w==} + dev: false + /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: @@ -10595,7 +11056,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false @@ -10679,12 +11140,8 @@ packages: resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} dev: false - /immediate@3.3.0: - resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} - dev: false - - /immutable@4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + /immutable@4.3.1: + resolution: {integrity: sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==} dev: false /import-fresh@3.3.0: @@ -10800,7 +11257,7 @@ packages: any-signal: 3.0.1 blob-to-it: 1.0.4 browser-readablestream-to-it: 1.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 err-code: 3.0.1 ipfs-core-types: 0.10.3(node-fetch@2.6.9) ipfs-unixfs: 6.0.9 @@ -10832,7 +11289,7 @@ packages: '@ipld/dag-pb': 2.1.18 any-signal: 3.0.1 dag-jose: 1.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 err-code: 3.0.1 ipfs-core-types: 0.10.3(node-fetch@2.6.9) ipfs-core-utils: 0.14.3(node-fetch@2.6.9) @@ -11151,7 +11608,6 @@ packages: /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - dev: true /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} @@ -11415,6 +11871,10 @@ packages: react: 18.2.0 dev: false + /js-base64@3.7.5: + resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + dev: false + /js-sdsl@4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} @@ -11730,7 +12190,7 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 7.1.0 lilconfig: 2.1.0 listr2: 5.0.8 @@ -11822,6 +12282,29 @@ packages: lit-element: 3.3.2 lit-html: 2.7.3 + /livepeer@2.6.0(react@18.2.0): + resolution: {integrity: sha512-tURkBvJQi0nyS5WlFHhKyRGx0qKqGt/DbKSzhUwJ9fAzT3GAlipujgKVOc3wnNWIj76LQrCp7onUmsrrkFRGkQ==} + peerDependencies: + react: '>=17.0.0' + peerDependenciesMeta: + react: + optional: true + dependencies: + '@livepeer/core': 1.6.0(react@18.2.0) + '@stitches/core': 1.2.8 + core-js: 3.31.0 + cross-fetch: 3.1.5 + hls.js: 1.4.7 + ms: 3.0.0-canary.1 + multiformats: 9.9.0 + react: 18.2.0 + tus-js-client: 3.1.0 + zustand: 4.3.8(react@18.2.0) + transitivePeerDependencies: + - encoding + - immer + dev: false + /load-tsconfig@0.2.3: resolution: {integrity: sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -11854,6 +12337,37 @@ packages: p-locate: 6.0.0 dev: true + /lodash._baseiteratee@4.7.0: + resolution: {integrity: sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==} + dependencies: + lodash._stringtopath: 4.8.0 + dev: false + + /lodash._basetostring@4.12.0: + resolution: {integrity: sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==} + dev: false + + /lodash._baseuniq@4.6.0: + resolution: {integrity: sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==} + dependencies: + lodash._createset: 4.0.3 + lodash._root: 3.0.1 + dev: false + + /lodash._createset@4.0.3: + resolution: {integrity: sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==} + dev: false + + /lodash._root@3.0.1: + resolution: {integrity: sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==} + dev: false + + /lodash._stringtopath@4.8.0: + resolution: {integrity: sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==} + dependencies: + lodash._basetostring: 4.12.0 + dev: false + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true @@ -11899,10 +12413,21 @@ packages: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true + /lodash.uniqby@4.5.0: + resolution: {integrity: sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==} + dependencies: + lodash._baseiteratee: 4.7.0 + lodash._baseuniq: 4.6.0 + dev: false + /lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} dev: true @@ -12379,7 +12904,7 @@ packages: resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} dependencies: '@types/debug': 4.1.7 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.0.6 micromark-factory-space: 1.0.0 @@ -12623,6 +13148,11 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /ms@3.0.0-canary.1: + resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} + engines: {node: '>=12.13'} + dev: false + /multiaddr-to-uri@8.0.0(node-fetch@2.6.9): resolution: {integrity: sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==} deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri @@ -13603,6 +14133,14 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: false + /property-information@6.2.0: resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} dev: false @@ -13791,6 +14329,10 @@ packages: split-on-first: 1.1.0 strict-uri-encode: 2.0.0 + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -13812,7 +14354,7 @@ packages: dependencies: '@assemblyscript/loader': 0.9.4 bl: 5.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 minimist: 1.2.8 node-fetch: 2.6.9 readable-stream: 3.6.2 @@ -13870,6 +14412,18 @@ packages: react: 18.2.0 scheduler: 0.23.0 + /react-dropzone@14.2.3(react@18.2.0): + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + dependencies: + attr-accept: 2.2.2 + file-selector: 0.6.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /react-hook-form@7.43.9(react@18.2.0): resolution: {integrity: sha512-AUDN3Pz2NSeoxQ7Hs6OhQhDr6gtF9YRuutGDwPQqhSUAHJSgGl2VeY3qN19MG0SucpjgDiuMJ4iC5T5uB+eaNQ==} engines: {node: '>=12.22.0'} @@ -14240,6 +14794,10 @@ packages: engines: {node: '>=0.10.5'} dev: true + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: false @@ -14318,6 +14876,11 @@ packages: resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} dev: false + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -14600,7 +15163,6 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -14635,7 +15197,7 @@ packages: supports-color: 7.2.0 dev: false - /siwe@1.1.6(ethers@5.5.1): + /siwe@1.1.6(ethers@5.7.2): resolution: {integrity: sha512-3WRdEil32Tc2vuNzqJ2/Z/MIvsvy0Nkzc2ov+QujmpHO7tM83dgcb47z0Pu236T4JQkOQCqQkq3AJ/rVIezniA==} peerDependencies: ethers: 5.5.1 @@ -14643,7 +15205,7 @@ packages: '@spruceid/siwe-parser': 1.1.3 '@stablelib/random': 1.0.2 apg-js: 4.1.3 - ethers: 5.5.1 + ethers: 5.7.2 dev: false /slash@3.0.0: @@ -14696,7 +15258,7 @@ packages: dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 @@ -15309,6 +15871,18 @@ packages: safe-buffer: 5.2.1 dev: false + /tus-js-client@3.1.0: + resolution: {integrity: sha512-Hfpc8ho4C9Lhs/OflPUA/nHUHZJUrKD5upoPBq7dYJJ9DQhWocsjJU2RZYfN16Y5n19j9dFDszwCvVZ5sfcogw==} + dependencies: + buffer-from: 1.1.2 + combine-errors: 3.0.3 + is-stream: 2.0.1 + js-base64: 3.7.5 + lodash.throttle: 4.1.1 + proper-lockfile: 4.1.2 + url-parse: 1.5.10 + dev: false + /tweetnacl-util@0.13.5: resolution: {integrity: sha512-/4Q3hpPFAnbBjNLLOmdTdyvInBfZcQBTWy+LWbypmWxAKwOpSQOyyv4ZZts4CoiYtS8Skyix5CkOWytf7XNK9A==} dev: false @@ -15572,6 +16146,13 @@ packages: dependencies: punycode: 2.3.0 + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /url-set-query@1.0.0: resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} dev: false diff --git a/template/base/public/integrations/livepeer.svg b/template/base/public/integrations/livepeer.svg new file mode 100644 index 0000000..e678722 --- /dev/null +++ b/template/base/public/integrations/livepeer.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/template/integrations/connext/pages/connext/layout.tsx b/template/integrations/connext/pages/connext/layout.tsx index b46ba27..30619e4 100644 --- a/template/integrations/connext/pages/connext/layout.tsx +++ b/template/integrations/connext/pages/connext/layout.tsx @@ -31,7 +31,7 @@ export default function ConnextLayout({ children }: { children: ReactNode }) { }}> Connext Icon Connext @@ -39,8 +39,8 @@ export default function ConnextLayout({ children }: { children: ReactNode }) { Bridge assets directly from your app - - + + Documentation diff --git a/template/integrations/disco/pages/disco/page.tsx b/template/integrations/disco/pages/disco/page.tsx index b1b7456..de3a4e2 100644 --- a/template/integrations/disco/pages/disco/page.tsx +++ b/template/integrations/disco/pages/disco/page.tsx @@ -52,8 +52,8 @@ export default function PageIntegration() { {turboIntegrations.disco.description} - - + + Documentation diff --git a/template/integrations/erc20/pages/erc20/page.tsx b/template/integrations/erc20/pages/erc20/page.tsx index 83597df..45f9db2 100644 --- a/template/integrations/erc20/pages/erc20/page.tsx +++ b/template/integrations/erc20/pages/erc20/page.tsx @@ -43,8 +43,8 @@ export default function PageIntegration() { {turboIntegrations.erc20.description} - - + + Documentation diff --git a/template/integrations/erc721/pages/erc721/page.tsx b/template/integrations/erc721/pages/erc721/page.tsx index dfc5b42..089e439 100644 --- a/template/integrations/erc721/pages/erc721/page.tsx +++ b/template/integrations/erc721/pages/erc721/page.tsx @@ -41,8 +41,8 @@ export default function PageIntegration() { {turboIntegrations.erc721.description} - - + + Documentation diff --git a/template/integrations/etherscan/pages/etherscan/page.tsx b/template/integrations/etherscan/pages/etherscan/page.tsx index 253df8f..7d9c478 100644 --- a/template/integrations/etherscan/pages/etherscan/page.tsx +++ b/template/integrations/etherscan/pages/etherscan/page.tsx @@ -55,8 +55,8 @@ export default function PageIntegration() { {turboIntegrations.etherscan.description} - - + + Documentation diff --git a/template/integrations/lit-protocol/pages/lit-protocol/layout.tsx b/template/integrations/lit-protocol/pages/lit-protocol/layout.tsx index bc7fce9..c624029 100644 --- a/template/integrations/lit-protocol/pages/lit-protocol/layout.tsx +++ b/template/integrations/lit-protocol/pages/lit-protocol/layout.tsx @@ -45,16 +45,16 @@ export default function LayoutIntegration({ children }: LayoutIntegrationProps) {turboIntegrations.litProtocol.description} - - + + Documentation - - + + Share - - + + Unseal diff --git a/template/integrations/livepeer/core/livepeer/README.md b/template/integrations/livepeer/core/livepeer/README.md new file mode 100644 index 0000000..b3a51a9 --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/README.md @@ -0,0 +1,103 @@ +# Livepeer API - React Hook Integration + +This integration with the [Livepeer API](https://livepeer.org/) offers a user-friendly approach for managing video content and livestreams directly within the browser, thanks to its suite of reusable React Components. + +## Features + +- File Uploading Interface: It equips users with an interface to upload MP4 video files to an on-chain server. This feature is critical in preserving data immutability and security. + +- Video Playback: It supports video playback capabilities, allowing users to watch previously uploaded videos. + +- Livestream Creation: It facilitates the creation of livestreams using OBS (Open Broadcaster Software) or a web browser, offering flexible options to broadcasters. + +- Livestream Playback: It enables users to watch livestreams. + +- Stream Configuration: It includes a copy-to-clipboard feature that simplifies the use of new live stream configuration information. + +- Notifications: It offers toast notifications for copy-to-clipboard actions and error handling, ensuring a smooth user experience. + +## API + +`useCheckLivepeerApiKey` +A custom React hook that checks if the provided API Key is valid for use on Livepeer API. It includes the following properties and methods: + +- `checkLivepeerApiKey(apiKey)`: A method that tries to delete a hypothetical livestream and according to its errors defines if the provided API Key is valid for Livepeer API. + - error with status 404 `NotFoundError` means that the API key is valid and has Full API access + - error with status 403 `PermissionError` means that the API key is valid but doesn't have Full API access + - error with the message 'Failed to fetch' `FailedToFetchError` means that the API key is not valid, it can be an error to fetch or the valid API Key doesn't have CORS access + +`useLivepeerApiKey` +A custom React hook that provides state regarding Livepeer API Key. It includes the following properties and methods: + +- `useLivepeerApiKey`: A method that provides the current state of a custom API Key set by the client +- `useIsLivepeerApiKeySet`: A method that checks if the Livepeer API Key is set by the client or the server and returns true if one of the cases is defined and false if neither is. + +## Components + +`ButtonShare` +A React component that facilitates sharing a specific asset, such as a livestream, video, or IPFS URL. It provides a button that, when clicked, copies the corresponding URL to the clipboard for easy sharing. + +`CreateStream` +A React component that sets up a livestream. The user is prompted to provide a name for the stream and upon creation with useCreateStream hook, instructions are given on how to setup the stream using OBS or Browser. The component also handles copying the streaming details to the clipboard for easy configuration. In case the user does not have an API key set for Livepeer, a form is rendered to collect the key. + +`DialogStopStream` +A React component that displays a dialog to confirm if the user wants to end the Broser Livestream. Once the user confirms, the Broadcast component is unmounted as the route is set to `/integration/livepeer/livestream/` + +`FormLivepeerApiKey` +A React component that displays a form to collect the user's Livepeer API key. Once the form is submitted, the key is validated and saved if it is correct. The user is alerted if the key is invalid or if there are any other errors. If no key is set, a persistent notification prompts the user to set the key. + +`FormLivepeerAsset` +A React component that renders a form to collect the user's Livepeer asset ID. Upon form submission, the component redirects the user to a page where the user can watch the video associated with the provided asset ID. The submission button is disabled until a valid asset ID is entered. + +`FormLivepeerStream` +A React component that renders a form to collect the user's Livepeer stream ID. Upon form submission, the component redirects the user to a page displaying the livestream associated with the provided stream ID. The submission button is disabled until a valid stream ID is entered. + +`PlayerComponent` +This is a React component that uses Livepeer's player to play a stream, file, or an IPFS URL. The type of player and the source of the content is determined by the props provided. + +If the type is PlayerType.IPFS_URL, then an ipfsUrl must be provided and playbackId should not exist. In contrast, if the type is PlayerType.FILE or PlayerType.STREAM, a playbackId must be provided and ipfsUrl should not exist. + +The player also includes controls that autohide after 3000 milliseconds. The poster attribute is an optional image that is displayed before the video starts playing, and autoPlay determines whether the video should start playing as soon as it is ready. + +If containerBorderRadius is provided, it changes the border-radius of the player container. If it is not provided, the default value is '0px'. + +The title of the video can be set using the title attribute. If autoPlay is true, the video will start playing as soon as it is ready. + +`Spinner` +This is a simple React functional component that renders a loading spinner SVG. It's typically used to indicate that the application is in the process of loading some data or executing an operation. + +`UploadFile` +This React component is designed for uploading a video file to the Livepeer service. Initially, it checks if the Livepeer API key is set. If not, it prompts for it using FormLivepeerApiKey. + +Once the key is set, it enables a user-friendly interface for users to drop or select an MP4 video file. Upon selection, the file is uploaded using the useCreateAsset hook, with the progress displayed to the user. When the upload completes, the user is redirected to the video page. + +## Environment Variables + +To use the Livepeer API with a predefined API key, you need to set the `NEXT_PUBLIC_LIVEPEER_API_KEY` environment variable in your `.env` file: + +``` +NEXT_PUBLIC_LIVEPEER_API_KEY= +``` + +## File Structure + +``` +integrations/livepeer +├─ assets +│ ├─ default_poster.png +├─ components +│ ├─ create-stream.tsx +│ ├─ dialog-stop-stream.tsx +│ ├─ form-livepeer-api-key.tsx +│ ├─ form-livepeer-asset.tsx +│ ├─ form-livepeer-stream.tsx +│ ├─ player.tsx +│ ├─ spinner.tsx +│ ├─ upload-file.tsx +├─ hooks +│ ├─ use-check-livepeer-api-key.ts +│ ├─ use-livepeer-api-key.ts +├─ livepeer-client.tsx +├─ livepeer-provider.tsx +├─ README.md +``` diff --git a/template/integrations/livepeer/core/livepeer/assets/default_poster.png b/template/integrations/livepeer/core/livepeer/assets/default_poster.png new file mode 100644 index 0000000000000000000000000000000000000000..9a757ffaa2464b93e59c97bb2aed9362d18c21f4 GIT binary patch literal 7345 zcmc&&cT`jPwmu*ViU{h6S5Shzfk-nTQglR`lq*GgxS~ieB7`2eq7Fu75Ghi}f}k`3 z0jU865s{#%L_nG}k=|R%-RC5}HSfMzj{f0#hedMMDf_qgx4-@E{Y#jEo`%2*krfDn z2xw^@J%J!RaLTR9w+y}py3#A*YuPCsjiU$){rjUVH4?5Ych@xYM36P-(SNRXJDd+( z9YRu&Q5TF1sx*cCw=9pBhz?9W8h%Nc zn`_OM-$~J==%U!7*vZ(IGsU&|hW`AMZu@#zegX4=r)*E1T2=$jAcvh!al@AodX8|R zAAfs_MvkbV9~cPVJpDe4*plCA@lUJ&B;$Vzz<)pRBcA{FyWhh6PoaL_>CZC$13wI?-nnz<$f{EvM#jd8QoDAUwimi}1dzFq zYuDBzh@41mZLQ=;`Qpf;ezJ;kivR3LCYa!ZfF3nvS`e%Z4EAru;|s$hLr{khE^>Id z{tzv@L;qy9b)tOW!qjzPF62nRD2P#){`|6vn6P7a&MGGHNC|J&2_yl4_v%&!GrLHk+=~x zA?6Jd_t>J5khabp}z7AOOZyj-Me;ZN<}3OP4N{ z?eH7S9HCkJyIfJn6qb7(4wvlS5jZPA$aggEd-uT54ZwEaJt2S~{~n_;A%q7H9)xXF zaJSJZbZry1eByqaIssTd#V`^&3X<~AcVEV}BFl}$vlP$G-upES3fgEfEAk(G?Y2m(8Z!{<_ ztC7z1ryJBDg4u&h=K9mJva&wpoo&!4^PBd2TdRh2;_6ZNMYXiG9lZxL3uhF4Cwj+*Q&Wanx}s;_p*-KozC|VCNP^>6-$y>q^X@gt@EM{}m|l2}^Ahs%`NO|& z{`Jzj_3KrE)x^gIe26%Qvuj!kT>RT6dh1df;_;)&hK7dSnQT_2g@%S!bv?Tr-kxKt z(f1-^Yc`-iR@k#r963C{`BNoS}emyYtlnCPe|bw(IBLUOT2kcyLPCr+Hm z%d#qI_nP|rrXOWWx+I6Kef9B$K?5l<_nliF4-j0RbX~FoX7V5ipJ~iKtC0^+Jh~%2 z`(6z=3$Qbi@A&@9mDO91T?HUthvJxHm-Uu$qiG4*Qm9;^^;hFc3+sTcXztK^^SeaRdc7zpDmZiIR)20UT) zMCvnLo`x=`nX}({#|ptatcj0{TevpxHdP;8hykTPE`o`P_~}F?BC`_eASr03`K+5` z<2|hm4uhkjqi5FIlR zNkG(Vtg~`_!-fr#wzjs6JV+O?)4(cl`aQnCzh9qF9x%V@q@{=Y4R!Pm!X0(<=FM|7 zE22Pqng48Lb8|Dzj0X|P{tz1*TWN=Mo;Yb{rnpm4vFPG<<{y^;gzOFTC18JQTAID1xA%? znfM0^BInR}@7K$#3Z<+|=falq3oC5kL$f243m!$ojZI#2V_gKu-R&Z%c_1FbRWk8% zuM$d~rdBsf+cTg&h-7f^_8mKR2tqx7071juQtLr7 zY;SJa!ggfvW6`9bu#`3Z3CFb%r#E-h2XFs+`T9Y>sn2(5mY%wXWUTIZGOS9x@xsEw z%mxVZyi03ACg+{o+M1f0B50Y1t1Q?%dwUna4fo~l%Y=f(6_(6}8(LXyYK9uWboJ_0 zeEP$OUm(>4T__WT6mjp~y_*(pWz)Pn^%7zaoPP0p0mwY?I~eYUK0H$weNqBChu`7D zmCA)3LH>I=z6=$#x-NRSy1LHL=O+_a@?cpqb98i!|JSoi*ADqj*`q#)gOPucU1(Wt z#1;Jfgd`=RYYb@B(MWbcdp2+0?9uZgLeTBwlkwZ*-8BTK)yP~8$8Vonx?*BSz7y?v zlCppK@M&>`9_R~Xpts2Z`KxCsECw#=kncn@ld;IcbNs@zrZGk5Y=(82U&UEE>oBUQZQr(S+qDg{c0)kOW7kFGzi5+@3PQMSFv3&0p#J0nq~) zXisYgkxE#}6Ws9(YP0i3%#9n3xx~@-C4!p{%1tNvkIY|USN;)(j&9_RoESooZ%INz z!g`Y|%Vt$cNy*AR9E!hBrv*QK`gCWiZhTXv2>asV0*w+h4N5D+&(BY4Ptl1nB4c-W z_P|6kzc83Rn(IB>;s7z1S8qWfLb|T#>gl;k+r5g-0eD2CA|l?r+=kuZDj9z+TGH3s zt6N)NKm7Kg@m}0=9yNG{&sbYq`%4?KgCPZjhW^S8GWRmoQ2>!641R;i9lDKg-?mBt zzZbr|Pv@!^z|uy4^orj9y!sncuTwno1i74 zu7#ilIPxLKHoUa7G!@DLTii0wuHGEu2ryK`io}?%KV@qhh{J{paiflTDzSJ3>i;6X z-KV<%Bu8ljUocn`dI+2<_{SliG1dp5zZ7V36G)BaOKdY3&lRj=b>>WO0_e1Gbf;TN zd3pK27z@*NCB)GrTLEOBI$GHD-6RLc#%(h*t!|_Kpi8MZzt6YR+1(XeBMs_sMi#(y zZ*?h5Fa8eL7fRrXs?N0+DNJVldD_}`y8H}71r~g?X0>=crE~ z*f7(L3)Z;>lN&;~lbbscpr=P|H8V4drzR+_&BwG@&1Pn_gW>^WC%-Clu6uU+Cq*G`{m{3je(hS!+>Xu3n)VZJ7wI4&>-bt_^5t+Uw5&JlM{0Qxe?|k ziS+bzr$@_>&7RAI5c~6A1_uXqw6(7+6BMJ9K|lHy#s$@E(J}CK8d{s{_L`Kk@{$?O zE@o!8-UeY=yxmM8u`a!O^(p}}8^v))LLe$CYCVh$cvV?h&k{w9J=_4KA=)3U04Iyb z@VJx&rkFypP}~=?Da?h&p`oENnD&89e6JrGr?+o{e3GCZn>3hgK{`PobQqYJcss*@ zB2~6HQnC|d8I_(`&28sgA)|YF1w?KVyPjS=$PqU?7Ly@*AG%;XvE8>nR35W~`7-}< zZ+59n5Pfdb8~ewVoZbTS_4}IZo0Qx~%Vx`qVP5Bl=8yXG>Xz);RcN;?1K}6}&`<>m zhTX#S$ghIRHwiF4JFs=8B0-6mn@J53%@2zVVDr0n#YdX=FS`YX=q`Dc$gxn zkUSAK)}bj~KtEm?8JQqom>%|cvi0+RX(_!b_e@UcdyD=#S#uMq4v-a<_+&3uVr;!5Tu&2eczvwl2QY$Ux5f?M-6bo z^z3SOhk4i3bPVLa?7-Ho-SwK=K3!Htcq(Au&`E*0sEVW)CpS=J;ab!ypvvSD--v1s z2)DE}TD`E4zZ1-_6y+egPZS4!Pk>PwSRJ1SR>_>oIKFL-VoYRYUX_C?wkqLiLF8H_U@7znSf>f&Ol~rZ-tTmUOh)$wSlM0R6&w+f zK2=4B%~A|rPEL-qv^bDxJaQ2&Wh3X93wwR`vYGaL$&xE$;%l*Igpatb}qoznvv zq8Cx&jN)Iv&vO5%D!x<(COt0D)8ft5O-9UXT zz#Y`bKS1S3@b+)BFs<$7T#SVcLQ*Z2n#4#aFuwdQkJ;shkuuN&=4af@a4XRP#Qq(7 z;}fFjGuBC6Z|$?02(3-ys||ZO^U3F;ZghVWlcwm2i3xKudtZAmD{G%0w5JQuMv@H; z4BVSIW_C+SvFME1js{T}YyF(qPuoxS)#I*;;`g}$!+L>2Kn%X)fQ1>DU5T6LqyR+? zBwq!3IxQaXNXuhyH*HpJI{0`opJu&SpVy$WnEcg%i;GKryj!^<=~Go$D~Av$9KRRC zA$yj(QB3Caiwx+*(J*6SND~6a)wP0xg4*?iCL-lIc3wjV=ii|lH+2};WyW#2k9BaE zC!HLCf?9GSnY$$p9(*=oQEG#80Ust z^3Qz5+}Qa2JoI1*m941d2I^gzS?VQvMOnz2%_Fn$r z0Lec8{-JRZP}T`8TJ(m2hsXHNwL6ZRPPO}wCc4_&+dtw%DoE=@*RGZQuo6HOIsml_ zh{GvHy6-pzyKulu*xKJd1sZ>cMK$y(gsTF5S{yw^K()T(6sQbhf_|Vy{_WH6vnc*| zX8wAepJW{K<~yB^iHmzB^|^@^;*5HurLK20>xj+2{{yLHLn;6O literal 0 HcmV?d00001 diff --git a/template/integrations/livepeer/core/livepeer/components/button-share.tsx b/template/integrations/livepeer/core/livepeer/components/button-share.tsx new file mode 100644 index 0000000..b3fea8e --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/button-share.tsx @@ -0,0 +1,43 @@ +import CopyToClipboard from 'react-copy-to-clipboard' + +import { useToast } from '@/lib/hooks/use-toast' + +import { PlayerType } from './player' + +const assetOnDescription = { + [PlayerType.STREAM]: 'Livestream', + [PlayerType.FILE]: 'Video', + [PlayerType.IPFS_URL]: 'Video', +} + +export function ButtonShare({ href, PlayerType }: { href: string; PlayerType: PlayerType }) { + const url = href.startsWith('/') ? `${origin}/${href}` : href + const description = `You can now paste the ${assetOnDescription[PlayerType]} URL` + + const { toast, dismiss } = useToast() + + const handleToast = ({ title, description }: { title: string; description: string }) => { + toast({ + title, + description, + }) + + setTimeout(() => { + dismiss() + }, 4200) + } + return ( + + { + handleToast({ + title: 'Copied to clipboard!', + description, + }) + }}> + {`Share ${assetOnDescription[PlayerType]}`} + + + ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/create-stream.tsx b/template/integrations/livepeer/core/livepeer/components/create-stream.tsx new file mode 100644 index 0000000..1c37b1e --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/create-stream.tsx @@ -0,0 +1,195 @@ +'use client' + +import { useMemo, useState } from 'react' + +import { useCreateStream } from '@livepeer/react' +import { Broadcast } from '@livepeer/react' +import { CopyToClipboard } from 'react-copy-to-clipboard' +import { useForm } from 'react-hook-form' +import { FaCopy } from 'react-icons/fa' + +import { useToast } from '@/lib/hooks/use-toast' + +import { ButtonShare } from './button-share' +import { DialogStopStream } from './dialog-stop-stream' +import { FormLivepeerApiKey } from './form-livepeer-api-key' +import { PlayerComponent, PlayerType } from './player' +import { useIsLivepeerApiKeySet } from '../hooks/use-livepeer-api-key' + +interface createStreamForm { + streamName: string +} + +enum StreamOrigin { + OBS = 'OBS', + BROWSER = 'BROWSER', +} + +const OBS_URL = 'https://obsproject.com/' +const streamPath = '/integration/livepeer/livestream/' + +export const CreateStream = ({ origin = StreamOrigin.BROWSER }: { origin: keyof typeof StreamOrigin }) => { + const [streamName, setStreamName] = useState('') + const { register, handleSubmit } = useForm() + const { mutate: createStream, data: streamData, status } = useCreateStream(streamName ? { name: streamName } : null) + const isLivepeerApiKeySet = useIsLivepeerApiKeySet() + const { toast, dismiss } = useToast() + + const isLoading = useMemo(() => status === 'loading', [status]) + + function onSubmit() { + createStream?.() + } + + const streamRtpmIngestUrl = 'rtmp://rtmp.livepeer.com/live' + + const handleToast = ({ title, description }: { title: string; description: string }) => { + toast({ + title, + description, + }) + + setTimeout(() => { + dismiss() + }, 4200) + } + + return ( +
+ {!isLivepeerApiKeySet ? ( +
+ +
+ ) : ( +
+ {!streamData && ( +
+
+ + setStreamName(e.target.value)} + /> + +
+
+ )} + {streamData && origin === StreamOrigin.OBS && ( + <> +
+
+

Your stream was succesfuly created!

+ + To make the stream active, you must configure your{' '} + + OBS + {' '} + by following the steps below: + +
    +
  1. Open OBS
  2. +
  3. + Go to Settings +
  4. +
  5. + Go to Stream +
  6. +
  7. + Set Service to Custom... +
  8. +
  9. + Set Server to RTMP Ingest URL provided below +
  10. +
  11. + Set Stream Key to the Stream Key provided below +
  12. +
  13. + Click Apply and then OK +
  14. +
  15. + Click Start Streaming +
  16. +
+ + With this proccess, you will be able to stream whatever is set as Sources on your OBS + +
+
+
+
+
+ +
+ + + { + handleToast({ + title: 'Copied to clipboard!', + description: 'You can now paste the RTMP Ingest URL on OBS', + }) + }}> + + + +
+
+
+ +
+ + + { + handleToast({ + title: 'Copied to clipboard!', + description: 'You can now paste the Stream Key on OBS', + }) + }}> + + + +
+
+ +
+
+
+ +
+ + )} + {origin === StreamOrigin.BROWSER && streamData && ( +
+ + + +
+ )} +
+ )} +
+ ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/dialog-stop-stream.tsx b/template/integrations/livepeer/core/livepeer/components/dialog-stop-stream.tsx new file mode 100644 index 0000000..5ca84bc --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/dialog-stop-stream.tsx @@ -0,0 +1,25 @@ +import { LinkComponent } from '@/components/shared/link-component' +import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogTrigger } from '@/components/ui/alert-dialog' + +export function DialogStopStream() { + return ( + + + + + +
+ You are about to stop your Livestream +
+ + + Stop Livestream + + + Cancel +
+
+
+
+ ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/form-livepeer-api-key.tsx b/template/integrations/livepeer/core/livepeer/components/form-livepeer-api-key.tsx new file mode 100644 index 0000000..84c664f --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/form-livepeer-api-key.tsx @@ -0,0 +1,96 @@ +'use client' + +import { useEffect, useState } from 'react' + +import { useForm } from 'react-hook-form' +import { BiInfoCircle } from 'react-icons/bi' + +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' +import { useToast } from '@/lib/hooks/use-toast' + +import { FailedToFetchError, NotFoundError, PermissionError, useCheckLivepeerApiKey } from '../hooks/use-check-livepeer-api-key' +import { useIsLivepeerApiKeySet, useLivepeerApiKey } from '../hooks/use-livepeer-api-key' + +interface livepeerForm { + apiKey: string +} + +export function FormLivepeerApiKey() { + const [isLoading, setIsLoading] = useState(false) + const { register, handleSubmit, watch } = useForm() + const { checkLivepeerApiKey } = useCheckLivepeerApiKey() + const { toast, dismiss } = useToast() + const [, setLivepeerApiKey] = useLivepeerApiKey() + + const watchApiKey = watch('apiKey') + const ApiKeyTooltip = 'Livepeer API Key has to have CORS access to the current domain' + + const isLivepeerApiKeySet = useIsLivepeerApiKeySet() + useEffect(() => { + if (!isLivepeerApiKeySet) { + toast({ + title: 'Livepeer API Key not set', + description: 'Please set a Livepeer API Key to use this integration', + duration: 100000, + }) + } + return () => { + dismiss() + } + }, [isLivepeerApiKeySet]) + + const handleToast = ({ title, description }: { title: string; description: string }) => { + toast({ + title, + description, + }) + + setTimeout(() => { + dismiss() + }, 4200) + } + + async function onSubmit(FieldValues: livepeerForm) { + setIsLoading(true) + if (!FieldValues.apiKey) return + try { + await checkLivepeerApiKey(FieldValues.apiKey) + } catch (e) { + if (e instanceof NotFoundError || e instanceof PermissionError) { + setLivepeerApiKey(FieldValues.apiKey) + setIsLoading(false) + } else if (e instanceof FailedToFetchError) { + handleToast({ + title: 'Failed to fetch', + description: 'Please check if you API Key has CORS access', + }) + setIsLoading(false) + } else { + handleToast({ + title: 'Invalid API Key', + description: 'Please enter a valid Livepeer API Key', + }) + setIsLoading(false) + } + } + } + return ( +
+
+
+ + + + + + {ApiKeyTooltip} + +
+ + +
+
+ ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/form-livepeer-asset.tsx b/template/integrations/livepeer/core/livepeer/components/form-livepeer-asset.tsx new file mode 100644 index 0000000..0771178 --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/form-livepeer-asset.tsx @@ -0,0 +1,35 @@ +'use client' + +import { useState } from 'react' + +import { useRouter } from 'next/navigation' +import { useForm } from 'react-hook-form' + +interface livepeerForm { + assetId: string +} + +export function FormLivepeerAsset() { + const route = useRouter() + const { register, handleSubmit } = useForm() + const [isLoading, setIsLoading] = useState(false) + const [assetId, setAssetId] = useState('') + + function onSubmit(FieldValues: livepeerForm) { + setIsLoading(true) + if (FieldValues.assetId !== '') { + route.push(`/integration/livepeer/vod/${FieldValues.assetId}`) + } + } + return ( +
+
+ + setAssetId(e.target.value)} /> + +
+
+ ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/form-livepeer-stream.tsx b/template/integrations/livepeer/core/livepeer/components/form-livepeer-stream.tsx new file mode 100644 index 0000000..aca26d2 --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/form-livepeer-stream.tsx @@ -0,0 +1,35 @@ +'use client' + +import { useState } from 'react' + +import { useRouter } from 'next/navigation' +import { useForm } from 'react-hook-form' + +interface livepeerForm { + streamId: string +} + +export function FormLivepeerStream() { + const route = useRouter() + const { register, handleSubmit } = useForm() + const [isLoading, setIsLoading] = useState(false) + const [streamId, setStreamId] = useState('') + + function onSubmit(FieldValues: livepeerForm) { + setIsLoading(true) + if (FieldValues.streamId !== '') { + route.push(`/integration/livepeer/livestream/${FieldValues.streamId}`) + } + } + return ( +
+
+ + setStreamId(e.target.value)} /> + +
+
+ ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/player.tsx b/template/integrations/livepeer/core/livepeer/components/player.tsx new file mode 100644 index 0000000..2882753 --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/player.tsx @@ -0,0 +1,63 @@ +import { Player } from '@livepeer/react' +import Image, { StaticImageData } from 'next/image' + +import defaultPoster from '../assets/default_poster.png' + +export enum PlayerType { + STREAM = 'stream', + FILE = 'file', + IPFS_URL = 'ipfsUrl', +} + +interface CommonPlayerProps { + title: string + poster?: StaticImageData + containerBorderRadius?: `${string}px` + autoPlay?: boolean +} + +interface PlayerFileOrStreamProps extends CommonPlayerProps { + type: PlayerType.FILE | PlayerType.STREAM + playbackId: string + ipfsUrl?: never // This ensures that ipfsUrl will not exist when type is FILE or STREAM +} + +interface PlayerIpfsUrlProps extends CommonPlayerProps { + type: PlayerType.IPFS_URL + ipfsUrl: string + playbackId?: never // This ensures that playbackId will not exist when type is IPFS_URL +} + +type PlayerProps = PlayerFileOrStreamProps | PlayerIpfsUrlProps + +export function PlayerComponent({ + type, + ipfsUrl, + playbackId, + title, + poster = defaultPoster, + containerBorderRadius = '0px', + autoPlay = false, +}: PlayerProps) { + const PosterImage = () => {title} + + const source = type === PlayerType.IPFS_URL ? { src: ipfsUrl } : { playbackId } + + return ( + } + title={title} + {...source} + autoPlay={autoPlay} + controls={{ + autohide: 3000, + }} + theme={{ + radii: { containerBorderRadius: containerBorderRadius }, + }} + /> + ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/spinner.tsx b/template/integrations/livepeer/core/livepeer/components/spinner.tsx new file mode 100644 index 0000000..824da4d --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/spinner.tsx @@ -0,0 +1,22 @@ +export function Spinner() { + return ( +
+ + Loading... +
+ ) +} diff --git a/template/integrations/livepeer/core/livepeer/components/upload-file.tsx b/template/integrations/livepeer/core/livepeer/components/upload-file.tsx new file mode 100644 index 0000000..1d90c4c --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/components/upload-file.tsx @@ -0,0 +1,121 @@ +'use client' + +import { useCallback, useMemo, useState } from 'react' + +import { useCreateAsset } from '@livepeer/react' +import { useRouter } from 'next/navigation' +import { useDropzone } from 'react-dropzone' +import { BiVideoPlus } from 'react-icons/bi' + +import { Progress } from '@/components/ui/progress' + +import { FormLivepeerApiKey } from './form-livepeer-api-key' +import { useIsLivepeerApiKeySet } from '../hooks/use-livepeer-api-key' + +export function UploadFile() { + const [video, setVideo] = useState() + const route = useRouter() + const { + mutate: createAsset, + data: asset, + status, + progress, + error, + } = useCreateAsset( + video + ? { + sources: [{ name: video.name, file: video }] as const, + } + : null + ) + const isLivepeerApiKeySet = useIsLivepeerApiKeySet() + + const onDrop = useCallback(async (acceptedFiles: File[]) => { + if (acceptedFiles && acceptedFiles.length > 0 && acceptedFiles?.[0]) { + setVideo(acceptedFiles[0]) + } + }, []) + + const { getRootProps, getInputProps } = useDropzone({ + accept: { + 'video/mp4': ['.mp4', '.MP4'], + }, + maxFiles: 1, + onDrop, + }) + + const isLoading = useMemo(() => status === 'loading' || (asset?.[0] && asset[0].status?.phase !== 'ready'), [status, asset]) + + const totalProgress = useMemo( + () => + progress?.[0].phase === 'uploading' + ? Math.round((progress?.[0]?.progress * 100) / 2) + : progress?.[0].phase === 'processing' + ? Math.round((progress?.[0].progress * 100) / 2 + 50) + : 0, + [progress] + ) + + const progressFormatted = useMemo( + () => + progress?.[0].phase === 'failed' + ? 'Failed to process video.' + : progress?.[0].phase === 'waiting' + ? 'Waiting...' + : progress?.[0].phase === 'uploading' + ? `Uploading: ${totalProgress}%` + : progress?.[0].phase === 'processing' + ? `Processing: ${totalProgress}%` + : null, + [progress] + ) + + if (asset?.[0]) { + route.push(`/integration/livepeer/vod/${asset[0].id}`) + } + + return ( +
+ {!isLivepeerApiKeySet ? ( +
+ +
+ ) : ( +
+ {!asset && !video ? ( +
+
+ + + + Drop a video or Click to browse +
+ {error?.message &&

{error.message}

} +
+ ) : ( +
+
+ {video &&

{video.name}

} + {progress && totalProgress > 0 && totalProgress < 100 && } + {progressFormatted &&

{progressFormatted}

} +
+
+ )} + + {!asset?.[0].id && ( + + )} +
+ )} +
+ ) +} diff --git a/template/integrations/livepeer/core/livepeer/hooks/use-check-livepeer-api-key.ts b/template/integrations/livepeer/core/livepeer/hooks/use-check-livepeer-api-key.ts new file mode 100644 index 0000000..988da5c --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/hooks/use-check-livepeer-api-key.ts @@ -0,0 +1,57 @@ +export class PermissionError extends Error { + constructor() { + super("API key doesn't have full access to the application.") + } +} + +export class NotFoundError extends Error { + constructor() { + super('Stream not found.') + } +} + +export class FailedToFetchError extends Error { + constructor() { + super("Couldn't fetch data from Livepeer API.") + } +} + +export const useCheckLivepeerApiKey = () => { + const deleteStream = async (apiKey: string, streamId: string) => { + const res = await fetch(`https://livepeer.studio/api/stream/${streamId}`, { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + method: 'DELETE', + }) + + if (!res.ok) { + if (res.status === 404) { + throw new NotFoundError() + } else if (res.status === 403) { + throw new PermissionError() + } + throw new Error(`Error from Livepeer API: ${res.status} ${res.statusText}`) + } + } + + const checkLivepeerApiKey = async (apiKey: string) => { + try { + await deleteStream(apiKey, 'test_api_key_stream') + } catch (e) { + const error = e as Error & { status?: number } + if (e instanceof PermissionError || e instanceof NotFoundError) { + throw e + } else if (error.message === 'Failed to fetch') { + throw new FailedToFetchError() + } else { + throw new Error(`${error.message}`) + } + } + } + + return { + checkLivepeerApiKey, + } +} diff --git a/template/integrations/livepeer/core/livepeer/hooks/use-livepeer-api-key.ts b/template/integrations/livepeer/core/livepeer/hooks/use-livepeer-api-key.ts new file mode 100644 index 0000000..f4a1fad --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/hooks/use-livepeer-api-key.ts @@ -0,0 +1,19 @@ +import { atom, useAtom } from 'jotai' + +import { env } from '@/env.mjs' + +const livepeerApiKeyAtom = atom(undefined) + +export const useLivepeerApiKey = () => { + const [livepeerApiKey, setLivepeerApiKey] = useAtom(livepeerApiKeyAtom) + + return [livepeerApiKey, setLivepeerApiKey] as const +} + +export const useIsLivepeerApiKeySet = () => { + const [livepeerApiKey] = useLivepeerApiKey() + + const envLivepeerApiKey = env.NEXT_PUBLIC_LIVEPEER_API_KEY + + return !!livepeerApiKey || !!envLivepeerApiKey +} diff --git a/template/integrations/livepeer/core/livepeer/livepeer-client.ts b/template/integrations/livepeer/core/livepeer/livepeer-client.ts new file mode 100644 index 0000000..9b93ffe --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/livepeer-client.ts @@ -0,0 +1,9 @@ +import { createReactClient, studioProvider } from '@livepeer/react' + +export function getLivepeerClient(apiKey: string) { + return createReactClient({ + provider: studioProvider({ + apiKey, + }), + }) +} diff --git a/template/integrations/livepeer/core/livepeer/livepeer-provider.tsx b/template/integrations/livepeer/core/livepeer/livepeer-provider.tsx new file mode 100644 index 0000000..c4e0bd7 --- /dev/null +++ b/template/integrations/livepeer/core/livepeer/livepeer-provider.tsx @@ -0,0 +1,33 @@ +import { ReactNode } from 'react' + +import { LivepeerConfig, ThemeConfig } from '@livepeer/react' + +import { env } from '@/env.mjs' + +import { getLivepeerClient } from './livepeer-client' + +const livepeerTheme: ThemeConfig = { + colors: { + accent: '#f9f2c0', + containerBorderColor: '#f9f2c0', + }, + fonts: { + display: 'Inter', + }, +} + +export function LivepeerProvider({ children, customApiKey }: { children: ReactNode; customApiKey?: string }) { + const apiKey = customApiKey ?? env.NEXT_PUBLIC_LIVEPEER_API_KEY ?? 'Initial Key' + + if (!apiKey) { + throw new Error('No Livepeer API key provided') + } + + const livepeerClient = getLivepeerClient(apiKey) + + return ( + + {children} + + ) +} diff --git a/template/integrations/livepeer/pages/livepeer/layout.tsx b/template/integrations/livepeer/pages/livepeer/layout.tsx new file mode 100644 index 0000000..1ddfd25 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/layout.tsx @@ -0,0 +1,69 @@ +'use client' +import { ReactNode } from 'react' + +import { motion } from 'framer-motion' +import { usePathname } from 'next/navigation' +import Balancer from 'react-wrap-balancer' + +import { LinkComponent } from '@/components/shared/link-component' +import { FADE_DOWN_ANIMATION_VARIANTS } from '@/config/design' +import { turboIntegrations } from '@/data/turbo-integrations' +import { useLivepeerApiKey } from '@/integrations/livepeer/hooks/use-livepeer-api-key' +import { LivepeerProvider } from '@/integrations/livepeer/livepeer-provider' +import { cn } from '@/lib/utils' + +const livestreamPath = '/integration/livepeer/livestream' +const videoOnDemandPath = '/integration/livepeer/vod' + +export default function LayoutIntegration({ children }: { children: ReactNode }) { + const pathname = usePathname() + const [livepeerApiKey] = useLivepeerApiKey() + + return ( + + +
+
+ + {turboIntegrations.livepeer.name} + + + {turboIntegrations.livepeer.description} + + + + + + + + + + + + + + +
+
+ +
{children}
+
+
+
+ ) +} diff --git a/template/integrations/livepeer/pages/livepeer/livestream/[streamId]/page.tsx b/template/integrations/livepeer/pages/livepeer/livestream/[streamId]/page.tsx new file mode 100644 index 0000000..535c5d3 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/livestream/[streamId]/page.tsx @@ -0,0 +1,59 @@ +'use client' + +import { useStream } from '@livepeer/react' + +import { LinkComponent } from '@/components/shared/link-component' +import { ButtonShare } from '@/integrations/livepeer/components/button-share' +import { FormLivepeerApiKey } from '@/integrations/livepeer/components/form-livepeer-api-key' +import { PlayerComponent, PlayerType } from '@/integrations/livepeer/components/player' +import { Spinner } from '@/integrations/livepeer/components/spinner' +import { useIsLivepeerApiKeySet } from '@/integrations/livepeer/hooks/use-livepeer-api-key' + +const watchStreamPath = '/integration/livepeer/livestream/watch/' +const streamPath = '/integration/livepeer/livestream/' + +export default function Page({ params }: { params: { streamId: string } }) { + const isLivepeerApiKeySet = useIsLivepeerApiKeySet() + + const SHARE_HREF = streamPath + params.streamId + + const { data: stream, error } = useStream({ + streamId: params.streamId, + }) + + if (error) { + return ( +
+ {!isLivepeerApiKeySet ? ( +
+ +
+ ) : ( + <> +

We are sorry, but your livestream was not found 😓 {/* 😓 = 😓 */}

+

+ Please try again{' '} + + here + +

+ + )} +
+ ) + } + + if (!stream || !stream.playbackId) + return ( +
+ +
+ ) + + return ( + <> + + + + ) +} diff --git a/template/integrations/livepeer/pages/livepeer/livestream/new/browser/page.tsx b/template/integrations/livepeer/pages/livepeer/livestream/new/browser/page.tsx new file mode 100644 index 0000000..8b45c74 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/livestream/new/browser/page.tsx @@ -0,0 +1,5 @@ +import { CreateStream } from '@/integrations/livepeer/components/create-stream' + +export default function PageIntegration() { + return +} diff --git a/template/integrations/livepeer/pages/livepeer/livestream/new/obs/page.tsx b/template/integrations/livepeer/pages/livepeer/livestream/new/obs/page.tsx new file mode 100644 index 0000000..4fab1df --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/livestream/new/obs/page.tsx @@ -0,0 +1,5 @@ +import { CreateStream } from '@/integrations/livepeer/components/create-stream' + +export default function PageIntegration() { + return +} diff --git a/template/integrations/livepeer/pages/livepeer/livestream/new/page.tsx b/template/integrations/livepeer/pages/livepeer/livestream/new/page.tsx new file mode 100644 index 0000000..210b5b4 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/livestream/new/page.tsx @@ -0,0 +1,4 @@ +import { redirect } from 'next/navigation' +export default function PageIntegration() { + redirect('/integration/livepeer/livestream') +} diff --git a/template/integrations/livepeer/pages/livepeer/livestream/page.tsx b/template/integrations/livepeer/pages/livepeer/livestream/page.tsx new file mode 100644 index 0000000..7da2614 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/livestream/page.tsx @@ -0,0 +1,34 @@ +'use client' + +import { LinkComponent } from '@/components/shared/link-component' +import { FormLivepeerApiKey } from '@/integrations/livepeer/components/form-livepeer-api-key' +import { useIsLivepeerApiKeySet } from '@/integrations/livepeer/hooks/use-livepeer-api-key' + +const newStreamObsPath = '/integration/livepeer/livestream/new/obs' +const newStreamBrowserPath = '/integration/livepeer/livestream/new/browser' +const watchStreamPath = '/integration/livepeer/livestream/watch' + +export default function PageIntegration() { + const isLivepeerApiKeySet = useIsLivepeerApiKeySet() + + return ( +
+ {!isLivepeerApiKeySet && } + + + + + + + + + +
+ ) +} diff --git a/template/integrations/livepeer/pages/livepeer/livestream/watch/page.tsx b/template/integrations/livepeer/pages/livepeer/livestream/watch/page.tsx new file mode 100644 index 0000000..f2c6915 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/livestream/watch/page.tsx @@ -0,0 +1,5 @@ +import { FormLivepeerStream } from '@/integrations/livepeer/components/form-livepeer-stream' + +export default function PageIntegration() { + return +} diff --git a/template/integrations/livepeer/pages/livepeer/opengraph-image.tsx b/template/integrations/livepeer/pages/livepeer/opengraph-image.tsx new file mode 100644 index 0000000..6284972 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/opengraph-image.tsx @@ -0,0 +1,9 @@ +import { IntegrationOgImage } from '@/components/ui/social/og-image-integrations' + +export const runtime = 'edge' +export const size = { + width: 1200, + height: 630, +} + +export default IntegrationOgImage('livepeer') diff --git a/template/integrations/livepeer/pages/livepeer/page.tsx b/template/integrations/livepeer/pages/livepeer/page.tsx new file mode 100644 index 0000000..86aa330 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/page.tsx @@ -0,0 +1,5 @@ +import { redirect } from 'next/navigation' + +export default function PageIntegration() { + redirect('/integration/livepeer/vod') +} diff --git a/template/integrations/livepeer/pages/livepeer/twitter-image.tsx b/template/integrations/livepeer/pages/livepeer/twitter-image.tsx new file mode 100644 index 0000000..dbca541 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/twitter-image.tsx @@ -0,0 +1,9 @@ +import Image from './opengraph-image' + +export const runtime = 'edge' +export const size = { + width: 1200, + height: 630, +} + +export default Image diff --git a/template/integrations/livepeer/pages/livepeer/vod/[assetId]/page.tsx b/template/integrations/livepeer/pages/livepeer/vod/[assetId]/page.tsx new file mode 100644 index 0000000..a69fee1 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/vod/[assetId]/page.tsx @@ -0,0 +1,60 @@ +'use client' + +import { useAsset } from '@livepeer/react' + +import { LinkComponent } from '@/components/shared/link-component' +import { ButtonShare } from '@/integrations/livepeer/components/button-share' +import { FormLivepeerApiKey } from '@/integrations/livepeer/components/form-livepeer-api-key' +import { PlayerComponent, PlayerType } from '@/integrations/livepeer/components/player' +import { Spinner } from '@/integrations/livepeer/components/spinner' +import { useIsLivepeerApiKeySet } from '@/integrations/livepeer/hooks/use-livepeer-api-key' + +const watchVideoPath = '/integration/livepeer/vod/watch/' +const videoPath = '/integration/livepeer/vod/' + +export default function Page({ params }: { params: { assetId: string } }) { + const isLivepeerApiKeySet = useIsLivepeerApiKeySet() + + const SHARE_HREF = videoPath + params.assetId + + const { data: asset, error } = useAsset({ + assetId: params.assetId, + }) + + if (error) { + return ( +
+ {!isLivepeerApiKeySet ? ( +
+ +
+ ) : ( + <> +

We are sorry, but your asset was not found 😓 {/* 😓 = 😓 */}

+ +

+ Please try again{' '} + + here + +

+ + )} +
+ ) + } + + if (!asset || !asset.playbackId) + return ( +
+ +
+ ) + + return ( + <> + + + + ) +} diff --git a/template/integrations/livepeer/pages/livepeer/vod/new/page.tsx b/template/integrations/livepeer/pages/livepeer/vod/new/page.tsx new file mode 100644 index 0000000..c9e6398 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/vod/new/page.tsx @@ -0,0 +1,5 @@ +import { UploadFile } from '@/integrations/livepeer/components/upload-file' + +export default function PageIntegration() { + return +} diff --git a/template/integrations/livepeer/pages/livepeer/vod/page.tsx b/template/integrations/livepeer/pages/livepeer/vod/page.tsx new file mode 100644 index 0000000..41eea8b --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/vod/page.tsx @@ -0,0 +1,27 @@ +'use client' + +import { LinkComponent } from '@/components/shared/link-component' +import { FormLivepeerApiKey } from '@/integrations/livepeer/components/form-livepeer-api-key' +import { useIsLivepeerApiKeySet } from '@/integrations/livepeer/hooks/use-livepeer-api-key' + +const newVodPath = '/integration/livepeer/vod/new' +const watchVodPath = '/integration/livepeer/vod/watch' + +export default function PageIntegration() { + const isLivepeerApiKeySet = useIsLivepeerApiKeySet() + return ( +
+ {!isLivepeerApiKeySet && } + + + + + + +
+ ) +} diff --git a/template/integrations/livepeer/pages/livepeer/vod/watch/page.tsx b/template/integrations/livepeer/pages/livepeer/vod/watch/page.tsx new file mode 100644 index 0000000..838c766 --- /dev/null +++ b/template/integrations/livepeer/pages/livepeer/vod/watch/page.tsx @@ -0,0 +1,5 @@ +import { FormLivepeerAsset } from '@/integrations/livepeer/components/form-livepeer-asset' + +export default function Page() { + return +} diff --git a/template/integrations/openai/pages/openai/page.tsx b/template/integrations/openai/pages/openai/page.tsx index df8be03..3857d81 100644 --- a/template/integrations/openai/pages/openai/page.tsx +++ b/template/integrations/openai/pages/openai/page.tsx @@ -35,8 +35,8 @@ export default function PageIntegration() { {turboIntegrations.openai.description} - - + + Documentation diff --git a/template/integrations/pooltogether-v4/pages/pooltogether-v4/layout.tsx b/template/integrations/pooltogether-v4/pages/pooltogether-v4/layout.tsx index 5b29214..8daf28c 100644 --- a/template/integrations/pooltogether-v4/pages/pooltogether-v4/layout.tsx +++ b/template/integrations/pooltogether-v4/pages/pooltogether-v4/layout.tsx @@ -53,16 +53,16 @@ export default function PoolTogetherLayout({ children }: { children: ReactNode } {integrationData.description} - - + + Documentation - - + + Deposit - - + + Withdraw diff --git a/template/integrations/session-keys/pages/session-keys/page.tsx b/template/integrations/session-keys/pages/session-keys/page.tsx index 84d72d7..92e4eb0 100644 --- a/template/integrations/session-keys/pages/session-keys/page.tsx +++ b/template/integrations/session-keys/pages/session-keys/page.tsx @@ -42,8 +42,8 @@ export default function PageIntegration() { {turboIntegrations.sessionKeys.description} - - + + Documentation diff --git a/template/integrations/starter/pages/starter/layout.tsx b/template/integrations/starter/pages/starter/layout.tsx index 3df5ba7..84abc8a 100644 --- a/template/integrations/starter/pages/starter/layout.tsx +++ b/template/integrations/starter/pages/starter/layout.tsx @@ -46,8 +46,8 @@ export default function LayoutIntegration({ children }: { children: ReactNode }) {integrationData.description} - - + + Documentation