From 9c807a96fc4a6289c292a5b3536182922a759ea1 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Wed, 14 Aug 2024 16:30:57 -0300
Subject: [PATCH 001/228] chore: push an extra period to test dns update
---
src/pageComponents/home/Examples/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pageComponents/home/Examples/index.tsx b/src/pageComponents/home/Examples/index.tsx
index c45ff98f..61dd2cc0 100644
--- a/src/pageComponents/home/Examples/index.tsx
+++ b/src/pageComponents/home/Examples/index.tsx
@@ -156,7 +156,7 @@ const Examples: FC> = ({ ...restProps }) => {
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SignButton.SignButton.html',
icon: ,
text: 'Sign a message and get the signature',
- title: 'Sign button',
+ title: 'Sign button.',
},
]
From ed7708477682ebc17d48e592acfda811f1366c68 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 15:36:56 -0300
Subject: [PATCH 002/228] feat: add landing page footer
---
.../Footer/Socials/assets/Github.tsx | 28 +++++++++++
.../Footer/Socials/assets/LinkedIn.tsx | 30 ++++++++++++
.../Footer/Socials/assets/Telegram.tsx | 28 +++++++++++
.../Footer/Socials/assets/Twitter.tsx | 30 ++++++++++++
.../sharedComponents/Footer/Socials/index.tsx | 49 +++++++++++++++++++
.../{Footer.tsx => Footer/index.tsx} | 21 +++++++-
6 files changed, 185 insertions(+), 1 deletion(-)
create mode 100644 src/components/sharedComponents/Footer/Socials/assets/Github.tsx
create mode 100644 src/components/sharedComponents/Footer/Socials/assets/LinkedIn.tsx
create mode 100644 src/components/sharedComponents/Footer/Socials/assets/Telegram.tsx
create mode 100644 src/components/sharedComponents/Footer/Socials/assets/Twitter.tsx
create mode 100644 src/components/sharedComponents/Footer/Socials/index.tsx
rename src/components/sharedComponents/{Footer.tsx => Footer/index.tsx} (61%)
diff --git a/src/components/sharedComponents/Footer/Socials/assets/Github.tsx b/src/components/sharedComponents/Footer/Socials/assets/Github.tsx
new file mode 100644
index 00000000..b1bfb4a6
--- /dev/null
+++ b/src/components/sharedComponents/Footer/Socials/assets/Github.tsx
@@ -0,0 +1,28 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+/**
+ * Github logo component
+ */
+const Github: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Github
diff --git a/src/components/sharedComponents/Footer/Socials/assets/LinkedIn.tsx b/src/components/sharedComponents/Footer/Socials/assets/LinkedIn.tsx
new file mode 100644
index 00000000..39c7632a
--- /dev/null
+++ b/src/components/sharedComponents/Footer/Socials/assets/LinkedIn.tsx
@@ -0,0 +1,30 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+/**
+ * LinkedIn logo component
+ */
+const LinkedIn: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default LinkedIn
diff --git a/src/components/sharedComponents/Footer/Socials/assets/Telegram.tsx b/src/components/sharedComponents/Footer/Socials/assets/Telegram.tsx
new file mode 100644
index 00000000..d1d232d0
--- /dev/null
+++ b/src/components/sharedComponents/Footer/Socials/assets/Telegram.tsx
@@ -0,0 +1,28 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+/**
+ * Telegram logo component
+ */
+const Telegram: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Telegram
diff --git a/src/components/sharedComponents/Footer/Socials/assets/Twitter.tsx b/src/components/sharedComponents/Footer/Socials/assets/Twitter.tsx
new file mode 100644
index 00000000..1395108b
--- /dev/null
+++ b/src/components/sharedComponents/Footer/Socials/assets/Twitter.tsx
@@ -0,0 +1,30 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+/**
+ * Twitter logo component
+ */
+const Twitter: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Twitter
diff --git a/src/components/sharedComponents/Footer/Socials/index.tsx b/src/components/sharedComponents/Footer/Socials/index.tsx
new file mode 100644
index 00000000..7d759bc9
--- /dev/null
+++ b/src/components/sharedComponents/Footer/Socials/index.tsx
@@ -0,0 +1,49 @@
+import { type FC, type HTMLAttributes } from 'react'
+import styled from 'styled-components'
+
+import Github from '@/src/components/sharedComponents/Footer/Socials/assets/Github'
+import LinkedIn from '@/src/components/sharedComponents/Footer/Socials/assets/LinkedIn'
+import Telegram from '@/src/components/sharedComponents/Footer/Socials/assets/Telegram'
+import Twitter from '@/src/components/sharedComponents/Footer/Socials/assets/Twitter'
+
+const Wrapper = styled.div`
+ align-items: center;
+ column-gap: calc(var(--base-gap) * 2);
+ display: flex;
+ justify-content: center;
+`
+
+const Link = styled.a`
+ color: inherit;
+ display: block;
+ text-decoration: none;
+
+ &:active {
+ opacity: 0.8;
+ }
+`
+
+const Socials: FC> = ({ ...restProps }) => {
+ const items = [
+ { label: 'Telegram', icon: , href: 'https://t.me/mgarciap' },
+ { label: 'Github', icon: , href: 'https://github.com/BootNodeDev' },
+ { label: 'Twitter', icon: , href: 'https://twitter.com/bootnodedev' },
+ {
+ label: 'LinkedIn',
+ icon: ,
+ href: 'https://www.linkedin.com/company/bootnode-dev/',
+ },
+ ]
+
+ return (
+
+ {items.map(({ href, icon, label }, index) => (
+
+ {icon}
+
+ ))}
+
+ )
+}
+
+export default Socials
diff --git a/src/components/sharedComponents/Footer.tsx b/src/components/sharedComponents/Footer/index.tsx
similarity index 61%
rename from src/components/sharedComponents/Footer.tsx
rename to src/components/sharedComponents/Footer/index.tsx
index 0bc70cdc..7371429d 100644
--- a/src/components/sharedComponents/Footer.tsx
+++ b/src/components/sharedComponents/Footer/index.tsx
@@ -3,17 +3,34 @@ import styled from 'styled-components'
import { InnerContainer, Footer as BaseFooter, LogoMini, ContainerPadding } from 'db-ui-toolkit'
+import Socials from '@/src/components/sharedComponents/Footer/Socials'
+
export const Wrapper = styled(BaseFooter)`
+ color: var(--theme-footer-text-color);
height: 92px;
- margin-top: calc(var(--base-gap-xl) * 2);
`
const Inner = styled(InnerContainer)`
+ align-items: center;
+ column-gap: calc(var(--base-gap) + var(--base-gap) / 2);
justify-content: center;
${ContainerPadding}
`
+const Line = styled.div`
+ [data-theme='light'] & {
+ background-color: #c5c2cb;
+ }
+
+ [data-theme='dark'] & {
+ background-color: #5f6178;
+ }
+
+ height: 17px;
+ width: 1px;
+`
+
export const Footer: FC = ({ ...restProps }) => {
return (
@@ -26,6 +43,8 @@ export const Footer: FC = ({ ...restProps }) => {
>
+
+
)
From f53df85143c35ae53ac6bcdeaaac2b452fa01eeb Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 15:37:46 -0300
Subject: [PATCH 003/228] feat: add landing page mobile menu
---
.../sharedComponents/MobileMenu.tsx | 216 ++++++++++++++++++
1 file changed, 216 insertions(+)
create mode 100644 src/components/sharedComponents/MobileMenu.tsx
diff --git a/src/components/sharedComponents/MobileMenu.tsx b/src/components/sharedComponents/MobileMenu.tsx
new file mode 100644
index 00000000..12ef682f
--- /dev/null
+++ b/src/components/sharedComponents/MobileMenu.tsx
@@ -0,0 +1,216 @@
+import { useState } from 'react'
+import styled, { css } from 'styled-components'
+
+import { Link } from '@tanstack/react-router'
+import { Logo as BaseLogo, SwitchThemeButton, breakpointMediaQuery } from 'db-ui-toolkit'
+import { useTheme } from 'next-themes'
+
+import { menuItems } from '@/src/constants/menuItems'
+import { ConnectWalletButton } from '@/src/providers/Web3Provider'
+
+const MenuIcon = () => (
+
+
+
+)
+
+const CloseIcon = () => (
+
+
+
+)
+
+const Wrapper = styled.div`
+ --base-mobile-menu-max-width: 375px;
+
+ background-color: var(--theme-dialog-overlay-color);
+ content: '';
+ display: block;
+ height: 100vh;
+ left: 0;
+ position: fixed;
+ top: 0;
+ width: 100vw;
+ z-index: 0;
+ opacity: 1;
+ transition:
+ display var(--base-transition-duration-sm, 0.2s) ease-out allow-discrete,
+ opacity var(--base-transition-duration-sm, 0.2s) ease-out;
+
+ /* Transitions will start in these states */
+ @starting-style {
+ opacity: 0;
+ }
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ display: none;
+ `,
+ )}
+`
+
+const Inner = styled.div`
+ align-items: center;
+ background-color: var(--theme-main-menu-background-color, #f7f7f7);
+ color: var(--theme-main-menu-color, #2e3048);
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+ padding: var(--base-padding-mobile);
+ position: fixed;
+ right: 0;
+ top: 0;
+ width: 100vw;
+ z-index: 10;
+ transition: right var(--base-transition-duration, 0.2s) ease-out;
+
+ /* Transitions will start in these states */
+ @starting-style {
+ right: calc(var(--base-mobile-menu-max-width) * -1);
+ }
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ width: var(--base-mobile-menu-max-width);
+ `,
+ )}
+`
+
+const Header = styled.div`
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 80px;
+ width: 100%;
+`
+
+const Logo = styled(BaseLogo)`
+ width: 140px;
+`
+
+const Button = styled.button`
+ align-items: center;
+ background-color: transparent;
+ border: none;
+ cursor: pointer;
+ display: flex;
+ height: 30px;
+ justify-content: center;
+ padding: 0;
+ width: 30px;
+
+ &:active {
+ opacity: 0.7;
+ }
+`
+
+const MenuButton = styled(Button)`
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ display: none;
+ `,
+ )}
+`
+
+const ConnectButton = styled(ConnectWalletButton)`
+ margin-bottom: 40px;
+ max-width: fit-content;
+`
+
+const MenuItems = styled.nav`
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ row-gap: calc(var(--base-gap) * 3);
+`
+
+const LinkCSS = css`
+ align-items: center;
+ color: var(--theme-main-menu-color, #2e3048);
+ display: flex;
+ flex-direction: column;
+ font-size: 2.1rem;
+ font-weight: 500;
+ line-height: 1.2;
+ row-gap: calc(var(--base-gap) * 3);
+ text-decoration: none;
+
+ &::after {
+ background-color: var(--theme-main-menu-color, #2e3048);
+ border-radius: 2px;
+ content: '';
+ display: block;
+ height: 2px;
+ width: 20px;
+ }
+
+ &:active {
+ opacity: 0.7;
+ }
+`
+
+const Item = styled(Link)`
+ ${LinkCSS}
+`
+
+const ExternalItem = styled.a`
+ ${LinkCSS}
+`
+
+const MobileMenu = ({ ...restProps }) => {
+ const [isOpen, setIsOpen] = useState(false)
+ const { setTheme, theme } = useTheme()
+
+ return isOpen ? (
+
+
+
+
+ setIsOpen(false)}>
+
+
+
+
+
+ {menuItems.map(({ href, label, to }, index) => {
+ const key = `menuItem_${index}`
+
+ return to ? (
+ - setIsOpen(false)} to={to}>
+ {label}
+
+ ) : href ? (
+ setIsOpen(false)}
+ rel="noopener noreferrer"
+ target="_blank"
+ >
+ {label}
+
+ ) : (
+ <>>
+ )
+ })}
+ setTheme(theme === 'light' ? 'dark' : 'light')} />
+
+
+
+ ) : (
+ setIsOpen(true)}>
+
+
+ )
+}
+
+export default MobileMenu
From 07df369b9b88559fad8d642488f92e33207de453 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 15:38:28 -0300
Subject: [PATCH 004/228] feat: add landing page header
---
src/components/sharedComponents/Header.tsx | 43 ++++++++++++++++++++--
1 file changed, 39 insertions(+), 4 deletions(-)
diff --git a/src/components/sharedComponents/Header.tsx b/src/components/sharedComponents/Header.tsx
index 2b2cceeb..0fbaed33 100644
--- a/src/components/sharedComponents/Header.tsx
+++ b/src/components/sharedComponents/Header.tsx
@@ -12,11 +12,16 @@ import {
} from 'db-ui-toolkit'
import { useTheme } from 'next-themes'
+import MainMenu from '@/src/components/sharedComponents/MainMenu'
+import MobileMenu from '@/src/components/sharedComponents/MobileMenu'
import { ConnectWalletButton } from '@/src/providers/Web3Provider'
+/**
+ * Note: you can remove all the custom styles and just use the default Header
+ * component from db-ui-toolkit (or just create your own)
+ */
const Wrapper = styled(BaseHeader)`
- margin-bottom: calc(var(--base-gap-xl) * 2);
- padding-top: var(--base-common-padding-xl);
+ padding-top: var(--base-padding-mobile);
position: relative;
z-index: 10;
@@ -24,6 +29,7 @@ const Wrapper = styled(BaseHeader)`
'desktopStart',
css`
height: var(--base-header-height);
+ padding-top: 14px;
`,
)}
`
@@ -47,16 +53,43 @@ const HomeLink = styled(Link)`
`
const Logo = styled(BaseLogo)`
- min-width: 140px;
+ width: 140px;
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ width: auto;
+ `,
+ )}
+`
+
+const Menu = styled(MainMenu)`
+ display: none;
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ display: flex;
+ justify-content: center;
+ flex: 1;
+ `,
+ )}
`
const End = styled.div`
align-items: center;
column-gap: calc(var(--base-gap));
- display: flex;
+ display: none;
flex: 1;
height: 100%;
justify-content: flex-end;
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ display: flex;
+ `,
+ )}
`
export const Header: FC> = ({ ...restProps }) => {
@@ -70,10 +103,12 @@ export const Header: FC> = ({ ...restProps }) => {
+
setTheme(theme === 'light' ? 'dark' : 'light')} />
+
)
From 906f0626059b013348ddae31c58237f27b7fdf69 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 15:39:05 -0300
Subject: [PATCH 005/228] feat: add landing page header
---
src/components/sharedComponents/MainMenu.tsx | 60 ++++++++++++++++++++
1 file changed, 60 insertions(+)
create mode 100644 src/components/sharedComponents/MainMenu.tsx
diff --git a/src/components/sharedComponents/MainMenu.tsx b/src/components/sharedComponents/MainMenu.tsx
new file mode 100644
index 00000000..997b5611
--- /dev/null
+++ b/src/components/sharedComponents/MainMenu.tsx
@@ -0,0 +1,60 @@
+import styled, { css } from 'styled-components'
+
+import { Link } from '@tanstack/react-router'
+
+import { menuItems } from '@/src/constants/menuItems'
+
+const Wrapper = styled.nav`
+ align-items: center;
+ column-gap: calc(var(--base-gap) * 5);
+ display: flex;
+ height: 100%;
+`
+
+const LinkCSS = css`
+ color: var(--theme-main-menu-item-color);
+ font-size: 1.6rem;
+ font-weight: 500;
+ line-height: 1.2;
+ text-decoration: none;
+
+ &:hover {
+ text-decoration: underline;
+ }
+
+ &:active {
+ opacity: 0.7;
+ }
+`
+
+const Item = styled(Link)`
+ ${LinkCSS}
+`
+
+const ExternalItem = styled.a`
+ ${LinkCSS}
+`
+
+const MainMenu = ({ ...restProps }) => {
+ return (
+
+ {menuItems.map(({ href, label, to }, index) => {
+ const key = `menuItem_${index}`
+
+ return to ? (
+ -
+ {label}
+
+ ) : href ? (
+
+ {label}
+
+ ) : (
+ <>>
+ )
+ })}
+
+ )
+}
+
+export default MainMenu
From b32711c298cd827e07979b8e9ce97c5d2aed933f Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 15:40:44 -0300
Subject: [PATCH 006/228] feat: add welcome page
---
.../pageComponents/home/Welcome/ButtonCSS.tsx | 22 +++
.../Welcome/Clouds/assets/img-clouds-dark.svg | 1 +
.../Clouds/assets/img-clouds-light.svg | 1 +
.../home/Welcome/Clouds/index.tsx | 49 +++++
.../home/Welcome/DocsButton.tsx | 33 ++++
.../Welcome/Ghost/assets/img-ghost-dark.svg | 1 +
.../Welcome/Ghost/assets/img-ghost-light.svg | 1 +
.../home/Welcome/Ghost/index.tsx | 19 ++
.../pageComponents/home/Welcome/GitClone.tsx | 102 +++++++++++
.../home/Welcome/GithubButton.tsx | 33 ++++
.../pageComponents/home/Welcome/index.tsx | 173 ++++++++++++++++++
11 files changed, 435 insertions(+)
create mode 100644 src/components/pageComponents/home/Welcome/ButtonCSS.tsx
create mode 100644 src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-dark.svg
create mode 100644 src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-light.svg
create mode 100644 src/components/pageComponents/home/Welcome/Clouds/index.tsx
create mode 100644 src/components/pageComponents/home/Welcome/DocsButton.tsx
create mode 100644 src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-dark.svg
create mode 100644 src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-light.svg
create mode 100644 src/components/pageComponents/home/Welcome/Ghost/index.tsx
create mode 100644 src/components/pageComponents/home/Welcome/GitClone.tsx
create mode 100644 src/components/pageComponents/home/Welcome/GithubButton.tsx
create mode 100644 src/components/pageComponents/home/Welcome/index.tsx
diff --git a/src/components/pageComponents/home/Welcome/ButtonCSS.tsx b/src/components/pageComponents/home/Welcome/ButtonCSS.tsx
new file mode 100644
index 00000000..18f5cf66
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/ButtonCSS.tsx
@@ -0,0 +1,22 @@
+import { css } from 'styled-components'
+
+import { breakpointMediaQuery } from 'db-ui-toolkit'
+
+export const ButtonCSS = css`
+ column-gap: calc(var(--base-gap) * 2);
+ font-size: 1.8rem;
+ height: 50px;
+ padding-left: var(--base-common-padding-xl);
+ padding-right: var(--base-common-padding-xl);
+ min-width: 132px;
+ justify-content: start;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ min-width: 156px;
+ padding-left: calc(var(--base-common-padding-xl) * 2);
+ padding-right: calc(var(--base-common-padding-xl) * 2);
+ `,
+ )}
+`
diff --git a/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-dark.svg b/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-dark.svg
new file mode 100644
index 00000000..5077f657
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-light.svg b/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-light.svg
new file mode 100644
index 00000000..08107b49
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/pageComponents/home/Welcome/Clouds/index.tsx b/src/components/pageComponents/home/Welcome/Clouds/index.tsx
new file mode 100644
index 00000000..53e9619e
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/Clouds/index.tsx
@@ -0,0 +1,49 @@
+import styled, { css } from 'styled-components'
+
+import { breakpointMediaQuery } from 'db-ui-toolkit'
+
+import ImgCloudsDark from '@/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-dark.svg'
+import ImgCloudsLight from '@/src/components/pageComponents/home/Welcome/Clouds/assets/img-clouds-light.svg'
+
+const Clouds = styled.img`
+ display: none;
+ flex-grow: 0;
+ flex-shrink: 0;
+ min-height: 306px;
+ min-width: calc(100vw + 400px);
+ object-fit: contain;
+ object-position: center bottom;
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ min-width: fit-content;
+ object-fit: cover;
+ object-position: center;
+ `,
+ )}
+`
+
+Clouds.defaultProps = {
+ alt: '',
+}
+
+export const DarkClouds = styled(Clouds)`
+ [data-theme='dark'] & {
+ display: block;
+ }
+`
+
+DarkClouds.defaultProps = {
+ src: ImgCloudsDark,
+}
+
+export const LightClouds = styled(Clouds)`
+ [data-theme='light'] & {
+ display: block;
+ }
+`
+
+LightClouds.defaultProps = {
+ src: ImgCloudsLight,
+}
diff --git a/src/components/pageComponents/home/Welcome/DocsButton.tsx b/src/components/pageComponents/home/Welcome/DocsButton.tsx
new file mode 100644
index 00000000..03c35f10
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/DocsButton.tsx
@@ -0,0 +1,33 @@
+import styled from 'styled-components'
+
+import { ButtonCSS } from '@/src/components/pageComponents/home/Welcome/ButtonCSS'
+import { SecondaryButton } from '@/src/components/sharedComponents/Buttons'
+
+const Icon = () => (
+
+
+
+)
+
+const Wrapper = styled(SecondaryButton)`
+ ${ButtonCSS}
+`
+
+const DocsButton = ({ ...restProps }) => {
+ return (
+
+
+ Docs
+
+ )
+}
+
+export default DocsButton
diff --git a/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-dark.svg b/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-dark.svg
new file mode 100644
index 00000000..1bcca592
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-light.svg b/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-light.svg
new file mode 100644
index 00000000..85239e41
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/pageComponents/home/Welcome/Ghost/index.tsx b/src/components/pageComponents/home/Welcome/Ghost/index.tsx
new file mode 100644
index 00000000..99f2a0c6
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/Ghost/index.tsx
@@ -0,0 +1,19 @@
+import styled from 'styled-components'
+
+import ImgGhostDark from '@/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-dark.svg'
+import ImgGhostLight from '@/src/components/pageComponents/home/Welcome/Ghost/assets/img-ghost-light.svg'
+
+const Ghost = styled.img`
+ --ghost-image: url(${ImgGhostLight});
+
+ [data-theme='dark'] & {
+ --ghost-image: url(${ImgGhostDark});
+ }
+
+ content: var(--ghost-image);
+ object-fit: none;
+ flex-grow: 0;
+ flex-shrink: 0;
+`
+
+export default Ghost
diff --git a/src/components/pageComponents/home/Welcome/GitClone.tsx b/src/components/pageComponents/home/Welcome/GitClone.tsx
new file mode 100644
index 00000000..e28bb373
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/GitClone.tsx
@@ -0,0 +1,102 @@
+import { useState } from 'react'
+import styled from 'styled-components'
+
+import { Toast, CopyButton } from 'db-ui-toolkit'
+import { toast } from 'react-hot-toast'
+
+const CopyIcon = () => (
+
+
+
+
+)
+
+const OkIcon = () => (
+
+
+
+)
+
+const Wrapper = styled.section`
+ [data-theme='light'] & {
+ --git-clone-background-color: #e2e0e7;
+ }
+
+ [data-theme='dark'] & {
+ --git-clone-background-color: #292b43;
+ }
+
+ align-items: center;
+ background-color: var(--git-clone-background-color);
+ border-radius: 80px;
+ column-gap: calc(var(--base-gap) * 2);
+ display: flex;
+ height: 50px;
+ max-width: 100%;
+ padding: 0 calc(var(--base-gap) * 3);
+`
+
+const Value = styled.span`
+ flex-shrink: 1;
+ font-size: 1.6rem;
+ line-height: 1.2;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+`
+
+const IconWrapper = styled.div`
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 17px;
+`
+
+const GitClone = ({ ...restProps }) => {
+ const [copied, setCopied] = useState(false)
+ const cloneString = 'git clone git@github.com:BootNodeDev/dAppBooster.git'
+
+ const handleCopy = () => {
+ const timeDelay = 2500
+ toast.custom(Copied to the clipboard! , {
+ duration: timeDelay,
+ position: 'top-center',
+ id: 'copy-to-clipboard',
+ })
+ setCopied(true)
+ setTimeout(() => {
+ setCopied(false)
+ }, 3000)
+ }
+
+ return (
+
+ {cloneString}
+
+
+ {copied ? : }
+
+
+
+ )
+}
+
+export default GitClone
diff --git a/src/components/pageComponents/home/Welcome/GithubButton.tsx b/src/components/pageComponents/home/Welcome/GithubButton.tsx
new file mode 100644
index 00000000..f95a8815
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/GithubButton.tsx
@@ -0,0 +1,33 @@
+import styled from 'styled-components'
+
+import { ButtonCSS } from '@/src/components/pageComponents/home/Welcome/ButtonCSS'
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+
+const Icon = () => (
+
+
+
+)
+
+const Wrapper = styled(PrimaryButton)`
+ ${ButtonCSS}
+`
+
+const GithubButton = ({ ...restProps }) => {
+ return (
+
+
+ Github
+
+ )
+}
+
+export default GithubButton
diff --git a/src/components/pageComponents/home/Welcome/index.tsx b/src/components/pageComponents/home/Welcome/index.tsx
new file mode 100644
index 00000000..298ff6f8
--- /dev/null
+++ b/src/components/pageComponents/home/Welcome/index.tsx
@@ -0,0 +1,173 @@
+import { type FC, type HTMLAttributes } from 'react'
+import styled, { css } from 'styled-components'
+
+import {
+ Title as BasetTitle,
+ Text as BaseText,
+ InnerContainer as Inner,
+ ContainerPadding,
+ breakpointMediaQuery,
+} from 'db-ui-toolkit'
+
+import { LightClouds, DarkClouds } from '@/src/components/pageComponents/home/Welcome/Clouds'
+import DocsButton from '@/src/components/pageComponents/home/Welcome/DocsButton'
+import BaseGhost from '@/src/components/pageComponents/home/Welcome/Ghost'
+import GitClone from '@/src/components/pageComponents/home/Welcome/GitClone'
+import GithubButton from '@/src/components/pageComponents/home/Welcome/GithubButton'
+
+const Wrapper = styled.section`
+ [data-theme='light'] & {
+ --landing-page-main-background-color: #f7f7f7;
+ }
+
+ [data-theme='dark'] & {
+ --landing-page-main-background-color: #2e3048;
+ }
+
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ z-index: 0;
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ min-height: 100vh;
+ `,
+ )}
+`
+
+const Clouds = styled.div`
+ display: flex;
+ justify-content: center;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+
+ &::before,
+ &::after {
+ content: '';
+ background-color: var(--landing-page-main-background-color);
+ display: block;
+ flex-grow: 1;
+ flex-shrink: 1;
+ min-width: 0;
+ }
+`
+
+const Ghost = styled(BaseGhost)`
+ bottom: -5px;
+ height: 191px;
+ left: 50%;
+ object-fit: cover;
+ position: absolute;
+ transform: translateX(-50%);
+ width: 100px;
+ z-index: 1;
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ bottom: 70px;
+ height: auto;
+ object-fit: none;
+ width: auto;
+ `,
+ )}
+`
+
+const Contents = styled.div`
+ flex-grow: 1;
+ background-color: var(--landing-page-main-background-color);
+`
+
+const InnerContainer = styled(Inner)`
+ align-items: center;
+ flex-direction: column;
+
+ ${ContainerPadding}
+`
+
+const Title = styled(BasetTitle)`
+ font-size: 3.2rem;
+ font-weight: 800;
+ line-height: 1.2;
+ margin-bottom: var(--base-gap);
+ text-align: center;
+ padding-top: calc(var(--base-common-padding-xl) * 2);
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ font-size: 4.8rem;
+ padding-top: 0;
+ `,
+ )}
+`
+
+const Text = styled(BaseText)`
+ font-size: 1.6rem;
+ line-height: 1.5;
+ margin-bottom: calc(var(--base-gap) * 4);
+ text-align: center;
+
+ br {
+ display: none;
+ }
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ br {
+ display: block;
+ }
+ `,
+ )}
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ font-size: 1.8rem;
+ `,
+ )}
+`
+
+const Buttons = styled.div`
+ display: flex;
+ gap: calc(var(--base-gap) + var(--base-gap) / 2);
+ justify-content: center;
+ margin-bottom: calc(var(--base-gap) * 4);
+`
+
+const Welcome: FC> = ({ ...restProps }) => {
+ return (
+
+
+
+
+
+
+
+
+
+ Boost dApp
+
+ development on the
+ blockchain
+
+
+ A modern blockchain boilerplate built to quickly get
+ you started with your next project.
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Welcome
From 610bf74a21929e432c1a66b53b0edca772e82c91 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 15:41:16 -0300
Subject: [PATCH 007/228] feat: add home demos
---
.../home/Examples/Item/Badge.tsx | 24 ++
.../Examples/Item/DocumentationButton.tsx | 58 ++++
.../home/Examples/Item/index.tsx | 155 +++++++++++
.../pageComponents/home/Examples/List.tsx | 76 ++++++
.../home/Examples/assets/Avatar.tsx | 25 ++
.../home/Examples/assets/Ens.tsx | 25 ++
.../home/Examples/assets/Hash.tsx | 25 ++
.../home/Examples/assets/IPFSImage.tsx | 25 ++
.../home/Examples/assets/InputAddress.tsx | 25 ++
.../home/Examples/assets/Sign.tsx | 25 ++
.../home/Examples/assets/Subgraph.tsx | 25 ++
.../home/Examples/assets/SubgraphStatus.tsx | 25 ++
.../home/Examples/assets/Switch.tsx | 25 ++
.../home/Examples/assets/TokenInput.tsx | 25 ++
.../home/Examples/assets/TokenList.tsx | 25 ++
.../home/Examples/assets/Transaction.tsx | 25 ++
.../home/Examples/assets/UserCheck.tsx | 32 +++
.../home/Examples/assets/Wallet.tsx | 25 ++
.../home/Examples/demos/AvatarDemo.test.tsx | 52 ++++
.../home/Examples/demos/AvatarDemo.tsx | 29 ++
.../ERC20ApproveAndTransferButton.tsx | 101 +++++++
.../index.tsx | 131 +++++++++
.../home/Examples/demos/EnsNameDemo.tsx | 116 ++++++++
.../home/Examples/demos/HashDemo.tsx | 66 +++++
.../home/Examples/demos/HashInputDemo.tsx | 165 ++++++++++++
.../home/Examples/demos/SignMessageDemo.tsx | 97 +++++++
.../home/Examples/demos/SubgraphDemo/List.tsx | 249 ++++++++++++++++++
.../Examples/demos/SubgraphDemo/index.tsx | 30 +++
.../demos/SubgraphStatusDemo/List.tsx | 185 +++++++++++++
.../demos/SubgraphStatusDemo/index.tsx | 31 +++
.../home/Examples/demos/SwitchNetworkDemo.tsx | 36 +++
.../home/Examples/demos/TokenDropdownDemo.tsx | 16 ++
.../home/Examples/demos/TokenInputDemo.tsx | 87 ++++++
.../Examples/demos/TransactionButtonDemo.tsx | 113 ++++++++
.../home/Examples/demos/assets/Arbitrum.tsx | 47 ++++
.../home/Examples/demos/assets/Base.tsx | 20 ++
.../home/Examples/demos/assets/Eth.tsx | 46 ++++
.../home/Examples/demos/assets/Optimism.tsx | 32 +++
.../home/Examples/demos/assets/Polygon.tsx | 25 ++
.../pageComponents/home/Examples/index.tsx | 179 +++++++++++++
40 files changed, 2523 insertions(+)
create mode 100644 src/components/pageComponents/home/Examples/Item/Badge.tsx
create mode 100644 src/components/pageComponents/home/Examples/Item/DocumentationButton.tsx
create mode 100644 src/components/pageComponents/home/Examples/Item/index.tsx
create mode 100644 src/components/pageComponents/home/Examples/List.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Avatar.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Ens.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Hash.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/IPFSImage.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/InputAddress.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Sign.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Subgraph.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/SubgraphStatus.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Switch.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/TokenInput.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/TokenList.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Transaction.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/UserCheck.tsx
create mode 100644 src/components/pageComponents/home/Examples/assets/Wallet.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/index.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/HashDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/TokenDropdownDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/TransactionButtonDemo.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/assets/Arbitrum.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/assets/Base.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/assets/Eth.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/assets/Optimism.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/assets/Polygon.tsx
create mode 100644 src/components/pageComponents/home/Examples/index.tsx
diff --git a/src/components/pageComponents/home/Examples/Item/Badge.tsx b/src/components/pageComponents/home/Examples/Item/Badge.tsx
new file mode 100644
index 00000000..0425cd25
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/Item/Badge.tsx
@@ -0,0 +1,24 @@
+import styled from 'styled-components'
+
+const Badge = styled.div.attrs({ children: <>Demo> })`
+ [data-theme='light'] & {
+ --theme-examples-badge-background-color: #2e3048;
+ }
+
+ [data-theme='dark'] & {
+ --theme-examples-badge-background-color: #4b4d60;
+ }
+
+ align-items: center;
+ background-color: var(--theme-examples-badge-background-color);
+ border-radius: var(--base-border-radius-sm);
+ color: #fff;
+ display: flex;
+ font-size: 1.2rem;
+ font-weight: 500;
+ height: 20px;
+ line-height: 1;
+ padding: 0 var(--base-common-padding);
+`
+
+export default Badge
diff --git a/src/components/pageComponents/home/Examples/Item/DocumentationButton.tsx b/src/components/pageComponents/home/Examples/Item/DocumentationButton.tsx
new file mode 100644
index 00000000..3a235625
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/Item/DocumentationButton.tsx
@@ -0,0 +1,58 @@
+import styled from 'styled-components'
+
+import { Button } from 'db-ui-toolkit'
+
+const Icon = () => (
+
+
+
+)
+
+const DocumentationButton = styled(Button).attrs({
+ $variant: 'documentation',
+ children: (
+ <>
+ Documentation
+ >
+ ),
+})`
+ [data-theme='light'] & {
+ --theme-button-documentation-background-color: transparent;
+ --theme-button-documentation-background-color-hover: transparent;
+
+ --theme-button-documentation-border-color: #e2e0e7;
+ --theme-button-documentation-border-color-hover: #4b4d60;
+
+ --theme-button-documentation-color: #4b4d60;
+ --theme-button-documentation-color-hover: #4b4d60;
+
+ --theme-button-documentation-background-color-disabled: transparent;
+ --theme-button-documentation-border-color-disabled: #e2e0e7;
+ --theme-button-documentation-color-disabled: #4b4d60;
+ }
+
+ [data-theme='dark'] & {
+ --theme-button-documentation-background-color: transparent;
+ --theme-button-documentation-background-color-hover: transparent;
+
+ --theme-button-documentation-border-color: #c5c2cb;
+ --theme-button-documentation-border-color-hover: #fff;
+
+ --theme-button-documentation-color: #c5c2cb;
+ --theme-button-documentation-color-hover: #fff;
+
+ --theme-button-documentation-background-color-disabled: transparent;
+ --theme-button-documentation-border-color-disabled: #c5c2cb;
+ --theme-button-documentation-color-disabled: #c5c2cb;
+ }
+
+ font-size: 1.4rem;
+ font-weight: 500;
+ height: 43px;
+ max-width: fit-content;
+`
+
+export default DocumentationButton
diff --git a/src/components/pageComponents/home/Examples/Item/index.tsx b/src/components/pageComponents/home/Examples/Item/index.tsx
new file mode 100644
index 00000000..a324a5ae
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/Item/index.tsx
@@ -0,0 +1,155 @@
+import { type FC, type HTMLAttributes, type ReactNode } from 'react'
+import styled, { css } from 'styled-components'
+
+import { breakpointMediaQuery } from 'db-ui-toolkit'
+
+import BaseBadge from '@/src/components/pageComponents/home/Examples/Item/Badge'
+import DocumentationButton from '@/src/components/pageComponents/home/Examples/Item/DocumentationButton'
+
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-examples-item-background-color: #f7f7f7;
+ }
+
+ [data-theme='dark'] & {
+ --theme-examples-item-background-color: #2e3048;
+ }
+
+ background-color: var(--theme-examples-item-background-color);
+ border-radius: var(--base-border-radius);
+ display: flex;
+ flex-direction: column;
+ row-gap: calc(var(--base-gap-xl) + var(--base-gap));
+ max-width: 100%;
+ padding: calc(var(--base-common-padding-xl) * 2) var(--base-common-padding-xl)
+ var(--base-common-padding-xl);
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ column-gap: var(--base-gap-xl);
+ flex-direction: row;
+ padding: var(--base-common-padding-xl) var(--base-common-padding-xl)
+ var(--base-common-padding-xl) calc(var(--base-common-padding-xl) * 2);
+ `,
+ )};
+`
+
+const Info = styled.div`
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ row-gap: var(--base-gap-xl);
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ align-items: flex-start;
+ padding: var(--base-common-padding-xl) 0 0;
+ `,
+ )};
+`
+
+const Icon = styled.div`
+ --icon-size: 40px;
+
+ align-items: center;
+ background-color: var(--theme-color-primary);
+ border-radius: 50%;
+ color: #fff;
+ display: flex;
+ height: var(--icon-size);
+ justify-content: center;
+ width: var(--icon-size);
+`
+
+const Title = styled.h2`
+ color: var(--theme-color-text-primary);
+ font-size: 2.4rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+ text-align: center;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ text-align: left;
+ `,
+ )};
+`
+
+const Text = styled.p`
+ color: var(--theme-color-text-primary);
+ font-size: 1.6rem;
+ font-weight: 500;
+ line-height: 1.5;
+ margin: 0;
+ text-align: center;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ text-align: left;
+ `,
+ )};
+`
+
+const Demo = styled.div`
+ align-items: center;
+ background-color: var(--theme-examples-list-background-color);
+ border-radius: var(--base-border-radius);
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ justify-content: center;
+ min-width: 0;
+ padding: calc(var(--base-common-padding) * 6) var(--base-common-padding)
+ calc(var(--base-common-padding) * 4);
+ position: relative;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ min-height: 205px;
+ padding: calc(var(--base-common-padding) * 6) calc(var(--base-common-padding) * 3)
+ calc(var(--base-common-padding) * 3);
+ `,
+ )};
+`
+
+const Badge = styled(BaseBadge)`
+ --badge-gap: calc(var(--base-gap) + var(--base-gap-sm));
+
+ left: var(--badge-gap);
+ position: absolute;
+ top: var(--badge-gap);
+`
+
+export interface Props extends HTMLAttributes {
+ demo: ReactNode
+ href?: string
+ icon: ReactNode
+ text: string
+ title: string
+}
+
+const Item: FC = ({ demo, href, icon, text, title, ...restProps }) => {
+ return (
+
+
+ {icon}
+ {title}
+ {text}
+ {href && }
+
+
+
+ {demo}
+
+
+ )
+}
+
+export default Item
diff --git a/src/components/pageComponents/home/Examples/List.tsx b/src/components/pageComponents/home/Examples/List.tsx
new file mode 100644
index 00000000..98365a0e
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/List.tsx
@@ -0,0 +1,76 @@
+import { type FC, type HTMLAttributes } from 'react'
+import styled, { css } from 'styled-components'
+
+import { breakpointMediaQuery } from 'db-ui-toolkit'
+
+import Item, { type Props as ItemProps } from '@/src/components/pageComponents/home/Examples/Item'
+
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-examples-list-background-color: #e2e0e766;
+ }
+
+ [data-theme='dark'] & {
+ --theme-examples-list-background-color: #292b43;
+ }
+
+ align-items: center;
+ background-color: var(--theme-examples-list-background-color);
+ border-radius: var(--base-border-radius-xl);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ padding: calc(var(--base-common-padding-xl) * 2) var(--base-common-padding);
+ row-gap: calc(var(--base-gap-xl) * 2);
+ width: 1066px;
+
+ ${breakpointMediaQuery(
+ 'tabletLandscapeStart',
+ css`
+ padding: calc(var(--base-common-padding) * 7);
+ row-gap: calc(var(--base-gap) * 5);
+ `,
+ )}
+`
+
+const Title = styled.h2`
+ color: var(--theme-color-text-primary);
+ font-size: 2.1rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+
+ ${breakpointMediaQuery(
+ 'tabletLandscapeStart',
+ css`
+ font-size: 3.6rem;
+ `,
+ )}
+`
+
+const Items = styled.div`
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ row-gap: calc(var(--base-gap) * 2);
+ width: 100%;
+`
+
+interface Props extends HTMLAttributes {
+ items: ItemProps[]
+}
+
+const List: FC = ({ items, ...restProps }) => {
+ return (
+
+ Built-in Features
+
+ {items.map((item) => (
+
+ ))}
+
+
+ )
+}
+
+export default List
diff --git a/src/components/pageComponents/home/Examples/assets/Avatar.tsx b/src/components/pageComponents/home/Examples/assets/Avatar.tsx
new file mode 100644
index 00000000..8c06dcbb
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Avatar.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/Ens.tsx b/src/components/pageComponents/home/Examples/assets/Ens.tsx
new file mode 100644
index 00000000..3319a31f
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Ens.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/Hash.tsx b/src/components/pageComponents/home/Examples/assets/Hash.tsx
new file mode 100644
index 00000000..fb930639
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Hash.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/IPFSImage.tsx b/src/components/pageComponents/home/Examples/assets/IPFSImage.tsx
new file mode 100644
index 00000000..23cda9d7
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/IPFSImage.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/InputAddress.tsx b/src/components/pageComponents/home/Examples/assets/InputAddress.tsx
new file mode 100644
index 00000000..f926f7ad
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/InputAddress.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/Sign.tsx b/src/components/pageComponents/home/Examples/assets/Sign.tsx
new file mode 100644
index 00000000..c891b586
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Sign.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/Subgraph.tsx b/src/components/pageComponents/home/Examples/assets/Subgraph.tsx
new file mode 100644
index 00000000..e65356f4
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Subgraph.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/SubgraphStatus.tsx b/src/components/pageComponents/home/Examples/assets/SubgraphStatus.tsx
new file mode 100644
index 00000000..63d0992a
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/SubgraphStatus.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/Switch.tsx b/src/components/pageComponents/home/Examples/assets/Switch.tsx
new file mode 100644
index 00000000..b3ed0195
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Switch.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/TokenInput.tsx b/src/components/pageComponents/home/Examples/assets/TokenInput.tsx
new file mode 100644
index 00000000..6d0b0b1e
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/TokenInput.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/TokenList.tsx b/src/components/pageComponents/home/Examples/assets/TokenList.tsx
new file mode 100644
index 00000000..796eccdc
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/TokenList.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/Transaction.tsx b/src/components/pageComponents/home/Examples/assets/Transaction.tsx
new file mode 100644
index 00000000..acde3b47
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Transaction.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/UserCheck.tsx b/src/components/pageComponents/home/Examples/assets/UserCheck.tsx
new file mode 100644
index 00000000..1640bdf5
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/UserCheck.tsx
@@ -0,0 +1,32 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+
+
+
+
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/Wallet.tsx b/src/components/pageComponents/home/Examples/assets/Wallet.tsx
new file mode 100644
index 00000000..9db6e51e
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Wallet.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx b/src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx
new file mode 100644
index 00000000..00d9df94
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx
@@ -0,0 +1,52 @@
+import { render, screen } from '@testing-library/react'
+import { type Mock, describe, expect, it, vi } from 'vitest'
+import { useEnsName, useEnsAvatar } from 'wagmi'
+
+import Avatar from '@/src/components/pageComponents/home/Examples/demos/AvatarDemo'
+
+// Mock wagmi hooks
+vi.mock('wagmi', () => ({
+ useEnsName: vi.fn(),
+ useEnsAvatar: vi.fn(),
+}))
+
+const mockSize = 50
+const mockAddress = '0x1234567890abcdef1234567890abcdef12345678'
+const mockEnsName = 'test.eth'
+const mockAvatarImg = 'avatar.png'
+
+describe('Avatar Component', () => {
+ it('renders CustomAvatar with ensName and avatarImg', () => {
+ // Mock the hook return values
+ ;(useEnsName as Mock).mockReturnValue({ data: mockEnsName })
+ ;(useEnsAvatar as Mock).mockReturnValue({ data: mockAvatarImg })
+
+ render( )
+
+ expect(screen.getByAltText(mockEnsName)).toBeInTheDocument()
+ const img = screen.getByRole('img')
+ expect(img).toHaveAttribute('src', mockAvatarImg)
+
+ // Expect the image to have the correct size
+ expect(img.parentElement).toHaveStyle({
+ width: `${mockSize}px`,
+ height: `${mockSize}px`,
+ })
+ })
+
+ it('renders Jazzicon (without ensAvatar image)', () => {
+ ;(useEnsName as Mock).mockReturnValue({ data: mockEnsName })
+ ;(useEnsAvatar as Mock).mockReturnValue({ data: undefined })
+
+ render( )
+
+ // Expect Jazzicon to be rendered
+ expect(screen.getByTestId('avatar-icon')).toBeInTheDocument()
+
+ // Expect the icon to have the correct size
+ expect(screen.getByTestId('avatar-icon').parentElement).toHaveStyle({
+ width: `${mockSize}px`,
+ height: `${mockSize}px`,
+ })
+ })
+})
diff --git a/src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx b/src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx
new file mode 100644
index 00000000..b814b60f
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx
@@ -0,0 +1,29 @@
+import { type Address } from 'viem'
+import { normalize } from 'viem/ens'
+import { useEnsName, useEnsAvatar } from 'wagmi'
+
+import BaseAvatar from '@/src/components/sharedComponents/Avatar'
+
+interface Props {
+ address: Address
+ size: number
+}
+
+/**
+ * Avatar component using wagmi hooks to fetch ENS name and avatar image for the provided address.
+ *
+ * @param {string} props.address - The address
+ * @param {number} props.size - The size of the avatar
+ * @example
+ */
+const AvatarDemo = ({ address, size }: Props) => {
+ const { data: ensName } = useEnsName({ address })
+
+ const { data: avatarImg } = useEnsAvatar({
+ name: ensName ? normalize(ensName) : undefined,
+ })
+
+ return
+}
+
+export default AvatarDemo
diff --git a/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx b/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
new file mode 100644
index 00000000..a087b4b1
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
@@ -0,0 +1,101 @@
+import { type FC } from 'react'
+import styled from 'styled-components'
+
+import { type Address, type TransactionReceipt, type Hash, erc20Abi } from 'viem'
+import { useWriteContract } from 'wagmi'
+
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
+import { useSuspenseReadErc20Allowance } from '@/src/hooks/generated'
+import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
+import { type Token } from '@/src/types/token'
+
+const Button = styled(PrimaryButton).attrs({ as: TransactionButton })`
+ font-size: 1.6rem;
+ font-weight: 500;
+ height: 48px;
+ padding-left: calc(var(--base-common-padding) * 3);
+ padding-right: calc(var(--base-common-padding) * 3);
+`
+
+interface Props {
+ amount: bigint
+ disabled?: boolean
+ label?: string
+ labelSending?: string
+ onSuccess?: (receipt: TransactionReceipt) => void
+ spender: Address
+ token: Token
+ transaction: () => Promise
+}
+
+/**
+ * Dynamically renders either an approval button or a transaction button based on the user's current token allowance.
+ * After the approval, the transaction button will be rendered.
+ *
+ * @dev Use with to add an skeleton loader while fetching the allowance.
+ *
+ * @param {Props}
+ * @param {Token} props.token - The token to be approved.
+ * @param {Address} props.spender - The address of the spender to be approved.
+ * @param {bigint} props.amount - The amount of tokens to approve (or send).
+ * @param {Function} props.onMined - The callback function to be called when transaction is mined.
+ * @param {boolean} props.disabled - The flag to disable the button.
+ * @param {Function} props.transaction - The transaction function that send after approval.
+ * @param {string} props.label - The label for the button.
+ * @param {string} props.labelSending - The label for the button when the transaction is pending.
+ *
+ */
+const ERC20ApproveAndTransferButton: FC = ({
+ amount,
+ disabled,
+ label,
+ labelSending,
+ onSuccess,
+ spender,
+ token,
+ transaction,
+}) => {
+ const { address } = useWeb3StatusConnected()
+ const { writeContractAsync } = useWriteContract()
+
+ const { data: allowance, refetch: getAllowance } = useSuspenseReadErc20Allowance({
+ address: token.address as Address, // TODO: token.address should be Address type
+ args: [address, spender],
+ })
+
+ const isApprovalRequired = allowance < amount
+
+ const handleApprove = () => {
+ return writeContractAsync({
+ abi: erc20Abi,
+ address: token.address as Address,
+ functionName: 'approve',
+ args: [spender, amount],
+ })
+ }
+
+ return isApprovalRequired ? (
+ getAllowance()}
+ transaction={handleApprove}
+ >
+ Approve {token.symbol}
+
+ ) : (
+
+ {label}
+
+ )
+}
+
+export default ERC20ApproveAndTransferButton
diff --git a/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/index.tsx
new file mode 100644
index 00000000..c9fef087
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/index.tsx
@@ -0,0 +1,131 @@
+import styled, { css } from 'styled-components'
+
+import { ExternalLink, Text, useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+import { type Address, formatUnits } from 'viem'
+import { sepolia } from 'viem/chains'
+import { useWriteContract } from 'wagmi'
+
+import ERC20ApproveAndTransferButton from '@/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton'
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
+import { useSuspenseReadErc20BalanceOf } from '@/src/hooks/generated'
+import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
+import { type Token } from '@/src/types/token'
+import { formatNumberOrString, NumberType } from '@/src/utils/numberFormat'
+import { withSuspense } from '@/src/utils/suspenseWrapper'
+
+const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
+ ${({ status }) =>
+ status === 'ok' &&
+ css`
+ --theme-general-message-icon-color: var(--theme-color-ok);
+ `}
+`
+
+// USDC token on sepolia chain
+const tokenUSDC_sepolia: Token = {
+ address: '0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8',
+ chainId: sepolia.id,
+ decimals: 6,
+ name: 'USD Coin',
+ symbol: 'USDC',
+}
+
+// Using the AAVE staging contract pool apply function
+const ABIExample = [
+ {
+ inputs: [
+ {
+ internalType: 'address',
+ name: 'asset',
+ type: 'address',
+ },
+ {
+ internalType: 'uint256',
+ name: 'amount',
+ type: 'uint256',
+ },
+ {
+ internalType: 'address',
+ name: 'onBehalfOf',
+ type: 'address',
+ },
+ {
+ internalType: 'uint16',
+ name: 'referralCode',
+ type: 'uint16',
+ },
+ ],
+ name: 'supply',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+] as const
+
+const ApproveAndSendDemo = withWalletStatusVerifier(
+ withSuspense(() => {
+ const { Dialog, close, open } = useDialog()
+ const { address } = useWeb3StatusConnected()
+ const { writeContractAsync } = useWriteContract()
+
+ const { data: balance } = useSuspenseReadErc20BalanceOf({
+ address: tokenUSDC_sepolia.address as Address,
+ args: [address],
+ })
+
+ // AAVE staging contract pool address
+ const spender = '0x6Ae43d3271ff6888e7Fc43Fd7321a503ff738951'
+
+ const amount = 10000000000n // 10,000.00 USDC
+
+ const handleTransaction = () =>
+ writeContractAsync({
+ abi: ABIExample,
+ address: spender,
+ functionName: 'supply',
+ args: [tokenUSDC_sepolia.address as Address, amount, address, 0],
+ })
+
+ const formattedAmount = formatNumberOrString(
+ formatUnits(amount, tokenUSDC_sepolia.decimals),
+ NumberType.TokenTx,
+ )
+
+ return (
+ <>
+ {balance < amount ? (
+ <>
+ Not enough USDC!
+
+ Mint {formattedAmount} USDC
+
+ >
+ ) : (
+ open('approve-and-transfer')}
+ spender={spender}
+ token={tokenUSDC_sepolia}
+ transaction={handleTransaction}
+ />
+ )}
+
+ close('approve-and-transfer')}>Close
+ }
+ message={'Approve and supply completed! 🎉'}
+ status={'ok'}
+ title={'Success'}
+ />
+
+ >
+ )
+ }),
+ { chainId: sepolia.id }, // this DEMO component only works on sepolia chain
+)
+
+export default ApproveAndSendDemo
diff --git a/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
new file mode 100644
index 00000000..047bf899
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
@@ -0,0 +1,116 @@
+import { useState, type ChangeEvent } from 'react'
+import styled from 'styled-components'
+
+import { Spinner, Textfield } from 'db-ui-toolkit'
+import { useDebouncedCallback } from 'use-debounce'
+import { type Address } from 'viem'
+import { useEnsName } from 'wagmi'
+import { mainnet } from 'wagmi/chains'
+
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-token-ens-name-background: #fff;
+ --theme-token-ens-name-title-color: #2e3048;
+ --theme-token-ens-name-text-color: #2e3048;
+
+ --theme-textfield-color: #2e3048;
+ --theme-textfield-background-color: #fff;
+ --theme-textfield-background-color-active: rgb(0 0 0 / 5%);
+ --theme-textfield-border-color: #c5c2cb;
+ --theme-textfield-placeholder-color: rgb(22 29 26 / 60%);
+ }
+
+ [data-theme='dark'] & {
+ --theme-token-ens-name-background: #373954;
+ --theme-token-ens-name-title-color: #fff;
+ --theme-token-ens-name-text-color: #e2e0e7;
+
+ --theme-textfield-color: #fff;
+ --theme-textfield-background-color: #373954;
+ --theme-textfield-background-color-active: rgb(255 255 255 / 5%);
+ --theme-textfield-border-color: #5f6178;
+ --theme-textfield-placeholder-color: rgb(247 247 247 / 60%);
+ }
+
+ background-color: var(--theme-token-ens-name-background);
+ border-radius: var(--base-border-radius);
+ display: flex;
+ flex-direction: column;
+ padding: var(--base-common-padding-xl);
+ row-gap: var(--base-gap);
+ width: 100%;
+`
+
+const Title = styled.h3`
+ color: var(--theme-token-ens-name-title-color);
+ font-size: 1.4rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+`
+
+const ENSName = styled.div`
+ align-items: center;
+ color: var(--theme-token-ens-name-text-color);
+ column-gap: var(--base-gap);
+ display: flex;
+ font-size: 1.5rem;
+ height: 20px;
+ line-height: 1.2;
+ padding-top: var(--base-common-padding);
+`
+
+const EnsNameSearch = ({ address }: { address?: Address }) => {
+ const { data, error, status } = useEnsName({
+ address: address,
+ chainId: mainnet.id,
+ })
+
+ return (
+ <>
+ {status === 'pending' ? (
+
+ ) : status === 'error' ? (
+ `Error fetching ENS name (${error.message})`
+ ) : data === undefined || data === null ? (
+ `Not available`
+ ) : (
+ data
+ )}
+ >
+ )
+}
+
+const EnsNameDemo = () => {
+ const [ensAddress, setEnsAddress] = useState()
+ const [value, setValue] = useState()
+ const debounceTime = 500
+
+ const debouncedSearch = useDebouncedCallback(async (address?: Address) => {
+ setEnsAddress(address)
+ }, debounceTime)
+
+ const onChange = (e: ChangeEvent) => {
+ const value = e.target.value as Address
+
+ setValue(value)
+ debouncedSearch(value)
+ }
+
+ return (
+
+ Find ENS name
+
+
+ ENS name: {ensAddress ? : '-'}
+
+
+ )
+}
+
+export default EnsNameDemo
diff --git a/src/components/pageComponents/home/Examples/demos/HashDemo.tsx b/src/components/pageComponents/home/Examples/demos/HashDemo.tsx
new file mode 100644
index 00000000..846d8f20
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/HashDemo.tsx
@@ -0,0 +1,66 @@
+import styled from 'styled-components'
+
+import { Toast } from 'db-ui-toolkit'
+import { toast } from 'react-hot-toast'
+import { type Address, type Chain } from 'viem'
+
+import Hash from '@/src/components/sharedComponents/Hash'
+import { getExplorerLink } from '@/src/utils/getExplorerLink'
+
+const Wrapper = styled(Hash)`
+ [data-theme='light'] & {
+ --theme-hash-background-color: #fff;
+ --theme-hash-border-color: #e2e0e7;
+ --theme-hash-color: #2e3048;
+ }
+
+ [data-theme='dark'] & {
+ --theme-hash-background-color: #2e3047;
+ --theme-hash-border-color: #5f6178;
+ --theme-hash-color: #fff;
+ }
+
+ background-color: var(--theme-hash-background-color);
+ border-radius: var(--base-border-radius);
+ border: 1px solid var(--theme-hash-border-color);
+ color: var(--theme-hash-color);
+ cursor: default;
+ font-size: 1.6rem;
+ height: 34px;
+ padding: 0 calc(var(--base-common-padding) * 2);
+`
+
+interface Props {
+ chain: Chain
+ hash: Address
+}
+
+/**
+ * Hash component demo.
+ *
+ * Some styles were added. Also we show a toast when the copy button is clicked
+ * to let the user know that something has happened.
+ */
+const HashDemo = ({ chain, hash }: Props) => {
+ const onCopy = (message: string) => {
+ const timeDelay = 2500
+
+ navigator.clipboard.writeText(message)
+ toast.custom(Copied to the clipboard! , {
+ duration: timeDelay,
+ position: 'top-center',
+ id: 'copy-to-clipboard',
+ })
+ }
+
+ return (
+ onCopy(hash)}
+ showCopyButton
+ />
+ )
+}
+
+export default HashDemo
diff --git a/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
new file mode 100644
index 00000000..0d6a0bbe
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
@@ -0,0 +1,165 @@
+import { useState } from 'react'
+import styled from 'styled-components'
+
+import { Textfield as BaseTextfield, Spinner } from 'db-ui-toolkit'
+import { mainnet } from 'viem/chains'
+
+import HashInput from '@/src/components/sharedComponents/HashInput'
+import { DetectedHash } from '@/src/utils/hash'
+
+const AlertIcon = () => (
+
+
+
+)
+
+const IconOK = ({ ...restProps }) => (
+
+
+
+)
+
+const Wrapper = styled.div`
+ --base-horizontal-padding: var(--base-common-padding-xl);
+ --base-textfield-padding: 0 var(--base-horizontal-padding);
+ --base-textfield-border-radius: var(--base-border-radius);
+
+ [data-theme='light'] & {
+ --theme-textfield-color: #2e3048;
+ --theme-textfield-color-active: #2e3048;
+ --theme-textfield-color-error: #2e3048;
+ --theme-textfield-color-ok: #2e3048;
+ --theme-textfield-background-color: #f7f7f7;
+ --theme-textfield-background-color-active: #f7f7f7;
+ --theme-textfield-border-color: #c5c2cb;
+ --theme-textfield-border-color-active: #c5c2cb;
+ --theme-textfield-border-color-error: #2e3048;
+ --theme-textfield-border-color-ok: #c5c2cb;
+ --theme-textfield-placeholder-color: rgb(22 29 26 / 60%);
+
+ --theme-hash-input-search-status-background-color: #2e3048;
+ }
+
+ [data-theme='dark'] & {
+ --theme-textfield-color: #fff;
+ --theme-textfield-color-active: #fff;
+ --theme-textfield-color-error: #fff;
+ --theme-textfield-color-ok: #fff;
+ --theme-textfield-background-color: #2e3048;
+ --theme-textfield-background-color-active: #2e3048;
+ --theme-textfield-border-color: #5f6178;
+ --theme-textfield-border-color-active: #5f6178;
+ --theme-textfield-border-color-error: #4b4d60;
+ --theme-textfield-border-color-ok: #5f6178;
+ --theme-textfield-placeholder-color: rgb(247 247 247 / 60%);
+
+ --theme-hash-input-search-status-background-color: #232436;
+ }
+
+ position: relative;
+ width: 100%;
+`
+
+const Textfield = styled(BaseTextfield)`
+ display: block;
+ padding-right: calc(var(--base-common-padding) * 6);
+ position: relative;
+ width: 100%;
+ z-index: 10;
+`
+
+const OK = styled(IconOK)`
+ position: absolute;
+ right: var(--base-common-padding-xl);
+ top: 50%;
+ transform: translateY(-50%);
+ z-index: 15;
+`
+
+const SpinnerWrapper = styled.div`
+ align-items: center;
+ display: flex;
+ height: 100%;
+ justify-content: center;
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: calc(var(--base-common-padding) * 6);
+ z-index: 15;
+`
+
+const StatusMessage = styled.div`
+ align-items: center;
+ background-color: var(--theme-hash-input-search-status-background-color);
+ border: 1px solid var(--theme-textfield-border-color-error);
+ border-radius: var(--base-textfield-border-radius);
+ color: #fab754;
+ column-gap: var(--base-gap);
+ display: flex;
+ font-size: 1.4rem;
+ left: 0;
+ min-height: 64px;
+ padding: calc(var(--base-common-padding-xl) * 2) var(--base-horizontal-padding)
+ var(--base-common-padding-xl) var(--base-horizontal-padding);
+ position: absolute;
+ top: calc(100% - var(--base-common-padding-xl));
+ width: 100%;
+ z-index: 5;
+`
+
+const HashInputDemo = ({ ...restProps }) => {
+ const [searchResult, setSearchResult] = useState(null)
+ const [loading, setLoading] = useState()
+ const notFound = searchResult && searchResult.type === null
+ const found = searchResult && searchResult.type !== null
+
+ const onLoading = (isLoading: boolean) => {
+ setLoading(isLoading)
+ }
+
+ return (
+
+ (
+
+ )}
+ />
+ {loading && (
+
+
+
+ )}
+ {found && !loading && }
+ {notFound && (
+
+ No results found
+
+ )}
+
+ )
+}
+
+export default HashInputDemo
diff --git a/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
new file mode 100644
index 00000000..fc45de11
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
@@ -0,0 +1,97 @@
+import { useEffect, useState } from 'react'
+import styled, { css } from 'styled-components'
+
+import { useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+import SignButtonBase from '@/src/components/sharedComponents/SignButton'
+
+const message = `
+👻🚀 Welcome to dAppBooster! 🚀👻
+
+By signing this message, you acknowledge the awesome power and potential of dAppBooster.
+
+Empower your dApps!
+
+✨ Keep boosting! ✨
+
+dAppBooster Team 💪
+`
+
+const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
+ ${({ status }) =>
+ status === 'ok' &&
+ css`
+ --theme-general-message-icon-color: var(--theme-color-ok);
+ `}
+`
+
+const Button = styled(PrimaryButton).attrs({ as: SignButtonBase })`
+ font-size: 1.6rem;
+ font-weight: 500;
+ height: 48px;
+ padding-left: calc(var(--base-common-padding) * 3);
+ padding-right: calc(var(--base-common-padding) * 3);
+`
+
+const SignMessageDemo = () => {
+ const [state, setState] = useState<{
+ signature: string | null
+ error: Error | null
+ }>({
+ error: null,
+ signature: null,
+ })
+ const { Dialog, close, open } = useDialog()
+
+ useEffect(() => {
+ if (state.signature || state.error) {
+ open('sign-message')
+ }
+ }, [state.signature, state.error, open])
+
+ const onClose = () => {
+ close('sign-message')
+ setState({ error: null, signature: null })
+ }
+
+ const dialogTitle = state.signature ? 'Success' : state.error ? 'Error' : ''
+ const dialogMessage = (
+ <>
+ {state.signature ? (
+ <>
+ Signature: {state.signature}
+ >
+ ) : state.error ? (
+ {state.error.message}
+ ) : (
+ ''
+ )}
+ >
+ )
+ const dialogButton = (
+
+ {state.signature ? 'Close' : state.error ? 'Try again!' : ''}
+
+ )
+
+ return (
+ <>
+ setState({ error, signature: null })}
+ onSign={(signature) => setState({ error: null, signature })}
+ />
+
+
+
+ >
+ )
+}
+
+export default SignMessageDemo
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
new file mode 100644
index 00000000..38e9cebb
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
@@ -0,0 +1,249 @@
+import styled, { css } from 'styled-components'
+
+import { useSuspenseQuery } from '@tanstack/react-query'
+import {
+ ExternalLink,
+ CopyButton,
+ Toast,
+ SkeletonLoading,
+ breakpointMediaQuery,
+} from 'db-ui-toolkit'
+import request from 'graphql-request'
+import { toast } from 'react-hot-toast'
+import { arbitrum, base, type Chain, optimism, polygon } from 'viem/chains'
+
+import ArbitrumDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Arbitrum'
+import BaseDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Base'
+import OptimismDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
+import PolygonDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Polygon'
+import { allAaveReservesQueryDocument } from '@/src/subgraphs/queries/aave/reserves'
+import { allUniswapPoolsQueryDocument } from '@/src/subgraphs/queries/uniswap/pools'
+import { appSchemas } from '@/src/subgraphs/utils/appSchemas'
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+const chainNameMapping: { [key: number]: string } = {
+ [arbitrum.id]: 'arbitrum',
+ [optimism.id]: 'optimism',
+ [polygon.id]: 'polygon',
+}
+
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-subgraph-title-color: #2e3048;
+ --theme-subgraph-name-color: #2e3048;
+ --theme-subgraph-bullet-color: #f7f7f7;
+ --theme-subgraph-bullet-background-color: #2e3048;
+ }
+
+ [data-theme='dark'] & {
+ --theme-subgraph-title-color: #fff;
+ --theme-subgraph-name-color: #fff;
+ --theme-subgraph-bullet-color: #2e3048;
+ --theme-subgraph-bullet-background-color: #fff;
+ }
+
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ padding: 0 var(--base-common-padding-xl);
+ row-gap: calc(var(--base-gap-xl) * 2);
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ padding: var(--base-common-padding-xl);
+ row-gap: calc(var(--base-gap-xl) * 3);
+ `,
+ )}
+`
+
+const Group = styled.div`
+ counter-reset: item-number;
+ display: flex;
+ flex-direction: column;
+ row-gap: var(--base-gap-xl);
+`
+
+const Title = styled.h3`
+ align-items: center;
+ color: var(--theme-subgraph-title-color);
+ column-gap: var(--base-gap);
+ display: flex;
+ font-size: 1.6rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+ padding-bottom: var(--base-common-padding);
+`
+
+const Arbitrum = styled(ArbitrumDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Polygon = styled(PolygonDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Optimism = styled(OptimismDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Base = styled(BaseDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Row = styled.div`
+ align-items: center;
+ color: var(--theme-subgraph-name-color);
+ column-gap: var(--base-gap);
+ display: flex;
+
+ &::before {
+ --base-size: 18px;
+
+ align-items: center;
+ background-color: var(--theme-subgraph-bullet-background-color);
+ border-radius: 50%;
+ color: var(--theme-subgraph-bullet-color);
+ content: counter(item-number, decimal-leading-zero);
+ counter-increment: item-number;
+ display: flex;
+ flex-shrink: 0;
+ font-size: 1rem;
+ font-weight: 700;
+ height: var(--base-size);
+ justify-content: center;
+ letter-spacing: -1px;
+ line-height: 1;
+ padding-right: 2px;
+ width: var(--base-size);
+ }
+`
+
+const Name = styled.div`
+ font-size: 1.6rem;
+ font-weight: 400;
+ line-height: 1.2;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: block;
+`
+
+const Copy = ({ value }: { value: string }) => {
+ const handleCopy = () => {
+ const timeDelay = 2500
+ toast.custom(Copied to the clipboard! , {
+ duration: timeDelay,
+ position: 'top-center',
+ id: 'copy-to-clipboard',
+ })
+ }
+
+ return
+}
+
+// eslint-disable-next-line react-refresh/only-export-components
+export const getNetworkIcon = (chainName: string) => (
+ <>
+ {chainName === 'arbitrum one' && }
+ {chainName === 'polygon' && }
+ {chainName === 'op mainnet' && }
+ {chainName === 'base' && }
+ >
+)
+
+const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
+ const { data } = useSuspenseQuery({
+ queryKey: ['allUniswapPools', chain.id],
+ queryFn: async () => {
+ const { positions } = await request(
+ appSchemas.uniswap[chain.id],
+ allUniswapPoolsQueryDocument,
+ )
+ return positions
+ },
+ })
+
+ const baseUrl = `https://app.uniswap.org/explore/pools/${chainNameMapping[chain.id]}/`
+
+ return (
+
+
+ Uniswap pools
+ {getNetworkIcon(chain.name.toLowerCase())}
+
+ {data.map((position) => (
+
+ {position.pool.symbol}
+
+
+
+ ))}
+
+ )
+})
+
+const Aave = withSuspenseAndRetry(() => {
+ const { data } = useSuspenseQuery({
+ queryKey: ['allAaveReserves', base.id],
+ queryFn: async () => {
+ const { reserves } = await request(appSchemas.aave[base.id], allAaveReservesQueryDocument)
+ return reserves
+ },
+ })
+ const baseUrl = 'https://app.aave.com/reserve-overview/?marketName=proto_base_v3&underlyingAsset='
+
+ return (
+
+
+ AAVE Reserves
+ {getNetworkIcon(base.name.toLowerCase())}
+
+ {data.map(({ id, name, underlyingAsset }) => (
+
+ {name}
+
+
+
+ ))}
+
+ )
+})
+
+const uniswapNetworks = [optimism, polygon, arbitrum]
+
+export const SkeletonLoadingItem = () => (
+
+
+
+
+)
+
+const List = ({ ...restProps }) => {
+ return (
+
+ {uniswapNetworks.map((chain) => (
+ } />
+ ))}
+ } />
+
+ )
+}
+
+export default List
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx
new file mode 100644
index 00000000..598d1fff
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx
@@ -0,0 +1,30 @@
+import { lazy } from 'react'
+
+import { Text } from 'db-ui-toolkit'
+
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+import { isSubgraphConfigValid } from '@/src/constants/common'
+
+const List = lazy(() => import('./List'))
+
+const SubgraphDemo = () => {
+ return isSubgraphConfigValid ? (
+
+ ) : (
+ <>
+
+ Remember to configure the env vars
+
+
+ Learn How
+
+ >
+ )
+}
+
+export default SubgraphDemo
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx
new file mode 100644
index 00000000..ea304f74
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx
@@ -0,0 +1,185 @@
+import { type FC } from 'react'
+import styled, { css } from 'styled-components'
+
+import { SkeletonLoading, breakpointMediaQuery } from 'db-ui-toolkit'
+import { arbitrum, base, type Chain, optimism, polygon } from 'viem/chains'
+
+import { getNetworkIcon } from '@/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List'
+import { useSubgraphIndexingStatus } from '@/src/hooks/useSubgraphIndexingStatus'
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-subgraph-status-background: #fff;
+ --theme-subgraph-status-data-row-color: #2e3048;
+ --theme-subgraph-status-data-color: #5f6178;
+ }
+
+ [data-theme='dark'] & {
+ --theme-subgraph-status-background: #373954;
+ --theme-subgraph-status-data-row-color: #fff;
+ --theme-subgraph-status-data-color: #e2e0e7;
+ }
+
+ display: flex;
+ flex-direction: column;
+ padding: 0 var(--base-common-padding);
+ row-gap: var(--base-gap-xl);
+ width: 100%;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ width: auto;
+ `,
+ )}
+`
+
+const Row = styled.div`
+ background-color: var(--theme-subgraph-status-background);
+ border-radius: var(--base-border-radius);
+ display: flex;
+ flex-direction: column;
+ padding: var(--base-common-padding-xl);
+ row-gap: var(--base-gap-xl);
+ width: 100%;
+`
+
+const Title = styled.h3`
+ align-items: center;
+ color: var(--theme-subgraph-title-color);
+ column-gap: var(--base-gap);
+ display: flex;
+ font-size: 1.6rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+`
+
+const Data = styled.div<{ $status: 'error' | 'ok' }>`
+ --base-status-size: 10px;
+
+ align-items: center;
+ color: var(--theme-subgraph-status-data-row-color);
+ column-gap: var(--base-gap);
+ display: grid;
+ font-size: 1.6rem;
+ font-weight: 400;
+ grid-template-columns: var(--base-status-size) 1fr;
+ line-height: 1.2;
+ white-space: nowrap;
+
+ &::before {
+ align-items: center;
+ background-color: var(
+ ${({ $status }) => ($status === 'error' ? '--theme-color-danger' : '--theme-color-ok')}
+ );
+ border-radius: 50%;
+ content: '';
+ display: flex;
+ height: var(--base-status-size);
+ width: var(--base-status-size);
+ transition: background-color var(--base-transition-duration);
+ }
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ grid-template-columns: var(--base-status-size) 1fr 10px 1fr;
+ `,
+ )}
+`
+
+const SG = styled.span``
+
+const Separator = styled.span`
+ display: none;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ display: block;
+ `,
+ )}
+`
+
+const BC = styled.span`
+ padding-left: calc(var(--base-status-size) + var(--base-gap));
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ padding-left: 0;
+ `,
+ )}
+`
+
+export const SkeletonLoadingItem = () => (
+
+
+
+
+)
+
+const SubgraphStatus: FC<{
+ indexingStatus: ReturnType
+}> = ({ indexingStatus }) => {
+ const { chain, isSynced, networkBlockNumber, resource, subgraphBlockNumber } = indexingStatus
+
+ return (
+
+
+ {`${resource}@${chain.id}`}
+ {getNetworkIcon(chain.name.toLowerCase())}
+
+
+
+ SG: {subgraphBlockNumber.toString()}
+
+ -
+
+ BC:
+ {networkBlockNumber?.toString() ?? '-'}
+
+
+
+ )
+}
+
+const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
+ const indexingStatus = useSubgraphIndexingStatus({ chain, resource: 'uniswap' })
+
+ return
+})
+
+const Aave = withSuspenseAndRetry(() => {
+ const indexingStatus = useSubgraphIndexingStatus({ chain: base, resource: 'aave' })
+
+ return
+})
+
+const uniswapNetworks = [optimism, polygon, arbitrum]
+
+const List = ({ ...restProps }) => {
+ return (
+
+ {uniswapNetworks.map((chain) => (
+ } />
+ ))}
+ } />
+
+ )
+}
+
+export default List
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx
new file mode 100644
index 00000000..7a0370c9
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx
@@ -0,0 +1,31 @@
+import { lazy } from 'react'
+
+import { Text } from 'db-ui-toolkit'
+
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+import { isSubgraphConfigValid } from '@/src/constants/common'
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+const List = lazy(() => import('./List'))
+
+const SubgraphStatusDemo = withSuspenseAndRetry(() => {
+ return isSubgraphConfigValid ? (
+
+ ) : (
+ <>
+
+ Remember to configure the env vars
+
+
+ Learn How
+
+ >
+ )
+})
+
+export default SubgraphStatusDemo
diff --git a/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx b/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx
new file mode 100644
index 00000000..534bd878
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx
@@ -0,0 +1,36 @@
+import { arbitrum, mainnet, polygon, optimism } from 'viem/chains'
+
+import Arbitrum from '@/src/components/pageComponents/home/Examples/demos/assets/Arbitrum'
+import Eth from '@/src/components/pageComponents/home/Examples/demos/assets/Eth'
+import Optimism from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
+import Polygon from '@/src/components/pageComponents/home/Examples/demos/assets/Polygon'
+import SwitchNetwork, { type Networks } from '@/src/components/sharedComponents/SwitchNetwork'
+
+const SwitchNetworkDemo = () => {
+ const networks: Networks = [
+ {
+ icon: ,
+ id: mainnet.id,
+ label: mainnet.name,
+ },
+ {
+ icon: ,
+ id: optimism.id,
+ label: optimism.name,
+ },
+ {
+ icon: ,
+ id: arbitrum.id,
+ label: arbitrum.name,
+ },
+ {
+ icon: ,
+ id: polygon.id,
+ label: polygon.name,
+ },
+ ]
+
+ return
+}
+
+export default SwitchNetworkDemo
diff --git a/src/components/pageComponents/home/Examples/demos/TokenDropdownDemo.tsx b/src/components/pageComponents/home/Examples/demos/TokenDropdownDemo.tsx
new file mode 100644
index 00000000..2aa00d1f
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/TokenDropdownDemo.tsx
@@ -0,0 +1,16 @@
+import { type FC, useState } from 'react'
+
+import TokenDropdown from '@/src/components/sharedComponents/TokenDropdown'
+import { type Token } from '@/src/types/token'
+
+const TokenDropdownDemo: FC = ({ ...restProps }) => {
+ const [currentToken, setCurrentToken] = useState()
+
+ const onTokenSelect = (token: Token | undefined) => {
+ setCurrentToken(token)
+ }
+
+ return
+}
+
+export default TokenDropdownDemo
diff --git a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
new file mode 100644
index 00000000..bc14efac
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
@@ -0,0 +1,87 @@
+import { useEffect, useState } from 'react'
+
+import { arbitrum, mainnet, polygon, optimism } from 'viem/chains'
+
+import Arbitrum from '@/src/components/pageComponents/home/Examples/demos/assets/Arbitrum'
+import Eth from '@/src/components/pageComponents/home/Examples/demos/assets/Eth'
+import Optimism from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
+import Polygon from '@/src/components/pageComponents/home/Examples/demos/assets/Polygon'
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+import { type Networks } from '@/src/components/sharedComponents/TokenSelect'
+import { useTokenLists } from '@/src/hooks/useTokenLists'
+import { useTokenSearch } from '@/src/hooks/useTokenSearch'
+import { useWeb3Status } from '@/src/hooks/useWeb3Status'
+import { type Token } from '@/src/types/token'
+
+const TokenInputDemo = ({ singleToken }: { singleToken?: boolean }) => {
+ const { isWalletConnected } = useWeb3Status()
+ const [currentNetworkId, setCurrentNetworkId] = useState()
+ const [currentToken, setCurrentToken] = useState()
+ const [amount, setAmount] = useState()
+ const [error, setError] = useState()
+ const { tokensByChainId } = useTokenLists()
+ const { searchResult } = useTokenSearch(tokensByChainId[1], [], 'WETH')
+
+ const networks: Networks = [
+ {
+ icon: ,
+ id: mainnet.id,
+ label: mainnet.name,
+ onClick: () => setCurrentNetworkId(mainnet.id),
+ },
+ {
+ icon: ,
+ id: optimism.id,
+ label: optimism.name,
+ onClick: () => setCurrentNetworkId(optimism.id),
+ },
+ {
+ icon: ,
+ id: arbitrum.id,
+ label: arbitrum.name,
+ onClick: () => setCurrentNetworkId(arbitrum.id),
+ },
+ {
+ icon: ,
+ id: polygon.id,
+ label: polygon.name,
+ onClick: () => setCurrentNetworkId(polygon.id),
+ },
+ ]
+
+ const onTokenSelect = (token: Token | undefined) => {
+ setCurrentToken(token)
+ }
+
+ const onAmountSet = (amount?: string) => {
+ setAmount(amount)
+ }
+
+ const onError = (error?: string) => {
+ setError(error)
+ }
+
+ useEffect(() => {
+ currentToken && console.log(currentToken)
+ amount && console.log(amount)
+ error && console.log(error)
+ }, [currentToken, amount, error])
+
+ return (
+
+ )
+}
+
+export default TokenInputDemo
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo.tsx
new file mode 100644
index 00000000..9c02aabe
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo.tsx
@@ -0,0 +1,113 @@
+import { useState, type ReactElement } from 'react'
+import styled, { css } from 'styled-components'
+
+import { useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+import { type Hash, type TransactionReceipt, erc20Abi, parseEther } from 'viem'
+import { sepolia } from 'viem/chains'
+import { useSendTransaction, useWriteContract } from 'wagmi'
+
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
+import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
+import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
+
+const Wrapper = styled.div`
+ display: grid;
+ row-gap: var(--base-gap-xl);
+`
+
+const Button = styled(PrimaryButton).attrs({ as: TransactionButton })`
+ font-size: 1.6rem;
+ font-weight: 500;
+ height: 48px;
+ padding-left: calc(var(--base-common-padding) * 3);
+ padding-right: calc(var(--base-common-padding) * 3);
+`
+
+const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
+ ${({ status }) =>
+ status === 'ok' &&
+ css`
+ --theme-general-message-icon-color: var(--theme-color-ok);
+ `}
+`
+
+const TransactionButtonDemo = withWalletStatusVerifier(
+ () => {
+ const { Dialog, close, open } = useDialog()
+ const { address } = useWeb3StatusConnected()
+ const { sendTransactionAsync } = useSendTransaction()
+ const { writeContractAsync } = useWriteContract()
+ const [minedMessage, setMinedMessage] = useState()
+
+ const handleOnMined = (receipt: TransactionReceipt) => {
+ setMinedMessage(
+ <>
+ Hash: {receipt.transactionHash}
+ >,
+ )
+ open('tx-dialog')
+ }
+
+ const handleSendTransaction = (): Promise => {
+ // Send native token
+ return sendTransactionAsync({
+ to: address,
+ value: parseEther('0.1'),
+ })
+ }
+
+ const handleWriteContract = (): Promise => {
+ // Send ERC20 token [USDC]
+ return writeContractAsync({
+ abi: erc20Abi,
+ address: '0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8', // USDC
+ functionName: 'transfer',
+ args: [address, 100000000n], // 100 USDC
+ })
+ }
+
+ return (
+ <>
+
+
+ Send 100 USDC
+
+
+ Send 0.1 ETH
+
+
+
+ {
+ close('tx-dialog')
+ setMinedMessage('')
+ }}
+ >
+ Close
+
+ }
+ message={minedMessage}
+ status={'ok'}
+ title={'Transaction completed!'}
+ />
+
+ >
+ )
+ },
+ {
+ chainId: sepolia.id, // this DEMO component only works on sepolia chain
+ },
+)
+
+export default TransactionButtonDemo
diff --git a/src/components/pageComponents/home/Examples/demos/assets/Arbitrum.tsx b/src/components/pageComponents/home/Examples/demos/assets/Arbitrum.tsx
new file mode 100644
index 00000000..b49b4ded
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/assets/Arbitrum.tsx
@@ -0,0 +1,47 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+ width: 24px;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+
+
+
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/demos/assets/Base.tsx b/src/components/pageComponents/home/Examples/demos/assets/Base.tsx
new file mode 100644
index 00000000..72aa4760
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/assets/Base.tsx
@@ -0,0 +1,20 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+ width: 24px;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/demos/assets/Eth.tsx b/src/components/pageComponents/home/Examples/demos/assets/Eth.tsx
new file mode 100644
index 00000000..f54cc5ff
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/assets/Eth.tsx
@@ -0,0 +1,46 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+ height: 24px;
+ width: 24px;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+
+
+
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/demos/assets/Optimism.tsx b/src/components/pageComponents/home/Examples/demos/assets/Optimism.tsx
new file mode 100644
index 00000000..0a7d07c2
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/assets/Optimism.tsx
@@ -0,0 +1,32 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+ height: 24px;
+ width: 24px;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/demos/assets/Polygon.tsx b/src/components/pageComponents/home/Examples/demos/assets/Polygon.tsx
new file mode 100644
index 00000000..41026794
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/assets/Polygon.tsx
@@ -0,0 +1,25 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+ height: 24px;
+`
+
+const Icon: FC> = ({ ...restProps }) => (
+
+
+
+
+
+
+)
+
+export default Icon
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
new file mode 100644
index 00000000..9b23e575
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -0,0 +1,179 @@
+import { type FC, type HTMLAttributes } from 'react'
+import styled, { css } from 'styled-components'
+
+import { InnerContainer as Inner, ContainerPadding, breakpointMediaQuery } from 'db-ui-toolkit'
+import { mainnet } from 'viem/chains'
+import { useAccount } from 'wagmi'
+
+import { Props as ItemProps } from '@/src/components/pageComponents/home/Examples/Item'
+import List from '@/src/components/pageComponents/home/Examples/List'
+import ImgAvatar from '@/src/components/pageComponents/home/Examples/assets/Avatar'
+import ImgEns from '@/src/components/pageComponents/home/Examples/assets/Ens'
+import ImgHash from '@/src/components/pageComponents/home/Examples/assets/Hash'
+import ImgInputAddress from '@/src/components/pageComponents/home/Examples/assets/InputAddress'
+import ImgSign from '@/src/components/pageComponents/home/Examples/assets/Sign'
+import ImgSubgraph from '@/src/components/pageComponents/home/Examples/assets/Subgraph'
+import ImgSubgraphStatus from '@/src/components/pageComponents/home/Examples/assets/SubgraphStatus'
+import ImgSwitch from '@/src/components/pageComponents/home/Examples/assets/Switch'
+import ImgTokenInput from '@/src/components/pageComponents/home/Examples/assets/TokenInput'
+import ImgTokenList from '@/src/components/pageComponents/home/Examples/assets/TokenList'
+import ImgTransaction from '@/src/components/pageComponents/home/Examples/assets/Transaction'
+import ImgUserCheck from '@/src/components/pageComponents/home/Examples/assets/UserCheck'
+import ImgWallet from '@/src/components/pageComponents/home/Examples/assets/Wallet'
+import AvatarDemo from '@/src/components/pageComponents/home/Examples/demos/AvatarDemo'
+import ERC20ApproveAndTransferButtonDemo from '@/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo'
+import EnsNameDemo from '@/src/components/pageComponents/home/Examples/demos/EnsNameDemo'
+import HashDemo from '@/src/components/pageComponents/home/Examples/demos/HashDemo'
+import HashInputDemo from '@/src/components/pageComponents/home/Examples/demos/HashInputDemo'
+import SignMessageDemo from '@/src/components/pageComponents/home/Examples/demos/SignMessageDemo'
+import SubgraphDemo from '@/src/components/pageComponents/home/Examples/demos/SubgraphDemo'
+import SubgraphStatusDemo from '@/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo'
+import SwitchNetworkDemo from '@/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo'
+import TokenDropdownDemo from '@/src/components/pageComponents/home/Examples/demos/TokenDropdownDemo'
+import TokenInputDemo from '@/src/components/pageComponents/home/Examples/demos/TokenInputDemo'
+import TransactionButtonDemo from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo'
+import { ConnectWalletButton as ConnectWalletButtonDemo } from '@/src/providers/Web3Provider'
+
+const Wrapper = styled.section`
+ [data-theme='light'] & {
+ --landing-page-main-background-color: #f7f7f7;
+ }
+
+ [data-theme='dark'] & {
+ --landing-page-main-background-color: #2e3048;
+ }
+
+ background-color: var(--landing-page-main-background-color);
+ flex-grow: 1;
+`
+
+const InnerContainer = styled(Inner)`
+ align-items: center;
+ flex-direction: column;
+ padding-bottom: 50px;
+ padding-top: 50px;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ padding-bottom: 100px;
+ padding-top: 100px;
+ `,
+ )}
+
+ ${ContainerPadding}
+`
+
+const Examples: FC> = ({ ...restProps }) => {
+ const { address = '0x87885AaEEdED51C7e3858a782644F5d89759f245' } = useAccount()
+ const items: ItemProps[] = [
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/index.html#md:wallet-setup',
+ icon: ,
+ text: 'Authenticate using an EVM Account',
+ title: 'Wallet connectivity',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Hash.Hash.html',
+ icon: ,
+ text: 'Validate address, ENS or transaction hash',
+ title: 'Hash input',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenDropdown.TokenDropdown.html',
+ icon: ,
+ text: 'Dynamic token list dropdown',
+ title: 'Token dropdown',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenInput.TokenInput.html',
+ icon: ,
+ text: 'Input with max, user balance, decimals',
+ title: 'Token input',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenInput.TokenInput.html',
+ icon: ,
+ text: 'Input with max, user balance, decimals',
+ title: 'Token input single token',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SwitchNetwork.SwitchNetwork.html',
+ icon: ,
+ text: 'Add or switch networks',
+ title: 'Add / switch network',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Hash.Hash.html',
+ icon: ,
+ text: 'Copy, open in explorer',
+ title: 'Hash component',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Avatar.Avatar.html',
+ icon: ,
+ text: 'Address blockie avatar image',
+ title: 'Avatar',
+ },
+ {
+ demo: ,
+ href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
+ icon: ,
+ text: 'Support for connecting with subgraphs',
+ title: 'Subgraph',
+ },
+ {
+ demo: ,
+ href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
+ icon: ,
+ text: 'Subgraph syncing status',
+ title: 'Subgraph status',
+ },
+ {
+ demo: ,
+ href: 'https://github.com/BootNodeDev/dAppBooster/blob/86a7b001d4e48b41b3a463f844a83f632eae8c39/src/pageComponents/home/Examples/demos/EnsNameDemo.tsx#L63',
+ icon: ,
+ text: 'Resolve ENS names',
+ title: 'ENS name',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TransactionButton.TransactionButton.html',
+ icon: ,
+ text: 'Send tokens from / to your address',
+ title: 'Tx button',
+ },
+ {
+ demo: ,
+ href: 'https://github.com/BootNodeDev/dAppBooster/blob/86a7b001d4e48b41b3a463f844a83f632eae8c39/src/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx#L33',
+ icon: ,
+ text: 'Checks allowance and combines the approval and transaction buttons into one component',
+ title: 'ERC20 approve and transfer',
+ },
+ {
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SignButton.SignButton.html',
+ icon: ,
+ text: 'Sign a message and get the signature',
+ title: 'Sign button',
+ },
+ ]
+
+ return (
+
+
+
+
+
+ )
+}
+
+export default Examples
From 56d592f599dea22d70cf5cb99a021cdc58123735 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 15:41:43 -0300
Subject: [PATCH 008/228] feat: add landing page home
---
src/components/pageComponents/home/index.tsx | 110 ++-----------------
1 file changed, 12 insertions(+), 98 deletions(-)
diff --git a/src/components/pageComponents/home/index.tsx b/src/components/pageComponents/home/index.tsx
index 65c6b08f..63f550c0 100644
--- a/src/components/pageComponents/home/index.tsx
+++ b/src/components/pageComponents/home/index.tsx
@@ -1,108 +1,22 @@
-/**
- * Home page example
- *
- * You can safely delete the contents of this file and start from scratch,
- * just make sure to keep the file itself and export a component named Home.
- */
import styled from 'styled-components'
-import { Card, Title } from 'db-ui-toolkit'
+import Examples from '@/src/components/pageComponents/home/Examples'
+import Welcome from '@/src/components/pageComponents/home/Welcome'
-/**
- * A centered custom card component
- */
-const CustomCard = styled(Card)`
- margin: auto;
- max-width: 90%;
-
- a {
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- }
- }
-`
-
-/**
- * A styled ul tag
- */
-const Ul = styled.ul`
+const Wrapper = styled.div`
display: flex;
flex-direction: column;
- font-size: 1.5rem;
- list-style: circle;
- padding-left: calc(var(--base-common-padding-xl) + var(--base-common-padding));
- row-gap: var(--base-gap-xl);
-
- ul {
- padding-bottom: var(--base-common-padding-xl);
- padding-top: var(--base-common-padding-xl);
- row-gap: var(--base-gap);
- }
-`
-
-/**
- * A styled pre tag
- */
-const Code = styled.pre`
- background-color: #f5f5f5;
- border-radius: 5px;
- font-size: 1.3rem;
- margin: var(--base-gap) 0 0;
- padding: 4px 10px;
- white-space: normal;
- word-break: break-all;
+ flex-grow: 1;
+ margin-top: calc(var(--base-header-height) * -1);
+ position: relative;
+ width: 100%;
`
-export const Home = () => {
+export const Home = ({ ...restProps }) => {
return (
- // You can safely delete this.
-
- Getting started
-
-
-
- dAppBooster demo
-
- : a fully functional dAppBooster dApp with plenty of examples.
-
-
- {/* TODO: Replace by correct link when the fork is ready */}
-
- Demo's source code on GitHub
-
-
-
-
- Components documentation
-
-
-
- Where to start?
-
-
- Home page src/components/pageComponents/home/index.tsx
-
-
- Header src/components/sharedComponents/Header.tsx
-
-
- Footer src/components/sharedComponents/Footer/index.tsx
-
-
- App layout src/routes/__root.tsx
-
-
- Home route src/routes/index.lazy.tsx
-
-
-
-
-
+
+
+
+
)
}
From bbf0f87b62cda34c86f33efee686a596cd249360 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 16:28:04 -0300
Subject: [PATCH 009/228] feat: add single token component and styles to
TokenInput
---
.../TokenInput/Components.tsx | 46 ++++++++++---------
.../sharedComponents/TokenInput/index.tsx | 34 +++++++++-----
2 files changed, 47 insertions(+), 33 deletions(-)
diff --git a/src/components/sharedComponents/TokenInput/Components.tsx b/src/components/sharedComponents/TokenInput/Components.tsx
index fa4c6633..9a277899 100644
--- a/src/components/sharedComponents/TokenInput/Components.tsx
+++ b/src/components/sharedComponents/TokenInput/Components.tsx
@@ -90,28 +90,12 @@ export const ChevronDown = styled(BaseChevronDown)`
margin-left: var(--base-gap);
`
-export const DropdownButton = styled(Button).attrs<{ singleOption?: boolean }>(
- ({ children, singleOption }) => {
- return {
- className: 'tokenInputDropdownButton',
- children: (
- <>
- {children}
- {!singleOption && }
- >
- ),
- }
- },
-)`
- /* Dropdown button */
+const ButtonCSS = css`
--theme-button-background-color: var(--theme-token-input-dropdown-button-background-color, #fff);
--theme-button-background-color-hover: var(
--theme-token-input-dropdown-button-background-color-hover,
rgb(0 0 0 / 5%)
);
- ${(props) => props.singleOption && '--theme-button-background-color: transparent;'}
- ${(props) => props.singleOption && '--theme-button-background-color-hover: transparent;'}
-
--theme-button-border-color: var(--theme-token-input-dropdown-button-border-color, #e2e0e7);
--theme-button-border-color-hover: var(
--theme-token-input-dropdown-button-border-color-hover,
@@ -121,18 +105,15 @@ export const DropdownButton = styled(Button).attrs<{ singleOption?: boolean }>(
--theme-token-input-dropdown-button-border-color-active,
#e2e0e7
);
- ${(props) => props.singleOption && 'border: none;'}
-
--theme-button-color: var(--theme-token-input-dropdown-button-color, #2e3048);
--theme-button-color-hover: var(--theme-token-input-dropdown-button-color-hover, #2e3048);
+ flex-shrink: 0;
font-size: 1.2rem;
font-weight: 500;
- flex-shrink: 0;
height: auto;
min-width: 100px;
padding: var(--base-token-input-dropdown-button-padding, 0 var(--base-common-padding));
- ${(props) => props.singleOption && 'cursor: auto;'}
${breakpointMediaQuery(
'tabletPortraitStart',
@@ -143,6 +124,29 @@ export const DropdownButton = styled(Button).attrs<{ singleOption?: boolean }>(
)}
`
+export const DropdownButton = styled(Button).attrs(({ children }) => {
+ return {
+ className: 'tokenInputDropdownButton',
+ children: (
+ <>
+ {children}
+
+ >
+ ),
+ }
+})`
+ ${ButtonCSS}
+`
+
+export const SingleToken = styled.div.attrs({ className: 'tokenInputSingleToken' })`
+ align-items: center;
+ column-gap: var(--base-button-column-gap, var(--base-gap, 8px));
+ cursor: default;
+ display: flex;
+
+ ${ButtonCSS}
+`
+
export const Error = styled.span`
color: var(--theme-color-danger);
font-weight: 700;
diff --git a/src/components/sharedComponents/TokenInput/index.tsx b/src/components/sharedComponents/TokenInput/index.tsx
index b7a1c15e..72f1e397 100644
--- a/src/components/sharedComponents/TokenInput/index.tsx
+++ b/src/components/sharedComponents/TokenInput/index.tsx
@@ -21,6 +21,7 @@ import {
EstimatedUSDValue,
Icon,
MaxButton,
+ SingleToken,
Textfield,
Title,
TopRow,
@@ -196,6 +197,18 @@ const TokenInput: FC = ({
return When single token is true, a token is required.
}
+ const CurrentToken = () =>
+ selectedToken ? (
+ <>
+
+
+
+ {selectedToken.symbol}
+ >
+ ) : (
+ 'Select'
+ )
+
return (
<>
@@ -217,18 +230,15 @@ const TokenInput: FC = ({
)}
value={amount}
/>
-
- {selectedToken ? (
- <>
-
-
-
- {selectedToken.symbol}
- >
- ) : (
- 'Select'
- )}
-
+ {singleToken ? (
+
+
+
+ ) : (
+
+
+
+ )}
~$0.00
From e8085a38301d2dcb19d940d7e37334db0ce63e6b Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 16:41:23 -0300
Subject: [PATCH 010/228] fix: connect button font-size
---
src/components/sharedComponents/Header.tsx | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/components/sharedComponents/Header.tsx b/src/components/sharedComponents/Header.tsx
index 0fbaed33..ec909756 100644
--- a/src/components/sharedComponents/Header.tsx
+++ b/src/components/sharedComponents/Header.tsx
@@ -92,6 +92,16 @@ const End = styled.div`
)}
`
+const ConnectButton = styled(ConnectWalletButton)`
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ font-size: 1.5rem;
+ height: 48px;
+ `,
+ )}
+`
+
export const Header: FC> = ({ ...restProps }) => {
const { setTheme, theme } = useTheme()
@@ -106,7 +116,7 @@ export const Header: FC> = ({ ...restProps }) => {
setTheme(theme === 'light' ? 'dark' : 'light')} />
-
+
From 96eba90f48c45182440fd6e41ddccb626ed1fb3e Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 18:58:30 -0300
Subject: [PATCH 011/228] fix: item padding
---
src/components/pageComponents/home/Examples/Item/index.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/Item/index.tsx b/src/components/pageComponents/home/Examples/Item/index.tsx
index a324a5ae..c84c8214 100644
--- a/src/components/pageComponents/home/Examples/Item/index.tsx
+++ b/src/components/pageComponents/home/Examples/Item/index.tsx
@@ -105,7 +105,7 @@ const Demo = styled.div`
flex: 1;
justify-content: center;
min-width: 0;
- padding: calc(var(--base-common-padding) * 6) var(--base-common-padding)
+ padding: calc(var(--base-common-padding) * 7) var(--base-common-padding)
calc(var(--base-common-padding) * 4);
position: relative;
@@ -113,7 +113,7 @@ const Demo = styled.div`
'tabletPortraitStart',
css`
min-height: 205px;
- padding: calc(var(--base-common-padding) * 6) calc(var(--base-common-padding) * 3)
+ padding: calc(var(--base-common-padding) * 7) calc(var(--base-common-padding) * 3)
calc(var(--base-common-padding) * 3);
`,
)};
From dd6d756b13dcc141705f45e5577eec1e5278ca26 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 15 Aug 2024 19:12:38 -0300
Subject: [PATCH 012/228] chore: remove avatar demo
---
.../home/Examples/assets/Avatar.tsx | 25 ---------
.../home/Examples/demos/AvatarDemo.test.tsx | 52 -------------------
.../home/Examples/demos/AvatarDemo.tsx | 29 -----------
.../pageComponents/home/Examples/index.tsx | 30 +++++------
4 files changed, 13 insertions(+), 123 deletions(-)
delete mode 100644 src/components/pageComponents/home/Examples/assets/Avatar.tsx
delete mode 100644 src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx
delete mode 100644 src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx
diff --git a/src/components/pageComponents/home/Examples/assets/Avatar.tsx b/src/components/pageComponents/home/Examples/assets/Avatar.tsx
deleted file mode 100644
index 8c06dcbb..00000000
--- a/src/components/pageComponents/home/Examples/assets/Avatar.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { type FC, type HTMLAttributes } from 'react'
-import { styled } from 'styled-components'
-
-const Wrapper = styled.svg`
- display: block;
- flex-shrink: 0;
-`
-
-const Icon: FC> = ({ ...restProps }) => (
-
-
-
-)
-
-export default Icon
diff --git a/src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx b/src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx
deleted file mode 100644
index 00d9df94..00000000
--- a/src/components/pageComponents/home/Examples/demos/AvatarDemo.test.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { render, screen } from '@testing-library/react'
-import { type Mock, describe, expect, it, vi } from 'vitest'
-import { useEnsName, useEnsAvatar } from 'wagmi'
-
-import Avatar from '@/src/components/pageComponents/home/Examples/demos/AvatarDemo'
-
-// Mock wagmi hooks
-vi.mock('wagmi', () => ({
- useEnsName: vi.fn(),
- useEnsAvatar: vi.fn(),
-}))
-
-const mockSize = 50
-const mockAddress = '0x1234567890abcdef1234567890abcdef12345678'
-const mockEnsName = 'test.eth'
-const mockAvatarImg = 'avatar.png'
-
-describe('Avatar Component', () => {
- it('renders CustomAvatar with ensName and avatarImg', () => {
- // Mock the hook return values
- ;(useEnsName as Mock).mockReturnValue({ data: mockEnsName })
- ;(useEnsAvatar as Mock).mockReturnValue({ data: mockAvatarImg })
-
- render( )
-
- expect(screen.getByAltText(mockEnsName)).toBeInTheDocument()
- const img = screen.getByRole('img')
- expect(img).toHaveAttribute('src', mockAvatarImg)
-
- // Expect the image to have the correct size
- expect(img.parentElement).toHaveStyle({
- width: `${mockSize}px`,
- height: `${mockSize}px`,
- })
- })
-
- it('renders Jazzicon (without ensAvatar image)', () => {
- ;(useEnsName as Mock).mockReturnValue({ data: mockEnsName })
- ;(useEnsAvatar as Mock).mockReturnValue({ data: undefined })
-
- render( )
-
- // Expect Jazzicon to be rendered
- expect(screen.getByTestId('avatar-icon')).toBeInTheDocument()
-
- // Expect the icon to have the correct size
- expect(screen.getByTestId('avatar-icon').parentElement).toHaveStyle({
- width: `${mockSize}px`,
- height: `${mockSize}px`,
- })
- })
-})
diff --git a/src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx b/src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx
deleted file mode 100644
index b814b60f..00000000
--- a/src/components/pageComponents/home/Examples/demos/AvatarDemo.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { type Address } from 'viem'
-import { normalize } from 'viem/ens'
-import { useEnsName, useEnsAvatar } from 'wagmi'
-
-import BaseAvatar from '@/src/components/sharedComponents/Avatar'
-
-interface Props {
- address: Address
- size: number
-}
-
-/**
- * Avatar component using wagmi hooks to fetch ENS name and avatar image for the provided address.
- *
- * @param {string} props.address - The address
- * @param {number} props.size - The size of the avatar
- * @example
- */
-const AvatarDemo = ({ address, size }: Props) => {
- const { data: ensName } = useEnsName({ address })
-
- const { data: avatarImg } = useEnsAvatar({
- name: ensName ? normalize(ensName) : undefined,
- })
-
- return
-}
-
-export default AvatarDemo
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 9b23e575..4084c9a0 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -7,7 +7,6 @@ import { useAccount } from 'wagmi'
import { Props as ItemProps } from '@/src/components/pageComponents/home/Examples/Item'
import List from '@/src/components/pageComponents/home/Examples/List'
-import ImgAvatar from '@/src/components/pageComponents/home/Examples/assets/Avatar'
import ImgEns from '@/src/components/pageComponents/home/Examples/assets/Ens'
import ImgHash from '@/src/components/pageComponents/home/Examples/assets/Hash'
import ImgInputAddress from '@/src/components/pageComponents/home/Examples/assets/InputAddress'
@@ -20,7 +19,6 @@ import ImgTokenList from '@/src/components/pageComponents/home/Examples/assets/T
import ImgTransaction from '@/src/components/pageComponents/home/Examples/assets/Transaction'
import ImgUserCheck from '@/src/components/pageComponents/home/Examples/assets/UserCheck'
import ImgWallet from '@/src/components/pageComponents/home/Examples/assets/Wallet'
-import AvatarDemo from '@/src/components/pageComponents/home/Examples/demos/AvatarDemo'
import ERC20ApproveAndTransferButtonDemo from '@/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo'
import EnsNameDemo from '@/src/components/pageComponents/home/Examples/demos/EnsNameDemo'
import HashDemo from '@/src/components/pageComponents/home/Examples/demos/HashDemo'
@@ -71,7 +69,19 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/index.html#md:wallet-setup',
icon: ,
- text: 'Authenticate using an EVM Account',
+ text: (
+ <>
+ Connect to and disconnect from a cryptocurrency wallet, display your{' '}
+
+ avatar
+ {' '}
+ and address
+ >
+ ),
title: 'Wallet connectivity',
},
{
@@ -95,13 +105,6 @@ const Examples: FC> = ({ ...restProps }) => {
text: 'Input with max, user balance, decimals',
title: 'Token input',
},
- {
- demo: ,
- href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenInput.TokenInput.html',
- icon: ,
- text: 'Input with max, user balance, decimals',
- title: 'Token input single token',
- },
{
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SwitchNetwork.SwitchNetwork.html',
@@ -116,13 +119,6 @@ const Examples: FC> = ({ ...restProps }) => {
text: 'Copy, open in explorer',
title: 'Hash component',
},
- {
- demo: ,
- href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Avatar.Avatar.html',
- icon: ,
- text: 'Address blockie avatar image',
- title: 'Avatar',
- },
{
demo: ,
href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
From 16d6ac8f60ccfb7c9afbcfeff9821428ce3102ab Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 15:36:25 -0300
Subject: [PATCH 013/228] fix: remove console.log
---
src/components/sharedComponents/TokenInput/index.tsx | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/components/sharedComponents/TokenInput/index.tsx b/src/components/sharedComponents/TokenInput/index.tsx
index 72f1e397..ae5161bf 100644
--- a/src/components/sharedComponents/TokenInput/index.tsx
+++ b/src/components/sharedComponents/TokenInput/index.tsx
@@ -165,7 +165,6 @@ const TokenInput: FC = ({
)
const handleSetAmount = (amount: string) => {
- console.log('amount', amount)
setAmount(amount)
onAmountSet(amount)
}
From 4e0805660efd64fcb7d55557b66e1d37e86a5247 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 17:05:52 -0300
Subject: [PATCH 014/228] refactor: hashinput / hash demos
---
.../home/Examples/demos/HashDemo.tsx | 14 ++-
.../home/Examples/demos/HashInputDemo.tsx | 91 ++++++++++++++-----
.../pageComponents/home/Examples/index.tsx | 34 +++----
3 files changed, 94 insertions(+), 45 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/HashDemo.tsx b/src/components/pageComponents/home/Examples/demos/HashDemo.tsx
index 846d8f20..c5c2a1f2 100644
--- a/src/components/pageComponents/home/Examples/demos/HashDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/HashDemo.tsx
@@ -1,3 +1,4 @@
+import { type FC } from 'react'
import styled from 'styled-components'
import { Toast } from 'db-ui-toolkit'
@@ -10,7 +11,7 @@ import { getExplorerLink } from '@/src/utils/getExplorerLink'
const Wrapper = styled(Hash)`
[data-theme='light'] & {
--theme-hash-background-color: #fff;
- --theme-hash-border-color: #e2e0e7;
+ --theme-hash-border-color: #c5c2cb;
--theme-hash-color: #2e3048;
}
@@ -27,12 +28,14 @@ const Wrapper = styled(Hash)`
cursor: default;
font-size: 1.6rem;
height: 34px;
+ min-width: 0;
padding: 0 calc(var(--base-common-padding) * 2);
`
interface Props {
chain: Chain
- hash: Address
+ hash: Address | undefined
+ truncatedHashLength?: number | 'disabled'
}
/**
@@ -41,7 +44,7 @@ interface Props {
* Some styles were added. Also we show a toast when the copy button is clicked
* to let the user know that something has happened.
*/
-const HashDemo = ({ chain, hash }: Props) => {
+const HashDemo: FC = ({ chain, hash, ...restProps }) => {
const onCopy = (message: string) => {
const timeDelay = 2500
@@ -53,14 +56,15 @@ const HashDemo = ({ chain, hash }: Props) => {
})
}
- return (
+ return hash ? (
onCopy(hash)}
showCopyButton
+ {...restProps}
/>
- )
+ ) : null
}
export default HashDemo
diff --git a/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
index 0d6a0bbe..d4decb4f 100644
--- a/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
@@ -1,10 +1,13 @@
import { useState } from 'react'
-import styled from 'styled-components'
+import styled, { css } from 'styled-components'
-import { Textfield as BaseTextfield, Spinner } from 'db-ui-toolkit'
-import { mainnet } from 'viem/chains'
+import { Textfield as BaseTextfield, Spinner, breakpointMediaQuery } from 'db-ui-toolkit'
+import { type Address } from 'viem'
+import * as chains from 'viem/chains'
+import HashDemo from '@/src/components/pageComponents/home/Examples/demos/HashDemo'
import HashInput from '@/src/components/sharedComponents/HashInput'
+import { useWeb3Status } from '@/src/hooks/useWeb3Status'
import { DetectedHash } from '@/src/utils/hash'
const AlertIcon = () => (
@@ -36,6 +39,13 @@ const IconOK = ({ ...restProps }) => (
)
const Wrapper = styled.div`
+ position: relative;
+ width: 100%;
+ display: grid;
+ row-gap: var(--base-gap);
+`
+
+const InputWrapper = styled.div`
--base-horizontal-padding: var(--base-common-padding-xl);
--base-textfield-padding: 0 var(--base-horizontal-padding);
--base-textfield-border-radius: var(--base-border-radius);
@@ -123,41 +133,74 @@ const StatusMessage = styled.div`
z-index: 5;
`
+const HashExplorer = styled(HashDemo)`
+ font-size: 1.4rem;
+ width: 100%;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ position: absolute;
+ top: calc(100% + var(--base-gap));
+ `,
+ )}
+`
+
+/**
+ * This demo shows how to use the HashInput and Hash components.
+ *
+ * We use `HashInput` to validate an address or tx hash, and `Hash` to allow the
+ * user to copy it or open it in an block explorer.
+ */
const HashInputDemo = ({ ...restProps }) => {
const [searchResult, setSearchResult] = useState(null)
const [loading, setLoading] = useState()
const notFound = searchResult && searchResult.type === null
const found = searchResult && searchResult.type !== null
+ const { isWalletConnected, walletChainId } = useWeb3Status()
const onLoading = (isLoading: boolean) => {
setLoading(isLoading)
}
+ const findChain = (chainId: number) => Object.values(chains).find((chain) => chain.id === chainId)
+
+ // mainnet is the default chain if not connected or the chain is not found
+ const currentChain =
+ isWalletConnected && walletChainId ? findChain(walletChainId) || chains.mainnet : chains.mainnet
+
return (
- (
-
+
+ (
+
+ )}
+ />
+ {loading && (
+
+
+
+ )}
+ {found && !loading && }
+ {notFound && (
+
+ No results found
+
)}
+
+
- {loading && (
-
-
-
- )}
- {found && !loading && }
- {notFound && (
-
- No results found
-
- )}
)
}
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 4084c9a0..8831a6c9 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -2,13 +2,10 @@ import { type FC, type HTMLAttributes } from 'react'
import styled, { css } from 'styled-components'
import { InnerContainer as Inner, ContainerPadding, breakpointMediaQuery } from 'db-ui-toolkit'
-import { mainnet } from 'viem/chains'
-import { useAccount } from 'wagmi'
import { Props as ItemProps } from '@/src/components/pageComponents/home/Examples/Item'
import List from '@/src/components/pageComponents/home/Examples/List'
import ImgEns from '@/src/components/pageComponents/home/Examples/assets/Ens'
-import ImgHash from '@/src/components/pageComponents/home/Examples/assets/Hash'
import ImgInputAddress from '@/src/components/pageComponents/home/Examples/assets/InputAddress'
import ImgSign from '@/src/components/pageComponents/home/Examples/assets/Sign'
import ImgSubgraph from '@/src/components/pageComponents/home/Examples/assets/Subgraph'
@@ -21,7 +18,6 @@ import ImgUserCheck from '@/src/components/pageComponents/home/Examples/assets/U
import ImgWallet from '@/src/components/pageComponents/home/Examples/assets/Wallet'
import ERC20ApproveAndTransferButtonDemo from '@/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo'
import EnsNameDemo from '@/src/components/pageComponents/home/Examples/demos/EnsNameDemo'
-import HashDemo from '@/src/components/pageComponents/home/Examples/demos/HashDemo'
import HashInputDemo from '@/src/components/pageComponents/home/Examples/demos/HashInputDemo'
import SignMessageDemo from '@/src/components/pageComponents/home/Examples/demos/SignMessageDemo'
import SubgraphDemo from '@/src/components/pageComponents/home/Examples/demos/SubgraphDemo'
@@ -63,7 +59,6 @@ const InnerContainer = styled(Inner)`
`
const Examples: FC> = ({ ...restProps }) => {
- const { address = '0x87885AaEEdED51C7e3858a782644F5d89759f245' } = useAccount()
const items: ItemProps[] = [
{
demo: ,
@@ -79,7 +74,7 @@ const Examples: FC> = ({ ...restProps }) => {
>
avatar
{' '}
- and address
+ and address.
>
),
title: 'Wallet connectivity',
@@ -88,8 +83,13 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Hash.Hash.html',
icon: ,
- text: 'Validate address, ENS or transaction hash',
- title: 'Hash input',
+ text: (
+ <>
+ Validate an address or hash. Also copy or open it in the block explorer for the chain your
+ wallet is connected to (defaults to mainnet)
+ >
+ ),
+ title: 'Hash handling',
},
{
demo: ,
@@ -112,13 +112,7 @@ const Examples: FC> = ({ ...restProps }) => {
text: 'Add or switch networks',
title: 'Add / switch network',
},
- {
- demo: ,
- href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Hash.Hash.html',
- icon: ,
- text: 'Copy, open in explorer',
- title: 'Hash component',
- },
+
{
demo: ,
href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
@@ -137,7 +131,15 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://github.com/BootNodeDev/dAppBooster/blob/86a7b001d4e48b41b3a463f844a83f632eae8c39/src/pageComponents/home/Examples/demos/EnsNameDemo.tsx#L63',
icon: ,
- text: 'Resolve ENS names',
+ text: (
+ <>
+ Resolve{' '}
+
+ ENS
+ {' '}
+ names
+ >
+ ),
title: 'ENS name',
},
{
From e31ba0756274b65c2fcefaf465ebb60a58426631 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 17:19:58 -0300
Subject: [PATCH 015/228] fix: demo styles
---
.../pageComponents/home/Examples/Item/index.tsx | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/Item/index.tsx b/src/components/pageComponents/home/Examples/Item/index.tsx
index c84c8214..87426dc6 100644
--- a/src/components/pageComponents/home/Examples/Item/index.tsx
+++ b/src/components/pageComponents/home/Examples/Item/index.tsx
@@ -81,13 +81,17 @@ const Title = styled.h2`
`
const Text = styled.p`
- color: var(--theme-color-text-primary);
font-size: 1.6rem;
font-weight: 500;
line-height: 1.5;
margin: 0;
text-align: center;
+ &,
+ & a {
+ color: var(--theme-color-text-primary);
+ }
+
${breakpointMediaQuery(
'tabletPortraitStart',
css`
@@ -105,16 +109,15 @@ const Demo = styled.div`
flex: 1;
justify-content: center;
min-width: 0;
- padding: calc(var(--base-common-padding) * 7) var(--base-common-padding)
- calc(var(--base-common-padding) * 4);
+ padding: calc(var(--base-common-padding) * 6) var(--base-common-padding)
+ calc(var(--base-common-padding) * 3);
position: relative;
${breakpointMediaQuery(
'tabletPortraitStart',
css`
min-height: 205px;
- padding: calc(var(--base-common-padding) * 7) calc(var(--base-common-padding) * 3)
- calc(var(--base-common-padding) * 3);
+ padding: calc(var(--base-common-padding) * 4) calc(var(--base-common-padding) * 3);
`,
)};
`
@@ -131,7 +134,7 @@ export interface Props extends HTMLAttributes {
demo: ReactNode
href?: string
icon: ReactNode
- text: string
+ text: string | ReactNode
title: string
}
From d87a9fa6fbefc3e676d9e30985dbfd95bec0e2eb Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 17:24:05 -0300
Subject: [PATCH 016/228] refactor: change component name
---
.../demos/{HashInputDemo.tsx => HashHandlingDemo.tsx} | 4 ++--
src/components/pageComponents/home/Examples/index.tsx | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
rename src/components/pageComponents/home/Examples/demos/{HashInputDemo.tsx => HashHandlingDemo.tsx} (98%)
diff --git a/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/HashHandlingDemo.tsx
similarity index 98%
rename from src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
rename to src/components/pageComponents/home/Examples/demos/HashHandlingDemo.tsx
index d4decb4f..b8056b55 100644
--- a/src/components/pageComponents/home/Examples/demos/HashInputDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/HashHandlingDemo.tsx
@@ -152,7 +152,7 @@ const HashExplorer = styled(HashDemo)`
* We use `HashInput` to validate an address or tx hash, and `Hash` to allow the
* user to copy it or open it in an block explorer.
*/
-const HashInputDemo = ({ ...restProps }) => {
+const HashHandlingDemo = ({ ...restProps }) => {
const [searchResult, setSearchResult] = useState(null)
const [loading, setLoading] = useState()
const notFound = searchResult && searchResult.type === null
@@ -205,4 +205,4 @@ const HashInputDemo = ({ ...restProps }) => {
)
}
-export default HashInputDemo
+export default HashHandlingDemo
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 8831a6c9..b8000f1a 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -18,7 +18,7 @@ import ImgUserCheck from '@/src/components/pageComponents/home/Examples/assets/U
import ImgWallet from '@/src/components/pageComponents/home/Examples/assets/Wallet'
import ERC20ApproveAndTransferButtonDemo from '@/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo'
import EnsNameDemo from '@/src/components/pageComponents/home/Examples/demos/EnsNameDemo'
-import HashInputDemo from '@/src/components/pageComponents/home/Examples/demos/HashInputDemo'
+import HashHandlingDemo from '@/src/components/pageComponents/home/Examples/demos/HashHandlingDemo'
import SignMessageDemo from '@/src/components/pageComponents/home/Examples/demos/SignMessageDemo'
import SubgraphDemo from '@/src/components/pageComponents/home/Examples/demos/SubgraphDemo'
import SubgraphStatusDemo from '@/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo'
@@ -80,7 +80,7 @@ const Examples: FC> = ({ ...restProps }) => {
title: 'Wallet connectivity',
},
{
- demo: ,
+ demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Hash.Hash.html',
icon: ,
text: (
From df9b0104cc581cdf283054557336890f1e150c36 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 17:25:28 -0300
Subject: [PATCH 017/228] fix: change wording
---
.../pageComponents/home/Examples/index.tsx | 26 ++++++++++++++-----
1 file changed, 19 insertions(+), 7 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index b8000f1a..0683adf2 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -85,8 +85,8 @@ const Examples: FC> = ({ ...restProps }) => {
icon: ,
text: (
<>
- Validate an address or hash. Also copy or open it in the block explorer for the chain your
- wallet is connected to (defaults to mainnet)
+ Validate an address or hash. Copy or open it in the block explorer for the chain your
+ wallet is connected to (defaults to mainnet).
>
),
title: 'Hash handling',
@@ -95,7 +95,19 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenDropdown.TokenDropdown.html',
icon: ,
- text: 'Dynamic token list dropdown',
+ text: (
+ <>
+ Allows you to search or select tokens from a list. Uses oure{' '}
+
+ TokenSelect
+ {' '}
+ component internally.
+ >
+ ),
title: 'Token dropdown',
},
{
@@ -109,7 +121,7 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SwitchNetwork.SwitchNetwork.html',
icon: ,
- text: 'Add or switch networks',
+ text: 'Learn how to add or switch networks in supported wallets.',
title: 'Add / switch network',
},
@@ -117,14 +129,14 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
icon: ,
- text: 'Support for connecting with subgraphs',
- title: 'Subgraph',
+ text: 'Connect to subgraphs and fetch data from the blockchain the easy way.',
+ title: 'Subgraphs',
},
{
demo: ,
href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
icon: ,
- text: 'Subgraph syncing status',
+ text: 'Easily check subgraph syncing status.',
title: 'Subgraph status',
},
{
From f14f647f0e04a0bfca8ee7c3e79e406d58e8ab42 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 19:46:01 -0300
Subject: [PATCH 018/228] feat: add options button and dropdown for demo items
---
.../home/Examples/demos/OptionsButton.tsx | 73 +++++++++++++++++++
.../home/Examples/demos/OptionsDropdown.tsx | 13 ++++
2 files changed, 86 insertions(+)
create mode 100644 src/components/pageComponents/home/Examples/demos/OptionsButton.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/OptionsDropdown.tsx
diff --git a/src/components/pageComponents/home/Examples/demos/OptionsButton.tsx b/src/components/pageComponents/home/Examples/demos/OptionsButton.tsx
new file mode 100644
index 00000000..ee79b87e
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/OptionsButton.tsx
@@ -0,0 +1,73 @@
+import styled from 'styled-components'
+
+import { Button } from 'db-ui-toolkit'
+
+const ChevronDown = ({ ...restProps }) => (
+
+
+
+)
+
+export const OptionsButton = styled(Button).attrs(({ children }) => {
+ return {
+ $variant: 'options',
+ children: (
+ <>
+ {children}
+ >
+ ),
+ }
+})`
+ [data-theme='light'] & {
+ --theme-button-options-background-color: #f7f7f7;
+ --theme-button-options-background-color-hover: #f7f7f7;
+
+ --theme-button-options-border-color: #e2e0e7;
+ --theme-button-options-border-color-hover: #4b4d60;
+
+ --theme-button-options-color: #4b4d60;
+ --theme-button-options-color-hover: #4b4d60;
+
+ --theme-button-options-background-color-disabled: #f7f7f7;
+ --theme-button-options-border-color-disabled: #e2e0e7;
+ --theme-button-options-color-disabled: #4b4d60;
+ }
+
+ [data-theme='dark'] & {
+ --theme-button-options-background-color: transparent;
+ --theme-button-options-background-color-hover: transparent;
+
+ --theme-button-options-border-color: #c5c2cb;
+ --theme-button-options-border-color-hover: #fff;
+
+ --theme-button-options-color: #c5c2cb;
+ --theme-button-options-color-hover: #fff;
+
+ --theme-button-options-background-color-disabled: transparent;
+ --theme-button-options-border-color-disabled: #c5c2cb;
+ --theme-button-options-color-disabled: #c5c2cb;
+ }
+
+ font-weight: 500;
+ font-size: 1.2rem;
+ height: 27px;
+ padding: 0 var(--base-common-padding);
+
+ svg {
+ transition: transform var(--base-transition-duration-sm);
+ }
+
+ &.isOpen svg {
+ transform: rotate(180deg);
+ }
+`
diff --git a/src/components/pageComponents/home/Examples/demos/OptionsDropdown.tsx b/src/components/pageComponents/home/Examples/demos/OptionsDropdown.tsx
new file mode 100644
index 00000000..e9f47905
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/OptionsDropdown.tsx
@@ -0,0 +1,13 @@
+import styled from 'styled-components'
+
+import { Dropdown } from 'db-ui-toolkit'
+
+export const OptionsDropdown = styled(Dropdown).attrs(() => {
+ return {
+ position: 'right',
+ }
+})`
+ position: absolute;
+ top: 10px;
+ right: calc(var(--base-gap) + var(--base-gap-sm));
+`
From 31c12fc91f7bdd0d5b3e8c9ebfeec730ba92dd81 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 19:46:40 -0300
Subject: [PATCH 019/228] feat: update token input demo
---
.../home/Examples/demos/TokenInputDemo.tsx | 86 ++++++++++++++++---
.../pageComponents/home/Examples/index.tsx | 14 ++-
2 files changed, 85 insertions(+), 15 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
index bc14efac..b6887b69 100644
--- a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
@@ -1,7 +1,11 @@
import { useEffect, useState } from 'react'
+import styled, { css } from 'styled-components'
+import { Item, breakpointMediaQuery } from 'db-ui-toolkit'
import { arbitrum, mainnet, polygon, optimism } from 'viem/chains'
+import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
+import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
import Arbitrum from '@/src/components/pageComponents/home/Examples/demos/assets/Arbitrum'
import Eth from '@/src/components/pageComponents/home/Examples/demos/assets/Eth'
import Optimism from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
@@ -13,7 +17,25 @@ import { useTokenSearch } from '@/src/hooks/useTokenSearch'
import { useWeb3Status } from '@/src/hooks/useWeb3Status'
import { type Token } from '@/src/types/token'
-const TokenInputDemo = ({ singleToken }: { singleToken?: boolean }) => {
+const Wrapper = styled.div`
+ max-width: 100%;
+ padding-top: var(--base-common-padding);
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ padding-top: calc(var(--base-common-padding) * 3);
+ `,
+ )}
+`
+
+type Options = 'single' | 'multi'
+
+/**
+ * This demo uses the TokenInput component to show how to use it in a single
+ * token or multi token mode.
+ */
+const TokenInputDemo = () => {
const { isWalletConnected } = useWeb3Status()
const [currentNetworkId, setCurrentNetworkId] = useState()
const [currentToken, setCurrentToken] = useState()
@@ -67,20 +89,56 @@ const TokenInputDemo = ({ singleToken }: { singleToken?: boolean }) => {
error && console.log(error)
}, [currentToken, amount, error])
+ const dropdownItems = [
+ { label: 'Single token', type: 'single' },
+ { label: 'Multi token', type: 'multi' },
+ ]
+ const [currentTokenInput, setCurrentTokenInput] = useState('single')
+
return (
-
+
+
+ {dropdownItems.find((item) => item.type === currentTokenInput)?.label}
+
+ }
+ defaultActiveItem={0}
+ items={dropdownItems.map((item, index) => (
+ - setCurrentTokenInput(item.type as Options)}>
+ {item.label}
+
+ ))}
+ />
+ {currentTokenInput === 'multi' && (
+
+ )}
+ {currentTokenInput === 'single' && (
+
+ )}
+
)
}
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 0683adf2..0091a3fe 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -114,7 +114,19 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenInput.TokenInput.html',
icon: ,
- text: 'Input with max, user balance, decimals',
+ text: (
+ <>
+
+ Select a token
+ {' '}
+ or specify one beforehand, enter a token amount, auto detect token decimals, user balance,
+ min and max boundaries, format numbers, max button.
+ >
+ ),
title: 'Token input',
},
{
From 0f879334d5a7fba73d628d948903d6fc1faa80b8 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 20:13:53 -0300
Subject: [PATCH 020/228] refactor: added subgraphs demo dropdown
---
.../home/Examples/demos/SubgraphDemo/List.tsx | 56 ++++++++++++++-----
1 file changed, 43 insertions(+), 13 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
index 38e9cebb..b3c0db7a 100644
--- a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
@@ -1,3 +1,4 @@
+import { useState } from 'react'
import styled, { css } from 'styled-components'
import { useSuspenseQuery } from '@tanstack/react-query'
@@ -7,11 +8,14 @@ import {
Toast,
SkeletonLoading,
breakpointMediaQuery,
+ Item,
} from 'db-ui-toolkit'
import request from 'graphql-request'
import { toast } from 'react-hot-toast'
import { arbitrum, base, type Chain, optimism, polygon } from 'viem/chains'
+import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
+import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
import ArbitrumDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Arbitrum'
import BaseDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Base'
import OptimismDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
@@ -44,9 +48,9 @@ const Wrapper = styled.div`
display: flex;
flex-direction: column;
- max-width: 100%;
- padding: 0 var(--base-common-padding-xl);
+ padding: var(--base-common-padding) var(--base-common-padding-xl) 0;
row-gap: calc(var(--base-gap-xl) * 2);
+ width: 100%;
${breakpointMediaQuery(
'tabletPortraitStart',
@@ -55,6 +59,13 @@ const Wrapper = styled.div`
row-gap: calc(var(--base-gap-xl) * 3);
`,
)}
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ padding-top: calc(var(--base-common-padding) * 3);
+ `,
+ )}
`
const Group = styled.div`
@@ -62,6 +73,7 @@ const Group = styled.div`
display: flex;
flex-direction: column;
row-gap: var(--base-gap-xl);
+ padding: var(--base-common-padding-xl);
`
const Title = styled.h3`
@@ -173,10 +185,7 @@ const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
return (
-
- Uniswap pools
- {getNetworkIcon(chain.name.toLowerCase())}
-
+ Uniswap Pool {getNetworkIcon(chain.name.toLowerCase())}
{data.map((position) => (
{position.pool.symbol}
@@ -227,21 +236,42 @@ export const SkeletonLoadingItem = () => (
minHeight: '133px',
padding: '16px',
rowGap: '16px',
- width: '340px',
+ width: '100%',
}}
>
-
-
+
+
+
+
)
const List = ({ ...restProps }) => {
+ const [currentChain, setCurrentChain] = useState(uniswapNetworks[0])
+ const dropdownItems = [...uniswapNetworks, base]
+
return (
- {uniswapNetworks.map((chain) => (
- } />
- ))}
- } />
+
+ {dropdownItems.find((item) => item.name === currentChain?.name)?.name}
+
+ }
+ defaultActiveItem={0}
+ items={dropdownItems.map((item, index) => (
+ - setCurrentChain(item)}>
+ {item.name}
+
+ ))}
+ />
+ {uniswapNetworks.map(
+ (chain) =>
+ currentChain === chain && (
+ } />
+ ),
+ )}
+ {currentChain === base && } />}
)
}
From 914a1c30aa5af7114fe7006dbd6e7b858fd040a6 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 21:27:13 -0300
Subject: [PATCH 021/228] fix: padding
---
.../home/Examples/demos/SubgraphDemo/List.tsx | 60 +++++++++----------
1 file changed, 30 insertions(+), 30 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
index b3c0db7a..0aa8fa4f 100644
--- a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
@@ -48,22 +48,15 @@ const Wrapper = styled.div`
display: flex;
flex-direction: column;
- padding: var(--base-common-padding) var(--base-common-padding-xl) 0;
+ padding-top: var(--base-common-padding);
row-gap: calc(var(--base-gap-xl) * 2);
width: 100%;
${breakpointMediaQuery(
'tabletPortraitStart',
- css`
- padding: var(--base-common-padding-xl);
- row-gap: calc(var(--base-gap-xl) * 3);
- `,
- )}
-
- ${breakpointMediaQuery(
- 'desktopStart',
css`
padding-top: calc(var(--base-common-padding) * 3);
+ row-gap: calc(var(--base-gap-xl) * 3);
`,
)}
`
@@ -73,7 +66,14 @@ const Group = styled.div`
display: flex;
flex-direction: column;
row-gap: var(--base-gap-xl);
- padding: var(--base-common-padding-xl);
+ padding: 0 var(--base-common-padding);
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ padding: 0;
+ `,
+ )}
`
const Title = styled.h3`
@@ -169,6 +169,26 @@ export const getNetworkIcon = (chainName: string) => (
>
)
+export const SkeletonLoadingItem = () => (
+
+
+
+
+
+
+)
+
const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
const { data } = useSuspenseQuery({
queryKey: ['allUniswapPools', chain.id],
@@ -226,26 +246,6 @@ const Aave = withSuspenseAndRetry(() => {
const uniswapNetworks = [optimism, polygon, arbitrum]
-export const SkeletonLoadingItem = () => (
-
-
-
-
-
-
-)
-
const List = ({ ...restProps }) => {
const [currentChain, setCurrentChain] = useState(uniswapNetworks[0])
const dropdownItems = [...uniswapNetworks, base]
From 581452942adc928551b9b5aadfa20a32ebdb4f2f Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 21:54:34 -0300
Subject: [PATCH 022/228] fix: ens demo
---
.../home/Examples/demos/EnsNameDemo.tsx | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
index 047bf899..0507290c 100644
--- a/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
@@ -1,7 +1,7 @@
import { useState, type ChangeEvent } from 'react'
-import styled from 'styled-components'
+import styled, { css } from 'styled-components'
-import { Spinner, Textfield } from 'db-ui-toolkit'
+import { Spinner, Textfield, breakpointMediaQuery } from 'db-ui-toolkit'
import { useDebouncedCallback } from 'use-debounce'
import { type Address } from 'viem'
import { useEnsName } from 'wagmi'
@@ -39,6 +39,13 @@ const Wrapper = styled.div`
padding: var(--base-common-padding-xl);
row-gap: var(--base-gap);
width: 100%;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ margin-top: calc(var(--base-common-padding) * 3);
+ `,
+ )}
`
const Title = styled.h3`
From b6cf2cfd423de6159d9cb5b6337b91bedb5032ac Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 16 Aug 2024 21:58:37 -0300
Subject: [PATCH 023/228] fix: typo
---
src/components/pageComponents/home/Examples/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 54437091..f8bf98ec 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -97,7 +97,7 @@ const Examples: FC> = ({ ...restProps }) => {
icon: ,
text: (
<>
- Allows you to search or select tokens from a list. Uses oure{' '}
+ Allows you to search or select tokens from a list. Uses our{' '}
Date: Mon, 19 Aug 2024 12:18:29 -0300
Subject: [PATCH 024/228] feat: enhance ENS demo
---
.../home/Examples/demos/EnsNameDemo.tsx | 48 +++++++++++++++++--
.../pageComponents/home/Examples/index.tsx | 2 +-
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
index 0507290c..5fec4558 100644
--- a/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
@@ -1,12 +1,15 @@
-import { useState, type ChangeEvent } from 'react'
+import { useEffect, useState, type ChangeEvent } from 'react'
import styled, { css } from 'styled-components'
-import { Spinner, Textfield, breakpointMediaQuery } from 'db-ui-toolkit'
+import { Spinner, Textfield, breakpointMediaQuery, Item } from 'db-ui-toolkit'
import { useDebouncedCallback } from 'use-debounce'
import { type Address } from 'viem'
import { useEnsName } from 'wagmi'
import { mainnet } from 'wagmi/chains'
+import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
+import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
+
const Wrapper = styled.div`
[data-theme='light'] & {
--theme-token-ens-name-background: #fff;
@@ -67,6 +70,13 @@ const ENSName = styled.div`
padding-top: var(--base-common-padding);
`
+const ButtonText = styled.span`
+ display: block;
+ max-width: 100px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+`
+
const EnsNameSearch = ({ address }: { address?: Address }) => {
const { data, error, status } = useEnsName({
address: address,
@@ -104,12 +114,44 @@ const EnsNameDemo = () => {
debouncedSearch(value)
}
+ const dropdownItems = [
+ '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
+ '0xaed56A64169A1eD7fFD83619A211b55a13f9F974',
+ '0x14536667Cd30e52C0b458BaACcB9faDA7046E056',
+ '0x8BCBd56588d77cd06C7930c09aB55ca7EF09b395',
+ ]
+ const [currentItem, setCurrentItem] = useState()
+
+ useEffect(() => {
+ debouncedSearch(value as Address)
+ }, [debouncedSearch, value])
+
return (
+
+
+ {dropdownItems.find((item) => item === currentItem) || 'Select an address'}
+
+
+ }
+ items={dropdownItems.map((item, index) => (
+ - {
+ setCurrentItem(item)
+ setValue(item as Address)
+ }}
+ >
+ {item}
+
+ ))}
+ />
Find ENS name
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index f8bf98ec..52962164 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -161,7 +161,7 @@ const Examples: FC> = ({ ...restProps }) => {
ENS
{' '}
- names
+ names to their corresponding addresses.
>
),
title: 'ENS name',
From 34aabc23e186baf7912cf593da86fb65bcd5978c Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 12:38:21 -0300
Subject: [PATCH 025/228] feat: add connect button to add / switch network demo
---
.../home/Examples/demos/SwitchNetworkDemo.tsx | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx b/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx
index 534bd878..e90c23b8 100644
--- a/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx
@@ -5,8 +5,11 @@ import Eth from '@/src/components/pageComponents/home/Examples/demos/assets/Eth'
import Optimism from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
import Polygon from '@/src/components/pageComponents/home/Examples/demos/assets/Polygon'
import SwitchNetwork, { type Networks } from '@/src/components/sharedComponents/SwitchNetwork'
+import { useWeb3Status } from '@/src/hooks/useWeb3Status'
+import { ConnectWalletButton } from '@/src/providers/Web3Provider'
const SwitchNetworkDemo = () => {
+ const { isWalletConnected } = useWeb3Status()
const networks: Networks = [
{
icon: ,
@@ -30,7 +33,11 @@ const SwitchNetworkDemo = () => {
},
]
- return
+ return isWalletConnected ? (
+
+ ) : (
+
+ )
}
export default SwitchNetworkDemo
From 4ac47caa57e73f034d92e1e62f068dc4fbf901de Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 13:26:29 -0300
Subject: [PATCH 026/228] chore: remove unused components
---
.../home/Examples/assets/Hash.tsx | 25 ---------------
.../home/Examples/assets/UserCheck.tsx | 32 -------------------
2 files changed, 57 deletions(-)
delete mode 100644 src/components/pageComponents/home/Examples/assets/Hash.tsx
delete mode 100644 src/components/pageComponents/home/Examples/assets/UserCheck.tsx
diff --git a/src/components/pageComponents/home/Examples/assets/Hash.tsx b/src/components/pageComponents/home/Examples/assets/Hash.tsx
deleted file mode 100644
index fb930639..00000000
--- a/src/components/pageComponents/home/Examples/assets/Hash.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { type FC, type HTMLAttributes } from 'react'
-import { styled } from 'styled-components'
-
-const Wrapper = styled.svg`
- display: block;
- flex-shrink: 0;
-`
-
-const Icon: FC> = ({ ...restProps }) => (
-
-
-
-)
-
-export default Icon
diff --git a/src/components/pageComponents/home/Examples/assets/UserCheck.tsx b/src/components/pageComponents/home/Examples/assets/UserCheck.tsx
deleted file mode 100644
index 1640bdf5..00000000
--- a/src/components/pageComponents/home/Examples/assets/UserCheck.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { type FC, type HTMLAttributes } from 'react'
-import { styled } from 'styled-components'
-
-const Wrapper = styled.svg`
- display: block;
- flex-shrink: 0;
-`
-
-const Icon: FC> = ({ ...restProps }) => (
-
-
-
-
-
-
-
-
-
-
-)
-
-export default Icon
From f975cdc66c5206afe3dc9b6b023d65c8290c4d3d Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 13:27:10 -0300
Subject: [PATCH 027/228] refactor: merge ERC20 and tx button token demos into
one
---
.../ERC20ApproveAndTransferButton.tsx | 0
.../index.tsx | 11 ++--
.../NativeTokenDemo.tsx} | 31 ++++-------
.../demos/TransactionButtonDemo/index.tsx | 53 +++++++++++++++++++
.../pageComponents/home/Examples/index.tsx | 16 +++---
5 files changed, 76 insertions(+), 35 deletions(-)
rename src/components/pageComponents/home/Examples/demos/{ => TransactionButtonDemo}/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx (100%)
rename src/components/pageComponents/home/Examples/demos/{ => TransactionButtonDemo}/ERC20ApproveAndTransferButtonDemo/index.tsx (90%)
rename src/components/pageComponents/home/Examples/demos/{TransactionButtonDemo.tsx => TransactionButtonDemo/NativeTokenDemo.tsx} (75%)
create mode 100644 src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx
diff --git a/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
similarity index 100%
rename from src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
rename to src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
diff --git a/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
similarity index 90%
rename from src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/index.tsx
rename to src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
index c9fef087..c078c6f6 100644
--- a/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
@@ -5,7 +5,7 @@ import { type Address, formatUnits } from 'viem'
import { sepolia } from 'viem/chains'
import { useWriteContract } from 'wagmi'
-import ERC20ApproveAndTransferButton from '@/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton'
+import ERC20ApproveAndTransferButton from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton'
import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
import { useSuspenseReadErc20BalanceOf } from '@/src/hooks/generated'
@@ -63,7 +63,12 @@ const ABIExample = [
},
] as const
-const ApproveAndSendDemo = withWalletStatusVerifier(
+/**
+ * This demo shows how to approve and send an ERC20 token transaction using the `TransactionButton` component.
+ *
+ * Works only on Sepolia chain.
+ */
+const ERC20ApproveAndTransferButtonDemo = withWalletStatusVerifier(
withSuspense(() => {
const { Dialog, close, open } = useDialog()
const { address } = useWeb3StatusConnected()
@@ -128,4 +133,4 @@ const ApproveAndSendDemo = withWalletStatusVerifier(
{ chainId: sepolia.id }, // this DEMO component only works on sepolia chain
)
-export default ApproveAndSendDemo
+export default ERC20ApproveAndTransferButtonDemo
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
similarity index 75%
rename from src/components/pageComponents/home/Examples/demos/TransactionButtonDemo.tsx
rename to src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
index 9c02aabe..2018e7fb 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
@@ -2,9 +2,9 @@ import { useState, type ReactElement } from 'react'
import styled, { css } from 'styled-components'
import { useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
-import { type Hash, type TransactionReceipt, erc20Abi, parseEther } from 'viem'
+import { type Hash, type TransactionReceipt, parseEther } from 'viem'
import { sepolia } from 'viem/chains'
-import { useSendTransaction, useWriteContract } from 'wagmi'
+import { useSendTransaction } from 'wagmi'
import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
@@ -32,12 +32,16 @@ const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
`}
`
-const TransactionButtonDemo = withWalletStatusVerifier(
+/**
+ * This demo shows how to send a native token transaction.
+ *
+ * Works only on Sepolia chain.
+ */
+const NativeTokenDemo = withWalletStatusVerifier(
() => {
const { Dialog, close, open } = useDialog()
const { address } = useWeb3StatusConnected()
const { sendTransactionAsync } = useSendTransaction()
- const { writeContractAsync } = useWriteContract()
const [minedMessage, setMinedMessage] = useState()
const handleOnMined = (receipt: TransactionReceipt) => {
@@ -57,26 +61,9 @@ const TransactionButtonDemo = withWalletStatusVerifier(
})
}
- const handleWriteContract = (): Promise => {
- // Send ERC20 token [USDC]
- return writeContractAsync({
- abi: erc20Abi,
- address: '0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8', // USDC
- functionName: 'transfer',
- args: [address, 100000000n], // 100 USDC
- })
- }
-
return (
<>
-
- Send 100 USDC
-
{
+ const dropdownItems = [
+ { label: 'ERC20 token (USDC)', type: 'erc20' },
+ { label: 'ETH (Native)', type: 'native' },
+ ]
+ const [currentTokenInput, setCurrentTokenInput] = useState('erc20')
+
+ return (
+
+
+ {dropdownItems.find((item) => item.type === currentTokenInput)?.label}
+
+ }
+ defaultActiveItem={0}
+ items={dropdownItems.map((item, index) => (
+ - setCurrentTokenInput(item.type as Options)}>
+ {item.label}
+
+ ))}
+ />
+ {currentTokenInput === 'erc20' && }
+ {currentTokenInput === 'native' && }
+
+ )
+}
+
+export default TransactionButtonDemo
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 52962164..8601a9fd 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -14,9 +14,7 @@ import ImgSwitch from '@/src/components/pageComponents/home/Examples/assets/Swit
import ImgTokenInput from '@/src/components/pageComponents/home/Examples/assets/TokenInput'
import ImgTokenList from '@/src/components/pageComponents/home/Examples/assets/TokenList'
import ImgTransaction from '@/src/components/pageComponents/home/Examples/assets/Transaction'
-import ImgUserCheck from '@/src/components/pageComponents/home/Examples/assets/UserCheck'
import ImgWallet from '@/src/components/pageComponents/home/Examples/assets/Wallet'
-import ERC20ApproveAndTransferButtonDemo from '@/src/components/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo'
import EnsNameDemo from '@/src/components/pageComponents/home/Examples/demos/EnsNameDemo'
import HashHandlingDemo from '@/src/components/pageComponents/home/Examples/demos/HashHandlingDemo'
import SignMessageDemo from '@/src/components/pageComponents/home/Examples/demos/SignMessageDemo'
@@ -170,16 +168,14 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TransactionButton.TransactionButton.html',
icon: ,
- text: 'Send tokens from / to your address',
+ text: (
+ <>
+ Transfer native cryptocurrency to your own address, or check ERC20 allowance, approve
+ ERC20 use, and execute a demo transaction.
+ >
+ ),
title: 'Tx button',
},
- {
- demo: ,
- href: 'https://github.com/BootNodeDev/dAppBooster/blob/86a7b001d4e48b41b3a463f844a83f632eae8c39/src/pageComponents/home/Examples/demos/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx#L33',
- icon: ,
- text: 'Checks allowance and combines the approval and transaction buttons into one component',
- title: 'ERC20 approve and transfer',
- },
{
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SignButton.SignButton.html',
From dac8165b48832fae2fda82ad5e334f972e187d10 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 15:19:39 -0300
Subject: [PATCH 028/228] feat: make the erc20 demo better
---
.../ERC20ApproveAndTransferButton.tsx | 65 +++++++++++-----
.../index.tsx | 47 +++++++++--
.../demos/TransactionButtonDemo/Wrapper.tsx | 77 +++++++++++++++++++
.../demos/TransactionButtonDemo/index.tsx | 6 +-
.../pageComponents/home/Examples/index.tsx | 2 +-
5 files changed, 169 insertions(+), 28 deletions(-)
create mode 100644 src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper.tsx
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
index a087b4b1..c604e485 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
@@ -2,13 +2,16 @@ import { type FC } from 'react'
import styled from 'styled-components'
import { type Address, type TransactionReceipt, type Hash, erc20Abi } from 'viem'
+import * as chains from 'viem/chains'
import { useWriteContract } from 'wagmi'
+import Wrapper from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper'
import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
import { useSuspenseReadErc20Allowance } from '@/src/hooks/generated'
-import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
+import { useWeb3StatusConnected, useWeb3Status } from '@/src/hooks/useWeb3Status'
import { type Token } from '@/src/types/token'
+import { getExplorerLink } from '@/src/utils/getExplorerLink'
const Button = styled(PrimaryButton).attrs({ as: TransactionButton })`
font-size: 1.6rem;
@@ -58,6 +61,7 @@ const ERC20ApproveAndTransferButton: FC = ({
}) => {
const { address } = useWeb3StatusConnected()
const { writeContractAsync } = useWriteContract()
+ const { isWalletConnected, walletChainId } = useWeb3Status()
const { data: allowance, refetch: getAllowance } = useSuspenseReadErc20Allowance({
address: token.address as Address, // TODO: token.address should be Address type
@@ -75,26 +79,51 @@ const ERC20ApproveAndTransferButton: FC = ({
})
}
+ const findChain = (chainId: number) => Object.values(chains).find((chain) => chain.id === chainId)
+
+ // mainnet is the default chain if not connected or the chain is not found
+ const currentChain =
+ isWalletConnected && walletChainId ? findChain(walletChainId) || chains.mainnet : chains.mainnet
+
return isApprovalRequired ? (
- getAllowance()}
- transaction={handleApprove}
- >
- Approve {token.symbol}
-
+
+ getAllowance()}
+ transaction={handleApprove}
+ >
+ Approve
+
+
) : (
-
+ Supply {token.symbol} to the{' '}
+
+ AAVE staging contract
+
+ .
+ >
+ }
+ title="Transaction required"
>
- {label}
-
+
+ {label}
+
+
)
}
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
index c078c6f6..966b6eb6 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
@@ -1,11 +1,12 @@
import styled, { css } from 'styled-components'
-import { ExternalLink, Text, useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+import { ExternalLink, useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
import { type Address, formatUnits } from 'viem'
import { sepolia } from 'viem/chains'
import { useWriteContract } from 'wagmi'
import ERC20ApproveAndTransferButton from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton'
+import Wrapper from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper'
import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
import { useSuspenseReadErc20BalanceOf } from '@/src/hooks/generated'
@@ -22,7 +23,35 @@ const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
`}
`
-// USDC token on sepolia chain
+const Button = styled(PrimaryButton)`
+ margin: 0 auto;
+ width: 100%;
+`
+
+const ExternalLinkIcon = () => (
+
+
+
+
+
+)
+
+// USDC token on Sepolia chain
const tokenUSDC_sepolia: Token = {
address: '0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8',
chainId: sepolia.id,
@@ -100,12 +129,14 @@ const ERC20ApproveAndTransferButtonDemo = withWalletStatusVerifier(
return (
<>
{balance < amount ? (
- <>
- Not enough USDC!
-
- Mint {formattedAmount} USDC
-
- >
+
+
+ Sepolia USDC faucet
+
+
) : (
, 'title'> {
+ text?: string | ReactNode
+ title: string | ReactNode
+}
+
+const WrapperComponent: FC = ({ children, text, title, ...restProps }) => {
+ return (
+
+ {title}
+ {children}
+ {text && {text} }
+
+ )
+}
+
+export default WrapperComponent
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx
index 0030208f..124826cd 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx
@@ -9,8 +9,12 @@ import ERC20ApproveAndTransferButtonDemo from '@/src/components/pageComponents/h
import NativeTokenDemo from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo'
const Wrapper = styled.div`
- max-width: 100%;
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
padding-top: var(--base-common-padding);
+ width: 100%;
${breakpointMediaQuery(
'desktopStart',
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 8601a9fd..0b622b4a 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -174,7 +174,7 @@ const Examples: FC> = ({ ...restProps }) => {
ERC20 use, and execute a demo transaction.
>
),
- title: 'Tx button',
+ title: 'Transaction button',
},
{
demo: ,
From e10d26097514866d7783421f5d34ace6e0ccecab Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 15:30:48 -0300
Subject: [PATCH 029/228] feat: make the native token demo look a little better
---
.../demos/TransactionButtonDemo/NativeTokenDemo.tsx | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
index 2018e7fb..6baea01e 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
@@ -6,16 +6,12 @@ import { type Hash, type TransactionReceipt, parseEther } from 'viem'
import { sepolia } from 'viem/chains'
import { useSendTransaction } from 'wagmi'
+import Wrapper from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper'
import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
-const Wrapper = styled.div`
- display: grid;
- row-gap: var(--base-gap-xl);
-`
-
const Button = styled(PrimaryButton).attrs({ as: TransactionButton })`
font-size: 1.6rem;
font-weight: 500;
@@ -63,13 +59,16 @@ const NativeTokenDemo = withWalletStatusVerifier(
return (
<>
-
+
- Send 0.1 ETH
+ Send 0.1 Sepolia ETH
From ac0b50e0436c254be90c6e82d4a54be2ed5186d2 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 15:33:11 -0300
Subject: [PATCH 030/228] chore: change wording
---
src/components/pageComponents/home/Examples/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 0b622b4a..7a370e7b 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -180,7 +180,7 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SignButton.SignButton.html',
icon: ,
- text: 'Sign a message and get the signature',
+ text: 'Sign a message with your wallet and get the signature on a dialog.',
title: 'Sign button',
},
]
From f75be6325de83cfef9753bb29f10f8b6e4679cca Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 16:00:55 -0300
Subject: [PATCH 031/228] chore: add source code links
---
.../home/Examples/Item/SourceCodeButton.tsx | 60 +++++++++++++++++++
.../home/Examples/Item/index.tsx | 16 ++++-
.../pageComponents/home/Examples/index.tsx | 20 ++++++-
3 files changed, 93 insertions(+), 3 deletions(-)
create mode 100644 src/components/pageComponents/home/Examples/Item/SourceCodeButton.tsx
diff --git a/src/components/pageComponents/home/Examples/Item/SourceCodeButton.tsx b/src/components/pageComponents/home/Examples/Item/SourceCodeButton.tsx
new file mode 100644
index 00000000..929d0a2f
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/Item/SourceCodeButton.tsx
@@ -0,0 +1,60 @@
+import styled from 'styled-components'
+
+import { Button } from 'db-ui-toolkit'
+
+const Icon = () => (
+
+
+
+)
+
+const SourceCodeButton = styled(Button).attrs(() => {
+ return {
+ $variant: 'source',
+ children: (
+ <>
+ Source code
+ >
+ ),
+ }
+})`
+ [data-theme='light'] & {
+ --theme-button-source-background-color: transparent;
+ --theme-button-source-background-color-hover: transparent;
+
+ --theme-button-source-border-color: #e2e0e7;
+ --theme-button-source-border-color-hover: #4b4d60;
+
+ --theme-button-source-color: #4b4d60;
+ --theme-button-source-color-hover: #4b4d60;
+
+ --theme-button-source-background-color-disabled: transparent;
+ --theme-button-source-border-color-disabled: #e2e0e7;
+ --theme-button-source-color-disabled: #4b4d60;
+ }
+
+ [data-theme='dark'] & {
+ --theme-button-source-background-color: transparent;
+ --theme-button-source-background-color-hover: transparent;
+
+ --theme-button-source-border-color: #c5c2cb;
+ --theme-button-source-border-color-hover: #fff;
+
+ --theme-button-source-color: #c5c2cb;
+ --theme-button-source-color-hover: #fff;
+
+ --theme-button-source-background-color-disabled: transparent;
+ --theme-button-source-border-color-disabled: #c5c2cb;
+ --theme-button-source-color-disabled: #c5c2cb;
+ }
+
+ font-size: 1.4rem;
+ font-weight: 500;
+ height: 43px;
+ max-width: fit-content;
+`
+
+export default SourceCodeButton
diff --git a/src/components/pageComponents/home/Examples/Item/index.tsx b/src/components/pageComponents/home/Examples/Item/index.tsx
index 87426dc6..36929898 100644
--- a/src/components/pageComponents/home/Examples/Item/index.tsx
+++ b/src/components/pageComponents/home/Examples/Item/index.tsx
@@ -5,6 +5,7 @@ import { breakpointMediaQuery } from 'db-ui-toolkit'
import BaseBadge from '@/src/components/pageComponents/home/Examples/Item/Badge'
import DocumentationButton from '@/src/components/pageComponents/home/Examples/Item/DocumentationButton'
+import SourceCodeButton from '@/src/components/pageComponents/home/Examples/Item/SourceCodeButton'
const Wrapper = styled.div`
[data-theme='light'] & {
@@ -100,6 +101,13 @@ const Text = styled.p`
)};
`
+const Buttons = styled.div`
+ display: flex;
+ gap: var(--base-gap);
+
+ ${breakpointMediaQuery('tabletPortraitStart', css``)};
+`
+
const Demo = styled.div`
align-items: center;
background-color: var(--theme-examples-list-background-color);
@@ -134,18 +142,22 @@ export interface Props extends HTMLAttributes {
demo: ReactNode
href?: string
icon: ReactNode
+ sourceCodeHref?: string
text: string | ReactNode
title: string
}
-const Item: FC = ({ demo, href, icon, text, title, ...restProps }) => {
+const Item: FC = ({ demo, href, icon, sourceCodeHref, text, title, ...restProps }) => {
return (
{icon}
{title}
{text}
- {href && }
+
+ {href && }
+ {sourceCodeHref && }
+
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index 7a370e7b..f5540ecc 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -81,6 +81,8 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Hash.Hash.html',
icon: ,
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/HashHandlingDemo.tsx#L155',
text: (
<>
Validate an address or hash. Copy or open it in the block explorer for the chain your
@@ -93,6 +95,8 @@ const Examples: FC> = ({ ...restProps }) => {
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenDropdown.TokenDropdown.html',
icon: ,
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/TokenDropdownDemo.tsx#L13',
text: (
<>
Allows you to search or select tokens from a list. Uses our{' '}
@@ -110,6 +114,8 @@ const Examples: FC> = ({ ...restProps }) => {
},
{
demo: ,
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx#L38',
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenInput.TokenInput.html',
icon: ,
text: (
@@ -129,6 +135,8 @@ const Examples: FC> = ({ ...restProps }) => {
},
{
demo: ,
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/SwitchNetworkDemo.tsx#L11',
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SwitchNetwork.SwitchNetwork.html',
icon: ,
text: 'Learn how to add or switch networks in supported wallets.',
@@ -136,6 +144,8 @@ const Examples: FC> = ({ ...restProps }) => {
},
{
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx#L249',
demo: ,
href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
icon: ,
@@ -143,6 +153,8 @@ const Examples: FC> = ({ ...restProps }) => {
title: 'Subgraphs',
},
{
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx#L178',
demo: ,
href: 'https://github.com/BootNodeDev/dAppBooster#subgraphs',
icon: ,
@@ -150,8 +162,10 @@ const Examples: FC> = ({ ...restProps }) => {
title: 'Subgraph status',
},
{
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx#L101',
demo: ,
- href: 'https://github.com/BootNodeDev/dAppBooster/blob/86a7b001d4e48b41b3a463f844a83f632eae8c39/src/pageComponents/home/Examples/demos/EnsNameDemo.tsx#L63',
+ href: 'https://github.com/BootNodeDev/dAppBooster/blob/86a7b001d4e48b41b3a463f844a83f632eae8c39/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx#L63',
icon: ,
text: (
<>
@@ -165,6 +179,8 @@ const Examples: FC> = ({ ...restProps }) => {
title: 'ENS name',
},
{
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx#L29',
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TransactionButton.TransactionButton.html',
icon: ,
@@ -177,6 +193,8 @@ const Examples: FC> = ({ ...restProps }) => {
title: 'Transaction button',
},
{
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx#L37',
demo: ,
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_SignButton.SignButton.html',
icon: ,
From f8d0ef2a6d49555238dea7054f6158aebf109cbb Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 17:45:07 -0300
Subject: [PATCH 032/228] fix: wording
---
.../ERC20ApproveAndTransferButton.tsx | 2 +-
.../ERC20ApproveAndTransferButtonDemo/index.tsx | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
index c604e485..51376d1b 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
@@ -112,7 +112,7 @@ const ERC20ApproveAndTransferButton: FC = ({
.
>
}
- title="Transaction required"
+ title="Execute the transaction"
>
{balance < amount ? (
From d2cab0d7072d36051058eb0c84180fad9582b9ca Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 18:18:13 -0300
Subject: [PATCH 033/228] fix: change button text
---
.../pageComponents/home/Examples/demos/SignMessageDemo.tsx | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
index fc45de11..cede05bc 100644
--- a/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
@@ -69,11 +69,7 @@ const SignMessageDemo = () => {
)}
>
)
- const dialogButton = (
-
- {state.signature ? 'Close' : state.error ? 'Try again!' : ''}
-
- )
+ const dialogButton = Close
return (
<>
From 2b23b93836e029b231657977419d160fadc28548 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 18:23:52 -0300
Subject: [PATCH 034/228] fix: link
---
src/components/pageComponents/home/Examples/index.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index f5540ecc..f95fa5ec 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -82,7 +82,7 @@ const Examples: FC> = ({ ...restProps }) => {
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_Hash.Hash.html',
icon: ,
sourceCodeHref:
- 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/HashHandlingDemo.tsx#L155',
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/f75be6325de83cfef9753bb29f10f8b6e4679cca/src/components/pageComponents/home/Examples/demos/HashHandlingDemo.tsx#L155',
text: (
<>
Validate an address or hash. Copy or open it in the block explorer for the chain your
@@ -96,7 +96,7 @@ const Examples: FC> = ({ ...restProps }) => {
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenDropdown.TokenDropdown.html',
icon: ,
sourceCodeHref:
- 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/TokenDropdownDemo.tsx#L13',
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/f75be6325de83cfef9753bb29f10f8b6e4679cca/src/components/pageComponents/home/Examples/demos/TokenDropdownDemo.tsx#L13',
text: (
<>
Allows you to search or select tokens from a list. Uses our{' '}
@@ -115,7 +115,7 @@ const Examples: FC> = ({ ...restProps }) => {
{
demo: ,
sourceCodeHref:
- 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/dac8165b48832fae2fda82ad5e334f972e187d10/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx#L38',
+ 'https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/f75be6325de83cfef9753bb29f10f8b6e4679cca/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx#L38',
href: 'https://bootnodedev.github.io/dAppBooster/functions/sharedComponents_TokenInput.TokenInput.html',
icon: ,
text: (
From d4f71d6facb965f0ee3aa95ca9c84ff593da40f0 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 19 Aug 2024 18:44:02 -0300
Subject: [PATCH 035/228] fix: button styles
---
.../ERC20ApproveAndTransferButton.tsx | 19 ++++++-------------
.../index.tsx | 1 -
.../TransactionButtonDemo/NativeTokenDemo.tsx | 13 +++----------
3 files changed, 9 insertions(+), 24 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
index 51376d1b..dd5410ff 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
@@ -1,5 +1,4 @@
import { type FC } from 'react'
-import styled from 'styled-components'
import { type Address, type TransactionReceipt, type Hash, erc20Abi } from 'viem'
import * as chains from 'viem/chains'
@@ -13,14 +12,6 @@ import { useWeb3StatusConnected, useWeb3Status } from '@/src/hooks/useWeb3Status
import { type Token } from '@/src/types/token'
import { getExplorerLink } from '@/src/utils/getExplorerLink'
-const Button = styled(PrimaryButton).attrs({ as: TransactionButton })`
- font-size: 1.6rem;
- font-weight: 500;
- height: 48px;
- padding-left: calc(var(--base-common-padding) * 3);
- padding-right: calc(var(--base-common-padding) * 3);
-`
-
interface Props {
amount: bigint
disabled?: boolean
@@ -87,7 +78,8 @@ const ERC20ApproveAndTransferButton: FC = ({
return isApprovalRequired ? (
- = ({
transaction={handleApprove}
>
Approve
-
+
) : (
= ({
}
title="Execute the transaction"
>
- = ({
transaction={transaction}
>
{label}
-
+
)
}
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
index d13c0b92..f0deac95 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
@@ -24,7 +24,6 @@ const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
`
const Button = styled(PrimaryButton)`
- margin: 0 auto;
width: 100%;
`
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
index 6baea01e..b1fe1cc9 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
@@ -12,14 +12,6 @@ import TransactionButton from '@/src/components/sharedComponents/TransactionButt
import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
-const Button = styled(PrimaryButton).attrs({ as: TransactionButton })`
- font-size: 1.6rem;
- font-weight: 500;
- height: 48px;
- padding-left: calc(var(--base-common-padding) * 3);
- padding-right: calc(var(--base-common-padding) * 3);
-`
-
const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
${({ status }) =>
status === 'ok' &&
@@ -63,13 +55,14 @@ const NativeTokenDemo = withWalletStatusVerifier(
text="Demo transaction that sends 0.1 Sepolia ETH from / to your wallet."
title="Native token demo"
>
-
Send 0.1 Sepolia ETH
-
+
Date: Mon, 19 Aug 2024 18:58:11 -0300
Subject: [PATCH 036/228] fix: dropdown width
---
.../pageComponents/home/Examples/demos/EnsNameDemo.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
index 5fec4558..91dbd0c9 100644
--- a/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/EnsNameDemo.tsx
@@ -72,7 +72,7 @@ const ENSName = styled.div`
const ButtonText = styled.span`
display: block;
- max-width: 100px;
+ max-width: 115px;
overflow: hidden;
text-overflow: ellipsis;
`
From 7ea22a9876f723e8a95aa57b81a0accde68d1846 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 22 Aug 2024 16:08:09 -0300
Subject: [PATCH 037/228] refactor: update demos with new modal package
---
.../home/Examples/demos/SignMessageDemo.tsx | 29 ++++++++++---------
.../index.tsx | 15 ++++++----
.../TransactionButtonDemo/NativeTokenDemo.tsx | 13 +++++----
3 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
index cede05bc..b69980f9 100644
--- a/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
@@ -1,7 +1,8 @@
import { useEffect, useState } from 'react'
import styled, { css } from 'styled-components'
-import { useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+import { Modal, useModal } from '@faceless-ui/modal'
+import { GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import SignButtonBase from '@/src/components/sharedComponents/SignButton'
@@ -42,16 +43,16 @@ const SignMessageDemo = () => {
error: null,
signature: null,
})
- const { Dialog, close, open } = useDialog()
+ const { closeModal, isModalOpen, openModal } = useModal()
useEffect(() => {
if (state.signature || state.error) {
- open('sign-message')
+ openModal('sign-message')
}
- }, [state.signature, state.error, open])
+ }, [state.signature, state.error, openModal])
const onClose = () => {
- close('sign-message')
+ closeModal('sign-message')
setState({ error: null, signature: null })
}
@@ -78,14 +79,16 @@ const SignMessageDemo = () => {
onError={(error) => setState({ error, signature: null })}
onSign={(signature) => setState({ error: null, signature })}
/>
-
-
-
+
+ {isModalOpen('sign-message') && (
+
+ )}
+
>
)
}
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
index f0deac95..b1e6acca 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
@@ -1,6 +1,7 @@
import styled, { css } from 'styled-components'
-import { ExternalLink, useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+import { Modal, useModal } from '@faceless-ui/modal'
+import { ExternalLink, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
import { type Address, formatUnits } from 'viem'
import { sepolia } from 'viem/chains'
import { useWriteContract } from 'wagmi'
@@ -98,7 +99,7 @@ const ABIExample = [
*/
const ERC20ApproveAndTransferButtonDemo = withWalletStatusVerifier(
withSuspense(() => {
- const { Dialog, close, open } = useDialog()
+ const { closeModal, openModal } = useModal()
const { address } = useWeb3StatusConnected()
const { writeContractAsync } = useWriteContract()
@@ -141,22 +142,24 @@ const ERC20ApproveAndTransferButtonDemo = withWalletStatusVerifier(
amount={amount}
label={`Supply ${formattedAmount} USDC`}
labelSending="Sending..."
- onSuccess={() => open('approve-and-transfer')}
+ onSuccess={() => openModal('approve-and-transfer')}
spender={spender}
token={tokenUSDC_sepolia}
transaction={handleTransaction}
/>
)}
-
+
close('approve-and-transfer')}>Close
+ closeModal('approve-and-transfer')}>
+ Close
+
}
message={'Approve and supply completed! 🎉'}
status={'ok'}
title={'Success'}
/>
-
+
>
)
}),
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
index b1fe1cc9..c26d62d1 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
@@ -1,7 +1,8 @@
import { useState, type ReactElement } from 'react'
import styled, { css } from 'styled-components'
-import { useDialog, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+import { Modal, useModal } from '@faceless-ui/modal'
+import { GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
import { type Hash, type TransactionReceipt, parseEther } from 'viem'
import { sepolia } from 'viem/chains'
import { useSendTransaction } from 'wagmi'
@@ -27,7 +28,7 @@ const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
*/
const NativeTokenDemo = withWalletStatusVerifier(
() => {
- const { Dialog, close, open } = useDialog()
+ const { closeModal, openModal } = useModal()
const { address } = useWeb3StatusConnected()
const { sendTransactionAsync } = useSendTransaction()
const [minedMessage, setMinedMessage] = useState()
@@ -38,7 +39,7 @@ const NativeTokenDemo = withWalletStatusVerifier(
Hash: {receipt.transactionHash}
>,
)
- open('tx-dialog')
+ openModal('tx-dialog')
}
const handleSendTransaction = (): Promise => {
@@ -64,12 +65,12 @@ const NativeTokenDemo = withWalletStatusVerifier(
Send 0.1 Sepolia ETH
-
+
{
- close('tx-dialog')
+ closeModal('tx-dialog')
setMinedMessage('')
}}
>
@@ -80,7 +81,7 @@ const NativeTokenDemo = withWalletStatusVerifier(
status={'ok'}
title={'Transaction completed!'}
/>
-
+
>
)
},
From e1e3982ec76e53d3f665ee39016eafcaea4df3e9 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Thu, 22 Aug 2024 16:08:41 -0300
Subject: [PATCH 038/228] chore: update token input demo
---
.../pageComponents/home/Examples/demos/TokenInputDemo.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
index b6887b69..3cc88b8c 100644
--- a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
@@ -42,7 +42,7 @@ const TokenInputDemo = () => {
const [amount, setAmount] = useState()
const [error, setError] = useState()
const { tokensByChainId } = useTokenLists()
- const { searchResult } = useTokenSearch(tokensByChainId[1], [], 'WETH')
+ const { searchResult } = useTokenSearch({ tokens: tokensByChainId[1], defaultSearchTerm: 'WETH' })
const networks: Networks = [
{
From c5f63667d2856e316cf8578e06354a6a50b3f2de Mon Sep 17 00:00:00 2001
From: nicosampler
Date: Wed, 4 Sep 2024 18:46:45 -0300
Subject: [PATCH 039/228] toast & tokenInput
---
.../home/Examples/demos/SignMessageDemo.tsx | 70 +------------
.../home/Examples/demos/TokenInputDemo.tsx | 43 +++-----
.../ERC20ApproveAndTransferButton.tsx | 1 +
.../MintUSDC.tsx | 37 +++++++
.../index.tsx | 68 ++-----------
.../TransactionButtonDemo/NativeTokenDemo.tsx | 1 +
.../sharedComponents/SignButton.tsx | 12 ++-
src/constants/contracts/abis/AaveFaucet.ts | 99 +++++++++++++++++++
src/constants/contracts/contracts.ts | 9 ++
9 files changed, 178 insertions(+), 162 deletions(-)
create mode 100644 src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx
create mode 100644 src/constants/contracts/abis/AaveFaucet.ts
diff --git a/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
index b69980f9..a94bcd87 100644
--- a/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SignMessageDemo.tsx
@@ -1,8 +1,4 @@
-import { useEffect, useState } from 'react'
-import styled, { css } from 'styled-components'
-
-import { Modal, useModal } from '@faceless-ui/modal'
-import { GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
+import styled from 'styled-components'
import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import SignButtonBase from '@/src/components/sharedComponents/SignButton'
@@ -19,14 +15,6 @@ Empower your dApps!
dAppBooster Team 💪
`
-const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
- ${({ status }) =>
- status === 'ok' &&
- css`
- --theme-general-message-icon-color: var(--theme-color-ok);
- `}
-`
-
const Button = styled(PrimaryButton).attrs({ as: SignButtonBase })`
font-size: 1.6rem;
font-weight: 500;
@@ -36,61 +24,7 @@ const Button = styled(PrimaryButton).attrs({ as: SignButtonBase })`
`
const SignMessageDemo = () => {
- const [state, setState] = useState<{
- signature: string | null
- error: Error | null
- }>({
- error: null,
- signature: null,
- })
- const { closeModal, isModalOpen, openModal } = useModal()
-
- useEffect(() => {
- if (state.signature || state.error) {
- openModal('sign-message')
- }
- }, [state.signature, state.error, openModal])
-
- const onClose = () => {
- closeModal('sign-message')
- setState({ error: null, signature: null })
- }
-
- const dialogTitle = state.signature ? 'Success' : state.error ? 'Error' : ''
- const dialogMessage = (
- <>
- {state.signature ? (
- <>
- Signature: {state.signature}
- >
- ) : state.error ? (
- {state.error.message}
- ) : (
- ''
- )}
- >
- )
- const dialogButton = Close
-
- return (
- <>
- setState({ error, signature: null })}
- onSign={(signature) => setState({ error: null, signature })}
- />
-
- {isModalOpen('sign-message') && (
-
- )}
-
- >
- )
+ return
}
export default SignMessageDemo
diff --git a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
index fe8ea173..e9426c33 100644
--- a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
@@ -11,6 +11,7 @@ import Eth from '@/src/components/pageComponents/home/Examples/demos/assets/Eth'
import Optimism from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
import Polygon from '@/src/components/pageComponents/home/Examples/demos/assets/Polygon'
import TokenInput from '@/src/components/sharedComponents/TokenInput'
+import { useTokenInput } from '@/src/components/sharedComponents/TokenInput/useTokenInput'
import { type Networks } from '@/src/components/sharedComponents/TokenSelect'
import { useTokenLists } from '@/src/hooks/useTokenLists'
import { useTokenSearch } from '@/src/hooks/useTokenSearch'
@@ -38,11 +39,10 @@ type Options = 'single' | 'multi'
const TokenInputDemo = () => {
const { isWalletConnected } = useWeb3Status()
const [currentNetworkId, setCurrentNetworkId] = useState()
- const [currentToken, setCurrentToken] = useState()
- const [amount, setAmount] = useState()
- const [error, setError] = useState()
const { tokensByChainId } = useTokenLists()
const { searchResult } = useTokenSearch({ tokens: tokensByChainId[1], defaultSearchTerm: 'WETH' })
+ const tokenInputMulti = useTokenInput()
+ const tokenInputSingle = useTokenInput(searchResult[0])
const networks: Networks = [
{
@@ -71,23 +71,11 @@ const TokenInputDemo = () => {
},
]
- const onTokenSelect = (token: Token | undefined) => {
- setCurrentToken(token)
- }
-
- const onAmountSet = (amount?: string) => {
- setAmount(amount)
- }
-
- const onError = (error?: string) => {
- setError(error)
- }
-
- useEffect(() => {
- currentToken && console.log(currentToken)
- amount && console.log(amount)
- error && console.log(error)
- }, [currentToken, amount, error])
+ // useEffect(() => {
+ // currentToken && console.log(currentToken)
+ // amount && console.log(amount)
+ // error && console.log(error)
+ // }, [currentToken, amount, error])
const dropdownItems = [
{ label: 'Single token', type: 'single' },
@@ -110,35 +98,30 @@ const TokenInputDemo = () => {
))}
/>
- {/* TODO: Fix */}
- {/* {currentTokenInput === 'multi' && (
+
+ {currentTokenInput === 'multi' && (
)}
{currentTokenInput === 'single' && (
- )} */}
+ )}
)
}
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
index dd5410ff..acb642ab 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton.tsx
@@ -69,6 +69,7 @@ const ERC20ApproveAndTransferButton: FC = ({
args: [spender, amount],
})
}
+ handleApprove.methodId = 'Approve USDC'
const findChain = (chainId: number) => Object.values(chains).find((chain) => chain.id === chainId)
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx
new file mode 100644
index 00000000..0c88046f
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx
@@ -0,0 +1,37 @@
+import { sepolia } from 'viem/chains'
+import { useWriteContract } from 'wagmi'
+
+import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
+import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
+import { AaveFaucetABI } from '@/src/constants/contracts/abis/AaveFaucet'
+import { getContract } from '@/src/constants/contracts/contracts'
+import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
+
+export default function MintUSDC({ onSuccess }: { onSuccess: () => void }) {
+ const { address } = useWeb3StatusConnected()
+ const { writeContractAsync } = useWriteContract()
+ const aaveContract = getContract('AaveFaucet', sepolia.id)
+ const aaveUSDC = '0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8'
+
+ const handleMint = () => {
+ return writeContractAsync({
+ abi: AaveFaucetABI,
+ address: aaveContract.address,
+ functionName: 'mint',
+ args: [aaveUSDC, address, 10000000000n],
+ })
+ }
+ handleMint.methodId = 'Mint USDC'
+
+ return (
+
+ Mint USDC
+
+ )
+}
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
index b1e6acca..af9f4fdb 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/index.tsx
@@ -1,14 +1,10 @@
-import styled, { css } from 'styled-components'
-
-import { Modal, useModal } from '@faceless-ui/modal'
-import { ExternalLink, GeneralMessage as GeneralMessageBase } from 'db-ui-toolkit'
import { type Address, formatUnits } from 'viem'
import { sepolia } from 'viem/chains'
import { useWriteContract } from 'wagmi'
import ERC20ApproveAndTransferButton from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/ERC20ApproveAndTransferButton'
+import MintUSDC from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC'
import Wrapper from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper'
-import { PrimaryButton } from '@/src/components/sharedComponents/Buttons'
import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
import { useSuspenseReadErc20BalanceOf } from '@/src/hooks/generated'
import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
@@ -16,41 +12,6 @@ import { type Token } from '@/src/types/token'
import { formatNumberOrString, NumberType } from '@/src/utils/numberFormat'
import { withSuspense } from '@/src/utils/suspenseWrapper'
-const GeneralMessage = styled(GeneralMessageBase)<{ status?: 'ok' | 'error' }>`
- ${({ status }) =>
- status === 'ok' &&
- css`
- --theme-general-message-icon-color: var(--theme-color-ok);
- `}
-`
-
-const Button = styled(PrimaryButton)`
- width: 100%;
-`
-
-const ExternalLinkIcon = () => (
-
-
-
-
-
-)
-
// USDC token on Sepolia chain
const tokenUSDC_sepolia: Token = {
address: '0x94a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8',
@@ -99,11 +60,10 @@ const ABIExample = [
*/
const ERC20ApproveAndTransferButtonDemo = withWalletStatusVerifier(
withSuspense(() => {
- const { closeModal, openModal } = useModal()
const { address } = useWeb3StatusConnected()
const { writeContractAsync } = useWriteContract()
- const { data: balance } = useSuspenseReadErc20BalanceOf({
+ const { data: balance, refetch: refetchBalance } = useSuspenseReadErc20BalanceOf({
address: tokenUSDC_sepolia.address as Address,
args: [address],
})
@@ -120,6 +80,7 @@ const ERC20ApproveAndTransferButtonDemo = withWalletStatusVerifier(
functionName: 'supply',
args: [tokenUSDC_sepolia.address as Address, amount, address, 0],
})
+ handleTransaction.methodId = 'Supply USDC'
const formattedAmount = formatNumberOrString(
formatUnits(amount, tokenUSDC_sepolia.decimals),
@@ -129,37 +90,20 @@ const ERC20ApproveAndTransferButtonDemo = withWalletStatusVerifier(
return (
<>
{balance < amount ? (
-
-
- Sepolia USDC faucet
-
+
+
) : (
openModal('approve-and-transfer')}
+ onSuccess={() => refetchBalance}
spender={spender}
token={tokenUSDC_sepolia}
transaction={handleTransaction}
/>
)}
-
- closeModal('approve-and-transfer')}>
- Close
-
- }
- message={'Approve and supply completed! 🎉'}
- status={'ok'}
- title={'Success'}
- />
-
>
)
}),
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
index c26d62d1..6dc4c05b 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo.tsx
@@ -49,6 +49,7 @@ const NativeTokenDemo = withWalletStatusVerifier(
value: parseEther('0.1'),
})
}
+ handleSendTransaction.methodId = 'sendTransaction'
return (
<>
diff --git a/src/components/sharedComponents/SignButton.tsx b/src/components/sharedComponents/SignButton.tsx
index aae36dfd..1b6cfa7c 100644
--- a/src/components/sharedComponents/SignButton.tsx
+++ b/src/components/sharedComponents/SignButton.tsx
@@ -3,6 +3,7 @@ import { ComponentProps, type FC } from 'react'
import { useSignMessage } from 'wagmi'
import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
+import { useTransactionNotification } from '@/src/lib/toast/TransactionNotificationProvider'
interface SignButtonPropsProps extends Omit, 'onError'> {
label?: string
@@ -42,7 +43,9 @@ const SignButton: FC = withWalletStatusVerifier(
onSign,
...restProps
}) => {
- const { isPending, signMessage } = useSignMessage({
+ const { watchSignature } = useTransactionNotification()
+
+ const { isPending, signMessageAsync } = useSignMessage({
mutation: {
onSuccess(data) {
onSign?.(data)
@@ -56,7 +59,12 @@ const SignButton: FC = withWalletStatusVerifier(
return (
signMessage({ message })}
+ onClick={() => {
+ watchSignature({
+ message: 'Signing message...',
+ signaturePromise: signMessageAsync({ message }),
+ })
+ }}
{...restProps}
>
{isPending ? labelSigning : children}
diff --git a/src/constants/contracts/abis/AaveFaucet.ts b/src/constants/contracts/abis/AaveFaucet.ts
new file mode 100644
index 00000000..d39d9b11
--- /dev/null
+++ b/src/constants/contracts/abis/AaveFaucet.ts
@@ -0,0 +1,99 @@
+export const AaveFaucetABI = [
+ {
+ inputs: [
+ { internalType: 'address', name: 'owner', type: 'address' },
+ { internalType: 'bool', name: 'permissioned', type: 'bool' },
+ ],
+ stateMutability: 'nonpayable',
+ type: 'constructor',
+ },
+ {
+ anonymous: false,
+ inputs: [
+ { indexed: true, internalType: 'address', name: 'previousOwner', type: 'address' },
+ { indexed: true, internalType: 'address', name: 'newOwner', type: 'address' },
+ ],
+ name: 'OwnershipTransferred',
+ type: 'event',
+ },
+ {
+ inputs: [],
+ name: 'MAX_MINT_AMOUNT',
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ inputs: [{ internalType: 'address', name: 'asset', type: 'address' }],
+ name: 'isMintable',
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ inputs: [],
+ name: 'isPermissioned',
+ outputs: [{ internalType: 'bool', name: '', type: 'bool' }],
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: 'token', type: 'address' },
+ { internalType: 'address', name: 'to', type: 'address' },
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
+ ],
+ name: 'mint',
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [],
+ name: 'owner',
+ outputs: [{ internalType: 'address', name: '', type: 'address' }],
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ inputs: [],
+ name: 'renounceOwnership',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: 'asset', type: 'address' },
+ { internalType: 'bool', name: 'active', type: 'bool' },
+ ],
+ name: 'setMintable',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [{ internalType: 'bool', name: 'permissioned', type: 'bool' }],
+ name: 'setPermissioned',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],
+ name: 'transferOwnership',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address[]', name: 'childContracts', type: 'address[]' },
+ { internalType: 'address', name: 'newOwner', type: 'address' },
+ ],
+ name: 'transferOwnershipOfChild',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+] as const
diff --git a/src/constants/contracts/contracts.ts b/src/constants/contracts/contracts.ts
index b7309c97..9c683e4a 100644
--- a/src/constants/contracts/contracts.ts
+++ b/src/constants/contracts/contracts.ts
@@ -1,6 +1,7 @@
import { type ContractConfig } from '@wagmi/cli'
import { type Abi, Address, erc20Abi, isAddress } from 'viem'
+import { AaveFaucetABI } from '@/src/constants/contracts/abis/AaveFaucet'
import { ENSRegistryABI } from '@/src/constants/contracts/abis/ENSRegistry'
import { type ChainsIds, type RequiredChainId } from '@/src/lib/networks.config'
@@ -24,6 +25,14 @@ export const contracts: Array> = [
},
name: 'EnsRegistry',
},
+ {
+ abi: AaveFaucetABI,
+ address: {
+ 11155111: '0xc959483dba39aa9e78757139af0e9a2edeb3f42d',
+ 1: '0x0000000000000000000000000000000000000000',
+ },
+ name: 'AaveFaucet',
+ },
] as const
type Contract = {
From 60ee9eae94cff3f24d07bc8a43520a4dd854f0f2 Mon Sep 17 00:00:00 2001
From: nicosampler
Date: Thu, 5 Sep 2024 13:06:07 -0300
Subject: [PATCH 040/228] fix CI
---
.../pageComponents/home/Examples/demos/TokenInputDemo.tsx | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
index e9426c33..83eb3a03 100644
--- a/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TokenInputDemo.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useState } from 'react'
+import { useState } from 'react'
import styled, { css } from 'styled-components'
import { Item, breakpointMediaQuery } from 'db-ui-toolkit'
@@ -16,7 +16,6 @@ import { type Networks } from '@/src/components/sharedComponents/TokenSelect'
import { useTokenLists } from '@/src/hooks/useTokenLists'
import { useTokenSearch } from '@/src/hooks/useTokenSearch'
import { useWeb3Status } from '@/src/hooks/useWeb3Status'
-import { type Token } from '@/src/types/token'
const Wrapper = styled.div`
max-width: 100%;
From 28dbf1f7f64b2f2c8b4cdbb0b833fe13d7c00bf8 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Mon, 9 Sep 2024 13:39:13 -0300
Subject: [PATCH 041/228] fix: tx button missing AAVE
---
.../ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx | 2 +-
src/constants/contracts/contracts.ts | 9 +++++++++
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx
index cdb8faae..c300300b 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo/MintUSDC.tsx
@@ -10,7 +10,7 @@ import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
export default function MintUSDC({ onSuccess }: { onSuccess: () => void }) {
const { address } = useWeb3StatusConnected()
const { writeContractAsync } = useWriteContract()
- const aaveContract = getContract('ERC20', sepolia.id)
+ const aaveContract = getContract('AaveFaucet', sepolia.id)
const aaveUSDC = '0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8'
const handleMint = () => {
diff --git a/src/constants/contracts/contracts.ts b/src/constants/contracts/contracts.ts
index 321f896c..04a11457 100644
--- a/src/constants/contracts/contracts.ts
+++ b/src/constants/contracts/contracts.ts
@@ -1,6 +1,7 @@
import { type Abi, Address, erc20Abi, isAddress } from 'viem'
import { mainnet, polygon, sepolia } from 'viem/chains'
+import { AaveFaucetABI } from '@/src/constants/contracts/abis/AaveFaucet'
import { ENSRegistryABI } from '@/src/constants/contracts/abis/ENSRegistry'
import { type ChainsIds } from '@/src/lib/networks.config'
@@ -38,6 +39,14 @@ const contracts = [
},
name: 'EnsRegistry',
},
+ {
+ abi: AaveFaucetABI,
+ address: {
+ 11155111: '0xc959483dba39aa9e78757139af0e9a2edeb3f42d',
+ 1: '0x0000000000000000000000000000000000000000',
+ },
+ name: 'AaveFaucet',
+ },
] as const satisfies ContractConfig[]
/**
From f8c7fe2ca853d95b594919d52e3ddc2a41408b5d Mon Sep 17 00:00:00 2001
From: fernandomg
Date: Tue, 10 Sep 2024 18:42:25 +0200
Subject: [PATCH 042/228] feat(plugins): use subgraph plugin for the examples
---
package.json | 8 +-
pnpm-lock.yaml | 1939 ++++++++++++++++-
.../home/Examples/demos/SubgraphDemo/List.tsx | 279 ---
.../Examples/demos/SubgraphDemo/index.tsx | 311 ++-
.../demos/SubgraphStatusDemo/List.tsx | 208 --
.../demos/SubgraphStatusDemo/index.tsx | 234 +-
src/env.ts | 7 +
src/subgraphs/codegen.ts | 15 +
8 files changed, 2455 insertions(+), 546 deletions(-)
delete mode 100644 src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
delete mode 100644 src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx
create mode 100644 src/subgraphs/codegen.ts
diff --git a/package.json b/package.json
index 0ca2c60c..7d90a7ce 100644
--- a/package.json
+++ b/package.json
@@ -5,12 +5,13 @@
"type": "module",
"scripts": {
"build": "tsc --noEmit && vite build",
+ "subgraph-codegen": "graphql-codegen --config ./src/subgraphs/codegen.ts",
"dev:watch": "routes:watch & vite",
"dev": "vite",
"generateDocs": "typedoc",
"lint:fix": "eslint --fix .",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
- "postinstall": "pnpm wagmi-generate",
+ "postinstall": "pnpm wagmi-generate & pnpm subgraph-codegen",
"prepare": "husky",
"prettier:fix": "prettier --write --ignore-unknown .",
"preview": "vite preview",
@@ -22,6 +23,7 @@
"wagmi-generate": "wagmi generate --config src/lib/wagmi/config.ts"
},
"dependencies": {
+ "@bootnodedev/db-subgraph": "^0.1.0",
"@bootnodedev/db-ui-toolkit": "1.0.0-beta.2",
"@faceless-ui/modal": "3.0.0-beta.2",
"@lifi/sdk": "^3.0.1",
@@ -32,6 +34,8 @@
"@uniswap/default-token-list": "^11.19.0",
"@vercel/analytics": "^1.3.1",
"connectkit": "^1.8.2",
+ "graphql": "^16.9.0",
+ "graphql-request": "^7.1.0",
"modern-normalize": "^2.0.0",
"next-themes": "^0.3.0",
"react": "^18.3.1",
@@ -49,6 +53,8 @@
"devDependencies": {
"@commitlint/cli": "^19.3.0",
"@commitlint/config-conventional": "^19.2.2",
+ "@graphql-codegen/cli": "^5.0.2",
+ "@graphql-typed-document-node/core": "^3.2.0",
"@parcel/watcher": "^2.4.1",
"@tanstack/react-query-devtools": "^5.36.0",
"@tanstack/router-cli": "^1.32.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8fe7ab87..fbb1c551 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
+ '@bootnodedev/db-subgraph':
+ specifier: ^0.1.0
+ version: 0.1.0(@parcel/watcher@2.4.1)(@tanstack/react-query@5.52.2(react@18.3.1))(@types/node@22.5.0)(bufferutil@4.0.8)(graphql-tag@2.12.6(graphql@16.9.0))(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.10.11(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))
'@bootnodedev/db-ui-toolkit':
specifier: 1.0.0-beta.2
version: 1.0.0-beta.2
@@ -38,6 +41,12 @@ importers:
connectkit:
specifier: ^1.8.2
version: 1.8.2(@babel/core@7.25.2)(@tanstack/react-query@5.52.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.10.11(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.12.7(@tanstack/query-core@5.52.2)(@tanstack/react-query@5.52.2(react@18.3.1))(@types/react@18.3.4)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.2(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.3.4)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.21.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.10.11(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))
+ graphql:
+ specifier: ^16.9.0
+ version: 16.9.0
+ graphql-request:
+ specifier: ^7.1.0
+ version: 7.1.0(graphql@16.9.0)
modern-normalize:
specifier: ^2.0.0
version: 2.0.0
@@ -84,6 +93,12 @@ importers:
'@commitlint/config-conventional':
specifier: ^19.2.2
version: 19.2.2
+ '@graphql-codegen/cli':
+ specifier: ^5.0.2
+ version: 5.0.2(@parcel/watcher@2.4.1)(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(typescript@5.5.4)(utf-8-validate@5.0.10)
+ '@graphql-typed-document-node/core':
+ specifier: ^3.2.0
+ version: 3.2.0(graphql@16.9.0)
'@parcel/watcher':
specifier: ^2.4.1
version: 2.4.1
@@ -226,6 +241,16 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
+ '@ardatan/relay-compiler@12.0.0':
+ resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==}
+ hasBin: true
+ peerDependencies:
+ graphql: '*'
+
+ '@ardatan/sync-fetch@0.0.1':
+ resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==}
+ engines: {node: '>=14'}
+
'@babel/code-frame@7.24.7':
resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
engines: {node: '>=6.9.0'}
@@ -392,6 +417,13 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-proposal-object-rest-spread@7.20.7':
+ resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==}
+ engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-proposal-optional-chaining@7.21.0':
resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==}
engines: {node: '>=6.9.0'}
@@ -912,6 +944,13 @@ packages:
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ '@bootnodedev/db-subgraph@0.1.0':
+ resolution: {integrity: sha512-bb51uamAaiTfTjnaJCjLiGtPnk8u9rmSOD6Gu2VC9ql3rvKb+yBevYw8pKstCQq89JLsc/fvRnGb2f17OXc/wA==}
+ peerDependencies:
+ '@tanstack/react-query': ^5
+ react: ^18
+ viem: ^2
+
'@bootnodedev/db-ui-toolkit@1.0.0-beta.2':
resolution: {integrity: sha512-R1llbVfN0PfEjKmBKofW2NQZtwBsPXTWBsXGdnuLx0MEQdoMlkjASjRSU6vRNSTtAkLvZ8phcRf+TuuQQQ3PfA==}
engines: {node: '>=20.0.0'}
@@ -1364,6 +1403,258 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0
+ '@graphql-codegen/add@5.0.3':
+ resolution: {integrity: sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/cli@5.0.2':
+ resolution: {integrity: sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==}
+ hasBin: true
+ peerDependencies:
+ '@parcel/watcher': ^2.1.0
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ peerDependenciesMeta:
+ '@parcel/watcher':
+ optional: true
+
+ '@graphql-codegen/client-preset@4.3.3':
+ resolution: {integrity: sha512-IrDsSVe8bkKtxgVfKPHzjL9tYlv7KEpA59R4gZLqx/t2WIJncW1i0OMvoz9tgoZsFEs8OKKgXZbnwPZ/Qf1kEw==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/core@4.0.2':
+ resolution: {integrity: sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/gql-tag-operations@4.0.9':
+ resolution: {integrity: sha512-lVgu1HClel896HqZAEjynatlU6eJrYOw+rh05DPgM150xvmb7Gz5TnRHA2vfwlDNIXDaToAIpz5RFfkjjnYM1Q==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/plugin-helpers@2.7.2':
+ resolution: {integrity: sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/plugin-helpers@3.1.2':
+ resolution: {integrity: sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/plugin-helpers@5.0.4':
+ resolution: {integrity: sha512-MOIuHFNWUnFnqVmiXtrI+4UziMTYrcquljaI5f/T/Bc7oO7sXcfkAvgkNWEEi9xWreYwvuer3VHCuPI/lAFWbw==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/schema-ast@4.1.0':
+ resolution: {integrity: sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/typed-document-node@5.0.9':
+ resolution: {integrity: sha512-Wx6fyA4vpfIbfNTMiWUECGnjqzKkJdEbZHxVMIegiCBPzBYPAJV4mZZcildLAfm2FtZcgW4YKtFoTbnbXqPB3w==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/typescript-graphql-request@6.2.0':
+ resolution: {integrity: sha512-nkp5tr4PrC/+2QkQqi+IB+bc7AavUnUvXPW8MC93HZRvwfMGy6m2Oo7b9JCPZ3vhNpqT2VDWOn/zIZXKz6zJAw==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ graphql-request: ^6.0.0
+ graphql-tag: ^2.0.0
+
+ '@graphql-codegen/typescript-operations@4.2.3':
+ resolution: {integrity: sha512-6z7avSSOr03l5SyKbeDs7MzRyGwnQFSCqQm8Om5wIuoIgXVu2gXRmcJAY/I7SLdAy9xbF4Sho7XNqieFM2CAFQ==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/typescript@4.0.9':
+ resolution: {integrity: sha512-0O35DMR4d/ctuHL1Zo6mRUUzp0BoszKfeWsa6sCm/g70+S98+hEfTwZNDkQHylLxapiyjssF9uw/F+sXqejqLw==}
+ peerDependencies:
+ graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/visitor-plugin-common@2.13.1':
+ resolution: {integrity: sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-codegen/visitor-plugin-common@5.3.1':
+ resolution: {integrity: sha512-MktoBdNZhSmugiDjmFl1z6rEUUaqyxtFJYWnDilE7onkPgyw//O0M+TuPBJPBWdyV6J2ond0Hdqtq+rkghgSIQ==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ '@graphql-tools/apollo-engine-loader@8.0.1':
+ resolution: {integrity: sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/batch-execute@9.0.4':
+ resolution: {integrity: sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/code-file-loader@8.1.3':
+ resolution: {integrity: sha512-Qoo8VyU0ux7k20DkzL5wFm7Y6iqlG1GQ0xA4T3EQbm4B/qbENsMc38l76QnXYIVmIlKAnD9EAvzxPEQ8iv+ZPA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/delegate@10.0.21':
+ resolution: {integrity: sha512-UytyYVvDfLQbCYG1aQo8Vc67c1WhEjzW9ytYKEEqMJSdlwfMCujHmCz7EyH5DNjTAKapDHuQcN5VivKGap/Beg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/documents@1.0.1':
+ resolution: {integrity: sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/executor-graphql-ws@1.2.0':
+ resolution: {integrity: sha512-tSYC1QdrabWexLrYV0UI3uRGbde9WCY/bRhq6Jc+VXMZcfq6ea6pP5NEAVTfwbhUQ4xZvJABVVbKXtKb9uTg1w==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/executor-http@1.1.6':
+ resolution: {integrity: sha512-wGKjJzbi6em8cWI3sry6T7kAgoxMXYNM+KlbsWczPvIsHvv1cqXlrP1lwC6f7Ja1FfWdU1ZIEgOv93ext7IDyQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/executor-legacy-ws@1.1.0':
+ resolution: {integrity: sha512-k+6ZyiaAd8SmwuzbEOfA/LVkuI1nqidhoMw+CJ7c41QGOjSMzc0VS0UZbJyeitI0n7a+uP/Meln1wjzJ2ReDtQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/executor@1.3.1':
+ resolution: {integrity: sha512-tgJDdGf9SCAm64ofEMZdv925u6/J+eTmv36TGNLxgP2DpCJsZ6gnJ4A+0D28EazDXqJIvMiPd+3d+o3cCRCAnQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/git-loader@8.0.7':
+ resolution: {integrity: sha512-+s23lxHR24+zLDk9/Hfl7/8Qcal8Q1yJ8armRp1fvcJyuc0RTZv97ZoZb0tArTfME74z+kJ92Mx4SfZMd7mHSQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/github-loader@8.0.1':
+ resolution: {integrity: sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/graphql-file-loader@8.0.1':
+ resolution: {integrity: sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/graphql-tag-pluck@8.3.2':
+ resolution: {integrity: sha512-wJKkDjXRg2qJAVhAVE96zJGMli8Ity9mKUB7gTbvJwsAniaquRqLcTXUQ19X9qVT4ACzbbp+tAfk96b2U3tfog==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/import@7.0.1':
+ resolution: {integrity: sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/json-file-loader@8.0.1':
+ resolution: {integrity: sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/load@8.0.2':
+ resolution: {integrity: sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/merge@9.0.7':
+ resolution: {integrity: sha512-lbTrIuXIbUSmSumHkPRY1QX0Z8JEtmRhnIrkH7vkfeEmf0kNn/nCWvJwqokm5U7L+a+DA1wlRM4slIlbfXjJBA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/optimize@1.4.0':
+ resolution: {integrity: sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/optimize@2.0.0':
+ resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/prisma-loader@8.0.4':
+ resolution: {integrity: sha512-hqKPlw8bOu/GRqtYr0+dINAI13HinTVYBDqhwGAPIFmLr5s+qKskzgCiwbsckdrb5LWVFmVZc+UXn80OGiyBzg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/relay-operation-optimizer@6.5.18':
+ resolution: {integrity: sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/relay-operation-optimizer@7.0.1':
+ resolution: {integrity: sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/schema@10.0.6':
+ resolution: {integrity: sha512-EIJgPRGzpvDFEjVp+RF1zNNYIC36BYuIeZ514jFoJnI6IdxyVyIRDLx/ykgMdaa1pKQerpfdqDnsF4JnZoDHSQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/url-loader@8.0.2':
+ resolution: {integrity: sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/utils@10.5.4':
+ resolution: {integrity: sha512-XHnyCWSlg1ccsD8s0y6ugo5GZ5TpkTiFVNPSYms5G0s6Z/xTuSmiLBfeqgkfaCwLmLaQnRCmNDL2JRnqc2R5bQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/utils@8.13.1':
+ resolution: {integrity: sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/utils@9.2.1':
+ resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-tools/wrap@10.0.5':
+ resolution: {integrity: sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
+ '@graphql-typed-document-node/core@3.2.0':
+ resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==}
+ peerDependencies:
+ graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
'@hapi/hoek@9.3.0':
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
@@ -1439,6 +1730,9 @@ packages:
'@jridgewell/trace-mapping@0.3.9':
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ '@kamilkisiela/fast-url-parser@1.1.4':
+ resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==}
+
'@lifi/sdk@3.1.5':
resolution: {integrity: sha512-/usdOFspdFBhRExEeGSxZozqjOa7AI24lMQkhdsqJpomN1cWLFCfstALI3mRG91HlsQO8ktjPHjfhxkZ2n9TWw==}
peerDependencies:
@@ -1544,6 +1838,12 @@ packages:
resolution: {integrity: sha512-g2REf+xSt0OZfMoNNdC4+/Yy8eP3KUqvIArel54XRFKPoXbHI6+YjFfrLtfykWBjffOp7DTfIc3Kvk5TLfuiyg==}
engines: {node: '>=16.0.0'}
+ '@molt/command@0.9.0':
+ resolution: {integrity: sha512-1JI8dAlpqlZoXyKWVQggX7geFNPxBpocHIXQCsnxDjKy+3WX4SGyZVJXuLlqRRrX7FmQCuuMAfx642ovXmPA9g==}
+
+ '@molt/types@0.2.0':
+ resolution: {integrity: sha512-p6ChnEZDGjg9PYPec9BK6Yp5/DdSrYQvXTBAtgrnqX6N36cZy37ql1c8Tc5LclfIYBNG7EZp8NBcRTYJwyi84g==}
+
'@motionone/animation@10.18.0':
resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==}
@@ -1687,6 +1987,17 @@ packages:
resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==}
engines: {node: '>= 10.0.0'}
+ '@peculiar/asn1-schema@2.3.13':
+ resolution: {integrity: sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==}
+
+ '@peculiar/json-schema@1.1.12':
+ resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==}
+ engines: {node: '>=8.0.0'}
+
+ '@peculiar/webcrypto@1.5.0':
+ resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==}
+ engines: {node: '>=10.12.0'}
+
'@react-native-community/cli-clean@14.0.0':
resolution: {integrity: sha512-kvHthZTNur/wLLx8WL5Oh+r04zzzFAX16r8xuaLhu9qGTE6Th1JevbsIuiQb5IJqD8G/uZDKgIZ2a0/lONcbJg==}
@@ -1791,6 +2102,9 @@ packages:
'@types/react':
optional: true
+ '@repeaterjs/repeater@3.0.6':
+ resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==}
+
'@rollup/rollup-android-arm-eabi@4.21.1':
resolution: {integrity: sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==}
cpu: [arm]
@@ -2243,6 +2557,9 @@ packages:
'@types/istanbul-reports@3.0.4':
resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+ '@types/js-yaml@4.0.9':
+ resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
+
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
@@ -2520,6 +2837,23 @@ packages:
'@walletconnect/window-metadata@1.0.1':
resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==}
+ '@whatwg-node/events@0.0.3':
+ resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==}
+
+ '@whatwg-node/fetch@0.8.8':
+ resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==}
+
+ '@whatwg-node/fetch@0.9.21':
+ resolution: {integrity: sha512-Wt0jPb+04JjobK0pAAN7mEHxVHcGA9HoP3OyCsZtyAecNQeADXCZ1MihFwVwjsgaRYuGVmNlsCmLxlG6mor8Gw==}
+ engines: {node: '>=18.0.0'}
+
+ '@whatwg-node/node-fetch@0.3.6':
+ resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==}
+
+ '@whatwg-node/node-fetch@0.5.26':
+ resolution: {integrity: sha512-4jXDeZ4IH4bylZ6wu14VEx0aDXXhrN4TC279v9rPmn08g4EYekcYf8wdcOOnS9STjDkb6x77/6xBUTqxGgjr8g==}
+ engines: {node: '>=18.0.0'}
+
JSONStream@1.3.5:
resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
hasBin: true
@@ -2576,15 +2910,26 @@ packages:
resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
engines: {node: '>= 8.0.0'}
+ aggregate-error@3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
ajv@8.17.1:
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+ alge@0.8.1:
+ resolution: {integrity: sha512-kiV9nTt+XIauAXsowVygDxMZLplZxDWt0W8plE/nB32/V2ziM/P/TxDbSVK7FYIUt2Xo16h3/htDh199LNPCKQ==}
+
anser@1.4.10:
resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==}
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
ansi-escapes@7.0.0:
resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
engines: {node: '>=18'}
@@ -2684,6 +3029,10 @@ packages:
asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+ asn1js@3.0.5:
+ resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==}
+ engines: {node: '>=12.0.0'}
+
assertion-error@1.1.0:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
@@ -2715,6 +3064,10 @@ packages:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
engines: {node: '>=8.0.0'}
+ auto-bind@4.0.0:
+ resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==}
+ engines: {node: '>=8'}
+
available-typed-arrays@1.0.7:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
@@ -2754,9 +3107,17 @@ packages:
peerDependencies:
styled-components: '>= 2'
+ babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0:
+ resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==}
+
babel-plugin-transform-flow-enums@0.0.2:
resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==}
+ babel-preset-fbjs@3.4.0:
+ resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -2844,6 +3205,10 @@ packages:
peerDependencies:
esbuild: '>=0.17'
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
bytes@3.0.0:
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
engines: {node: '>= 0.8'}
@@ -2872,6 +3237,9 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ camel-case@4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
camelcase@5.3.1:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
@@ -2890,6 +3258,9 @@ packages:
caniuse-lite@1.0.30001653:
resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==}
+ capital-case@1.0.4:
+ resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
+
chai@4.5.0:
resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
engines: {node: '>=4'}
@@ -2910,9 +3281,21 @@ packages:
resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ change-case-all@1.0.14:
+ resolution: {integrity: sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==}
+
+ change-case-all@1.0.15:
+ resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==}
+
+ change-case@4.1.2:
+ resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==}
+
change-case@5.4.4:
resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==}
+ chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
check-error@1.0.3:
resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
@@ -2938,6 +3321,10 @@ packages:
citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+ clean-stack@2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+
cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
@@ -2954,10 +3341,18 @@ packages:
resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
engines: {node: '>=6'}
+ cli-truncate@2.1.0:
+ resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+ engines: {node: '>=8'}
+
cli-truncate@4.0.0:
resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
engines: {node: '>=18'}
+ cli-width@3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+
clipboardy@4.0.0:
resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==}
engines: {node: '>=18'}
@@ -3025,6 +3420,10 @@ packages:
resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
engines: {node: ^12.20.0 || >=14}
+ common-tags@1.8.2:
+ resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
+ engines: {node: '>=4.0.0'}
+
commondir@1.0.1:
resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
@@ -3063,6 +3462,9 @@ packages:
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
engines: {node: ^14.18.0 || >=16.10.0}
+ constant-case@3.0.4:
+ resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
+
conventional-changelog-angular@7.0.0:
resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
engines: {node: '>=16'}
@@ -3100,6 +3502,15 @@ packages:
resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==}
engines: {node: '>=4'}
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
cosmiconfig@9.0.0:
resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
engines: {node: '>=14'}
@@ -3123,6 +3534,10 @@ packages:
cross-fetch@4.0.0:
resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==}
+ cross-inspect@1.0.1:
+ resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==}
+ engines: {node: '>=16.0.0'}
+
cross-spawn@7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
@@ -3188,6 +3603,9 @@ packages:
resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
engines: {node: '>= 0.4'}
+ dataloader@2.2.2:
+ resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==}
+
date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -3285,6 +3703,10 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
+ dependency-graph@0.11.0:
+ resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==}
+ engines: {node: '>= 0.6.0'}
+
dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
@@ -3299,6 +3721,10 @@ packages:
detect-browser@5.3.0:
resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==}
+ detect-indent@6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+
detect-libc@1.0.3:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'}
@@ -3336,6 +3762,9 @@ packages:
dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
dot-prop@5.3.0:
resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
engines: {node: '>=8'}
@@ -3348,6 +3777,10 @@ packages:
resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
engines: {node: '>=12'}
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
+
duplexify@4.1.3:
resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
@@ -3668,10 +4101,21 @@ packages:
resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==}
engines: {node: '>=12.0.0'}
+ external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+
+ extract-files@11.0.0:
+ resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==}
+ engines: {node: ^12.20 || >= 14.13}
+
eyes@0.1.8:
resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==}
engines: {node: '> 0.1.90'}
+ fast-decode-uri-component@1.0.1:
+ resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
+
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -3685,6 +4129,9 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ fast-querystring@1.1.2:
+ resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
+
fast-redact@3.5.0:
resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
engines: {node: '>=6'}
@@ -3698,6 +4145,9 @@ packages:
fast-uri@3.0.1:
resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==}
+ fast-url-parser@1.1.3:
+ resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
+
fast-xml-parser@4.4.1:
resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==}
hasBin: true
@@ -3712,6 +4162,12 @@ packages:
fb-watchman@2.0.2:
resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+ fbjs-css-vars@1.0.2:
+ resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==}
+
+ fbjs@3.0.5:
+ resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==}
+
fdir@6.3.0:
resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==}
peerDependencies:
@@ -3720,6 +4176,10 @@ packages:
picomatch:
optional: true
+ figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+
file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -3937,6 +4397,53 @@ packages:
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ graphql-config@5.1.2:
+ resolution: {integrity: sha512-kVwUuFz1h9u7B0nDPtnLFWN+x018niaH3zi1ChFCNfbunhDVJ911Z3YcglK5EfDfySeeH+zCa1aGxd1wMgNd7g==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ cosmiconfig-toml-loader: ^1.0.0
+ graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ peerDependenciesMeta:
+ cosmiconfig-toml-loader:
+ optional: true
+
+ graphql-request@6.1.0:
+ resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==}
+ peerDependencies:
+ graphql: 14 - 16
+
+ graphql-request@7.1.0:
+ resolution: {integrity: sha512-Ouu/lYVFhARS1aXeZoVJWnGT6grFJXTLwXJuK4mUGGRo0EUk1JkyYp43mdGmRgUVezpRm6V5Sq3t8jBDQcajng==}
+ hasBin: true
+ peerDependencies:
+ '@dprint/formatter': ^0.3.0
+ '@dprint/typescript': ^0.91.1
+ dprint: ^0.46.2
+ graphql: 14 - 16
+ peerDependenciesMeta:
+ '@dprint/formatter':
+ optional: true
+ '@dprint/typescript':
+ optional: true
+ dprint:
+ optional: true
+
+ graphql-tag@2.12.6:
+ resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
+ graphql-ws@5.16.0:
+ resolution: {integrity: sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ graphql: '>=0.11 <=16'
+
+ graphql@16.9.0:
+ resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+
h3@1.12.0:
resolution: {integrity: sha512-Zi/CcNeWBXDrFNlV0hUBJQR9F7a96RjMeAZweW/ZWkR9fuXrMcvKnSA63f/zZ9l0GgQOZDVHGvXivNN9PWOwhA==}
@@ -3973,6 +4480,9 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ header-case@2.0.4:
+ resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
+
hermes-estree@0.22.0:
resolution: {integrity: sha512-FLBt5X9OfA8BERUdc6aZS36Xz3rRuB0Y/mfocSADWEJfomc1xfene33GdyAmtTkKTBXTN/EgAy+rjTKkkZJHlw==}
@@ -4043,6 +4553,10 @@ packages:
i18next@23.11.5:
resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==}
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
@@ -4062,6 +4576,10 @@ packages:
engines: {node: '>=16.x'}
hasBin: true
+ immutable@3.7.6:
+ resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==}
+ engines: {node: '>=0.8.0'}
+
import-fresh@2.0.0:
resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==}
engines: {node: '>=4'}
@@ -4070,6 +4588,10 @@ packages:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
+ import-from@4.0.0:
+ resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==}
+ engines: {node: '>=12.2'}
+
import-meta-resolve@4.1.0:
resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
@@ -4095,6 +4617,10 @@ packages:
resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ inquirer@8.2.6:
+ resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+ engines: {node: '>=12.0.0'}
+
internal-slot@1.0.7:
resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
engines: {node: '>= 0.4'}
@@ -4105,6 +4631,10 @@ packages:
iron-webcrypto@1.2.1:
resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+ is-absolute@1.0.0:
+ resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==}
+ engines: {node: '>=0.10.0'}
+
is-arguments@1.1.1:
resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
engines: {node: '>= 0.4'}
@@ -4208,6 +4738,9 @@ packages:
resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
engines: {node: '>=12'}
+ is-lower-case@2.0.2:
+ resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==}
+
is-map@2.0.3:
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
engines: {node: '>= 0.4'}
@@ -4247,6 +4780,10 @@ packages:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
+ is-relative@1.0.0:
+ resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==}
+ engines: {node: '>=0.10.0'}
+
is-set@2.0.3:
resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
engines: {node: '>= 0.4'}
@@ -4279,6 +4816,10 @@ packages:
resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
engines: {node: '>= 0.4'}
+ is-unc-path@1.0.0:
+ resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==}
+ engines: {node: '>=0.10.0'}
+
is-unicode-supported@0.1.0:
resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
engines: {node: '>=10'}
@@ -4287,6 +4828,9 @@ packages:
resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
engines: {node: '>=12'}
+ is-upper-case@2.0.2:
+ resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==}
+
is-weakmap@2.0.2:
resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
engines: {node: '>= 0.4'}
@@ -4298,6 +4842,10 @@ packages:
resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
engines: {node: '>= 0.4'}
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+
is-wsl@1.1.0:
resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==}
engines: {node: '>=4'}
@@ -4332,6 +4880,11 @@ packages:
peerDependencies:
ws: '*'
+ isomorphic-ws@5.0.0:
+ resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
+ peerDependencies:
+ ws: '*'
+
isows@1.0.4:
resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==}
peerDependencies:
@@ -4396,6 +4949,9 @@ packages:
joi@17.13.3:
resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
+ jose@5.8.0:
+ resolution: {integrity: sha512-E7CqYpL/t7MMnfGnK/eg416OsFCVUrU/Y3Vwe7QjKhu/BkS1Ms455+2xsqZQVN57/U2MHMBvEb5SrmAZWAIntA==}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -4468,6 +5024,10 @@ packages:
json-stringify-safe@5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+ json-to-pretty-yaml@1.2.2:
+ resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==}
+ engines: {node: '>= 0.2.0'}
+
json5@1.0.2:
resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
hasBin: true
@@ -4549,6 +5109,15 @@ packages:
resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==}
hasBin: true
+ listr2@4.0.5:
+ resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ enquirer: '>= 2.3.0 < 3'
+ peerDependenciesMeta:
+ enquirer:
+ optional: true
+
listr2@8.2.4:
resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==}
engines: {node: '>=18.0.0'}
@@ -4595,6 +5164,9 @@ packages:
lodash.isequal@4.5.0:
resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ lodash.ismatch@4.4.0:
+ resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==}
+
lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
@@ -4610,6 +5182,9 @@ packages:
lodash.snakecase@4.1.1:
resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+ lodash.sortby@4.7.0:
+ resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
+
lodash.startcase@4.4.0:
resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
@@ -4636,6 +5211,10 @@ packages:
resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==}
engines: {node: '>=12'}
+ log-update@4.0.0:
+ resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
+ engines: {node: '>=10'}
+
log-update@6.1.0:
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
engines: {node: '>=18'}
@@ -4651,6 +5230,12 @@ packages:
loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+ lower-case-first@2.0.2:
+ resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==}
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
@@ -4684,6 +5269,10 @@ packages:
makeerror@1.0.12:
resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+
markdown-it@14.1.0:
resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
hasBin: true
@@ -4718,6 +5307,15 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
+ meros@1.3.0:
+ resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==}
+ engines: {node: '>=13'}
+ peerDependencies:
+ '@types/node': '>=13'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
mersenne-twister@1.1.0:
resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==}
@@ -4888,6 +5486,9 @@ packages:
multiformats@9.9.0:
resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==}
+ mute-stream@0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+
nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -4912,6 +5513,9 @@ packages:
react: ^16.8 || ^17 || ^18
react-dom: ^16.8 || ^17 || ^18
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
nocache@3.0.4:
resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==}
engines: {node: '>=12.0.0'}
@@ -4962,6 +5566,10 @@ packages:
resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==}
engines: {node: '>=0.12.0'}
+ normalize-path@2.1.1:
+ resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
+ engines: {node: '>=0.10.0'}
+
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -5083,6 +5691,10 @@ packages:
resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
@@ -5115,14 +5727,25 @@ packages:
resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ p-map@4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
+ param-case@3.0.4:
+ resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
+ parse-filepath@1.0.2:
+ resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==}
+ engines: {node: '>=0.8'}
+
parse-json@4.0.0:
resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
engines: {node: '>=4'}
@@ -5138,6 +5761,12 @@ packages:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
+ pascal-case@3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+
+ path-case@3.0.4:
+ resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
+
path-exists@3.0.0:
resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
engines: {node: '>=4'}
@@ -5165,6 +5794,14 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ path-root-regex@0.1.2:
+ resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==}
+ engines: {node: '>=0.10.0'}
+
+ path-root@0.1.1:
+ resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==}
+ engines: {node: '>=0.10.0'}
+
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
@@ -5299,6 +5936,9 @@ packages:
process-warning@1.0.0:
resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==}
+ promise@7.3.1:
+ resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
+
promise@8.3.0:
resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==}
@@ -5322,10 +5962,20 @@ packages:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
+ punycode@1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
+ pvtsutils@1.3.5:
+ resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==}
+
+ pvutils@1.1.3:
+ resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==}
+ engines: {node: '>=6.0.0'}
+
qr-code-styling@1.6.0-rc.1:
resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==}
@@ -5469,6 +6119,10 @@ packages:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
+ readline-sync@1.4.10:
+ resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==}
+ engines: {node: '>= 0.8.0'}
+
readline@1.3.0:
resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==}
@@ -5516,6 +6170,21 @@ packages:
resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
hasBin: true
+ relay-runtime@12.0.0:
+ resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==}
+
+ remeda@1.61.0:
+ resolution: {integrity: sha512-caKfSz9rDeSKBQQnlJnVW3mbVdFgxgGWQKq1XlFokqjf+hQD5gxutLGTTY2A/x24UxVyJe9gH5fAkFI63ULw4A==}
+
+ remedial@1.0.8:
+ resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==}
+
+ remove-trailing-separator@1.1.0:
+ resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==}
+
+ remove-trailing-spaces@1.0.8:
+ resolution: {integrity: sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==}
+
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
@@ -5609,9 +6278,16 @@ packages:
rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
+ run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
safe-array-concat@1.1.2:
resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
engines: {node: '>=0.4'}
@@ -5643,6 +6319,9 @@ packages:
scheduler@0.24.0-canary-efb381bbf-20230505:
resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==}
+ scuid@1.1.0:
+ resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==}
+
secp256k1@5.0.0:
resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==}
engines: {node: '>=14.0.0'}
@@ -5668,6 +6347,9 @@ packages:
resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
engines: {node: '>= 0.8.0'}
+ sentence-case@3.0.4:
+ resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
+
serialize-error@2.1.0:
resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==}
engines: {node: '>=0.10.0'}
@@ -5690,6 +6372,9 @@ packages:
resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
engines: {node: '>= 0.4'}
+ setimmediate@1.0.5:
+ resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
@@ -5732,6 +6417,9 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
+ signedsource@1.0.0:
+ resolution: {integrity: sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==}
+
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -5743,6 +6431,10 @@ packages:
resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==}
engines: {node: '>=6'}
+ slice-ansi@3.0.0:
+ resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+ engines: {node: '>=8'}
+
slice-ansi@4.0.0:
resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
engines: {node: '>=10'}
@@ -5755,6 +6447,9 @@ packages:
resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
engines: {node: '>=18'}
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
socket.io-client@4.7.5:
resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==}
engines: {node: '>=10.0.0'}
@@ -5793,6 +6488,9 @@ packages:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'}
+ sponge-case@1.0.1:
+ resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==}
+
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
@@ -5832,6 +6530,10 @@ packages:
stream-shift@1.0.3:
resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
strict-uri-encode@2.0.0:
resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
engines: {node: '>=4'}
@@ -5840,6 +6542,13 @@ packages:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
+ string-env-interpolation@1.0.1:
+ resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==}
+
+ string-length@6.0.0:
+ resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==}
+ engines: {node: '>=16'}
+
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -5985,6 +6694,9 @@ packages:
svg-tags@1.0.0:
resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+ swap-case@2.0.2:
+ resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==}
+
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
@@ -6055,6 +6767,13 @@ packages:
resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
engines: {node: '>=14.0.0'}
+ title-case@3.0.3:
+ resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==}
+
+ tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+
tmpl@1.0.5:
resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
@@ -6087,6 +6806,9 @@ packages:
peerDependencies:
typescript: '>=4.2.0'
+ ts-log@2.2.5:
+ resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==}
+
ts-node@10.9.2:
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
hasBin: true
@@ -6101,6 +6823,9 @@ packages:
'@swc/wasm':
optional: true
+ ts-toolbelt@9.6.0:
+ resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
+
tsc-files@1.1.4:
resolution: {integrity: sha512-RePsRsOLru3BPpnf237y1Xe1oCGta8rmSYzM76kYo5tLGsv5R2r3s64yapYorGTPuuLyfS9NVbh9ydzmvNie2w==}
hasBin: true
@@ -6113,6 +6838,9 @@ packages:
tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ tslib@2.4.1:
+ resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
+
tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
@@ -6135,10 +6863,18 @@ packages:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
type-fest@0.7.1:
resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
engines: {node: '>=8'}
+ type-fest@4.26.1:
+ resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==}
+ engines: {node: '>=16'}
+
typed-array-buffer@1.0.2:
resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
engines: {node: '>= 0.4'}
@@ -6188,6 +6924,9 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ ua-parser-js@1.0.38:
+ resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==}
+
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
@@ -6200,6 +6939,10 @@ packages:
unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ unc-path-regex@0.1.2:
+ resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==}
+ engines: {node: '>=0.10.0'}
+
uncrypto@0.1.3:
resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
@@ -6241,6 +6984,10 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
+ unixify@1.0.0:
+ resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==}
+ engines: {node: '>=0.10.0'}
+
unpipe@1.0.0:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
@@ -6303,6 +7050,12 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ upper-case-first@2.0.2:
+ resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
+
+ upper-case@2.0.2:
+ resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==}
+
uqr@0.1.2:
resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==}
@@ -6312,6 +7065,12 @@ packages:
url-parse@1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+ urlpattern-polyfill@10.0.0:
+ resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==}
+
+ urlpattern-polyfill@8.0.2:
+ resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==}
+
use-debounce@10.0.3:
resolution: {integrity: sha512-DxQSI9ZKso689WM1mjgGU3ozcxU1TJElBJ3X6S4SMzMNcm2lVH0AHmyXB+K7ewjz2BSUKJTDqTcwtSMRfB89dg==}
engines: {node: '>= 16.0.0'}
@@ -6365,6 +7124,10 @@ packages:
react:
optional: true
+ value-or-promise@1.0.12:
+ resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==}
+ engines: {node: '>=12'}
+
vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
@@ -6462,6 +7225,13 @@ packages:
wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
+ webcrypto-core@1.8.0:
+ resolution: {integrity: sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw==}
+
webextension-polyfill@0.10.0:
resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==}
@@ -6639,6 +7409,9 @@ packages:
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ yaml-ast-parser@0.0.43:
+ resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==}
+
yaml@2.5.0:
resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==}
engines: {node: '>= 14'}
@@ -6701,6 +7474,36 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
+ '@ardatan/relay-compiler@12.0.0(graphql@16.9.0)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/generator': 7.25.5
+ '@babel/parser': 7.25.4
+ '@babel/runtime': 7.25.4
+ '@babel/traverse': 7.25.4(supports-color@5.5.0)
+ '@babel/types': 7.25.4
+ babel-preset-fbjs: 3.4.0(@babel/core@7.25.2)
+ chalk: 4.1.2
+ fb-watchman: 2.0.2
+ fbjs: 3.0.5
+ glob: 7.2.3
+ graphql: 16.9.0
+ immutable: 3.7.6
+ invariant: 2.2.4
+ nullthrows: 1.1.1
+ relay-runtime: 12.0.0
+ signedsource: 1.0.0
+ yargs: 15.4.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@ardatan/sync-fetch@0.0.1':
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
'@babel/code-frame@7.24.7':
dependencies:
'@babel/highlight': 7.24.7
@@ -6932,6 +7735,15 @@ snapshots:
'@babel/helper-plugin-utils': 7.24.8
'@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.25.2)':
+ dependencies:
+ '@babel/compat-data': 7.25.4
+ '@babel/core': 7.25.2
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2)
+
'@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
@@ -7595,6 +8407,27 @@ snapshots:
'@bcoe/v8-coverage@0.2.3': {}
+ '@bootnodedev/db-subgraph@0.1.0(@parcel/watcher@2.4.1)(@tanstack/react-query@5.52.2(react@18.3.1))(@types/node@22.5.0)(bufferutil@4.0.8)(graphql-tag@2.12.6(graphql@16.9.0))(react@18.3.1)(typescript@5.5.4)(utf-8-validate@5.0.10)(viem@2.10.11(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))':
+ dependencies:
+ '@graphql-codegen/cli': 5.0.2(@parcel/watcher@2.4.1)(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(typescript@5.5.4)(utf-8-validate@5.0.10)
+ '@graphql-codegen/typescript-graphql-request': 6.2.0(graphql-request@6.1.0(graphql@16.9.0))(graphql-tag@2.12.6(graphql@16.9.0))(graphql@16.9.0)
+ '@tanstack/react-query': 5.52.2(react@18.3.1)
+ graphql: 16.9.0
+ graphql-request: 6.1.0(graphql@16.9.0)
+ react: 18.3.1
+ viem: 2.10.11(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8)
+ transitivePeerDependencies:
+ - '@parcel/watcher'
+ - '@types/node'
+ - bufferutil
+ - cosmiconfig-toml-loader
+ - encoding
+ - enquirer
+ - graphql-tag
+ - supports-color
+ - typescript
+ - utf-8-validate
+
'@bootnodedev/db-ui-toolkit@1.0.0-beta.2':
dependencies:
react: 18.3.1
@@ -7971,6 +8804,511 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@graphql-codegen/add@5.0.3(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.6.2
+
+ '@graphql-codegen/cli@5.0.2(@parcel/watcher@2.4.1)(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(typescript@5.5.4)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@babel/generator': 7.25.5
+ '@babel/template': 7.25.0
+ '@babel/types': 7.25.4
+ '@graphql-codegen/client-preset': 4.3.3(graphql@16.9.0)
+ '@graphql-codegen/core': 4.0.2(graphql@16.9.0)
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@16.9.0)
+ '@graphql-tools/code-file-loader': 8.1.3(graphql@16.9.0)
+ '@graphql-tools/git-loader': 8.0.7(graphql@16.9.0)
+ '@graphql-tools/github-loader': 8.0.1(@types/node@22.5.0)(graphql@16.9.0)
+ '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0)
+ '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0)
+ '@graphql-tools/load': 8.0.2(graphql@16.9.0)
+ '@graphql-tools/prisma-loader': 8.0.4(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)
+ '@graphql-tools/url-loader': 8.0.2(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@whatwg-node/fetch': 0.8.8
+ chalk: 4.1.2
+ cosmiconfig: 8.3.6(typescript@5.5.4)
+ debounce: 1.2.1
+ detect-indent: 6.1.0
+ graphql: 16.9.0
+ graphql-config: 5.1.2(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(typescript@5.5.4)(utf-8-validate@5.0.10)
+ inquirer: 8.2.6
+ is-glob: 4.0.3
+ jiti: 1.21.6
+ json-to-pretty-yaml: 1.2.2
+ listr2: 4.0.5
+ log-symbols: 4.1.0
+ micromatch: 4.0.8
+ shell-quote: 1.8.1
+ string-env-interpolation: 1.0.1
+ ts-log: 2.2.5
+ tslib: 2.7.0
+ yaml: 2.5.0
+ yargs: 17.7.2
+ optionalDependencies:
+ '@parcel/watcher': 2.4.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - cosmiconfig-toml-loader
+ - encoding
+ - enquirer
+ - supports-color
+ - typescript
+ - utf-8-validate
+
+ '@graphql-codegen/client-preset@4.3.3(graphql@16.9.0)':
+ dependencies:
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/template': 7.25.0
+ '@graphql-codegen/add': 5.0.3(graphql@16.9.0)
+ '@graphql-codegen/gql-tag-operations': 4.0.9(graphql@16.9.0)
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-codegen/typed-document-node': 5.0.9(graphql@16.9.0)
+ '@graphql-codegen/typescript': 4.0.9(graphql@16.9.0)
+ '@graphql-codegen/typescript-operations': 4.2.3(graphql@16.9.0)
+ '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0)
+ '@graphql-tools/documents': 1.0.1(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-codegen/core@4.0.2(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-tools/schema': 10.0.6(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.6.2
+
+ '@graphql-codegen/gql-tag-operations@4.0.9(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ auto-bind: 4.0.0
+ graphql: 16.9.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-codegen/plugin-helpers@2.7.2(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 8.13.1(graphql@16.9.0)
+ change-case-all: 1.0.14
+ common-tags: 1.8.2
+ graphql: 16.9.0
+ import-from: 4.0.0
+ lodash: 4.17.21
+ tslib: 2.4.1
+
+ '@graphql-codegen/plugin-helpers@3.1.2(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 9.2.1(graphql@16.9.0)
+ change-case-all: 1.0.15
+ common-tags: 1.8.2
+ graphql: 16.9.0
+ import-from: 4.0.0
+ lodash: 4.17.21
+ tslib: 2.4.1
+
+ '@graphql-codegen/plugin-helpers@5.0.4(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ change-case-all: 1.0.15
+ common-tags: 1.8.2
+ graphql: 16.9.0
+ import-from: 4.0.0
+ lodash: 4.17.21
+ tslib: 2.6.2
+
+ '@graphql-codegen/schema-ast@4.1.0(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.6.2
+
+ '@graphql-codegen/typed-document-node@5.0.9(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0)
+ auto-bind: 4.0.0
+ change-case-all: 1.0.15
+ graphql: 16.9.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-codegen/typescript-graphql-request@6.2.0(graphql-request@6.1.0(graphql@16.9.0))(graphql-tag@2.12.6(graphql@16.9.0))(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 3.1.2(graphql@16.9.0)
+ '@graphql-codegen/visitor-plugin-common': 2.13.1(graphql@16.9.0)
+ auto-bind: 4.0.0
+ graphql: 16.9.0
+ graphql-request: 6.1.0(graphql@16.9.0)
+ graphql-tag: 2.12.6(graphql@16.9.0)
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-codegen/typescript-operations@4.2.3(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-codegen/typescript': 4.0.9(graphql@16.9.0)
+ '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0)
+ auto-bind: 4.0.0
+ graphql: 16.9.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-codegen/typescript@4.0.9(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-codegen/schema-ast': 4.1.0(graphql@16.9.0)
+ '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0)
+ auto-bind: 4.0.0
+ graphql: 16.9.0
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-codegen/visitor-plugin-common@2.13.1(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 2.7.2(graphql@16.9.0)
+ '@graphql-tools/optimize': 1.4.0(graphql@16.9.0)
+ '@graphql-tools/relay-operation-optimizer': 6.5.18(graphql@16.9.0)
+ '@graphql-tools/utils': 8.13.1(graphql@16.9.0)
+ auto-bind: 4.0.0
+ change-case-all: 1.0.14
+ dependency-graph: 0.11.0
+ graphql: 16.9.0
+ graphql-tag: 2.12.6(graphql@16.9.0)
+ parse-filepath: 1.0.2
+ tslib: 2.4.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-codegen/visitor-plugin-common@5.3.1(graphql@16.9.0)':
+ dependencies:
+ '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0)
+ '@graphql-tools/optimize': 2.0.0(graphql@16.9.0)
+ '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ auto-bind: 4.0.0
+ change-case-all: 1.0.15
+ dependency-graph: 0.11.0
+ graphql: 16.9.0
+ graphql-tag: 2.12.6(graphql@16.9.0)
+ parse-filepath: 1.0.2
+ tslib: 2.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-tools/apollo-engine-loader@8.0.1(graphql@16.9.0)':
+ dependencies:
+ '@ardatan/sync-fetch': 0.0.1
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@whatwg-node/fetch': 0.9.21
+ graphql: 16.9.0
+ tslib: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ '@graphql-tools/batch-execute@9.0.4(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ dataloader: 2.2.2
+ graphql: 16.9.0
+ tslib: 2.7.0
+ value-or-promise: 1.0.12
+
+ '@graphql-tools/code-file-loader@8.1.3(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ globby: 11.1.0
+ graphql: 16.9.0
+ tslib: 2.7.0
+ unixify: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@graphql-tools/delegate@10.0.21(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/batch-execute': 9.0.4(graphql@16.9.0)
+ '@graphql-tools/executor': 1.3.1(graphql@16.9.0)
+ '@graphql-tools/schema': 10.0.6(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@repeaterjs/repeater': 3.0.6
+ dataloader: 2.2.2
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ '@graphql-tools/documents@1.0.1(graphql@16.9.0)':
+ dependencies:
+ graphql: 16.9.0
+ lodash.sortby: 4.7.0
+ tslib: 2.7.0
+
+ '@graphql-tools/executor-graphql-ws@1.2.0(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@types/ws': 8.5.12
+ graphql: 16.9.0
+ graphql-ws: 5.16.0(graphql@16.9.0)
+ isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+ tslib: 2.7.0
+ ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ '@graphql-tools/executor-http@1.1.6(@types/node@22.5.0)(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@repeaterjs/repeater': 3.0.6
+ '@whatwg-node/fetch': 0.9.21
+ extract-files: 11.0.0
+ graphql: 16.9.0
+ meros: 1.3.0(@types/node@22.5.0)
+ tslib: 2.7.0
+ value-or-promise: 1.0.12
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@graphql-tools/executor-legacy-ws@1.1.0(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@types/ws': 8.5.12
+ graphql: 16.9.0
+ isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+ tslib: 2.7.0
+ ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ '@graphql-tools/executor@1.3.1(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0)
+ '@repeaterjs/repeater': 3.0.6
+ graphql: 16.9.0
+ tslib: 2.7.0
+ value-or-promise: 1.0.12
+
+ '@graphql-tools/git-loader@8.0.7(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ is-glob: 4.0.3
+ micromatch: 4.0.8
+ tslib: 2.7.0
+ unixify: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@graphql-tools/github-loader@8.0.1(@types/node@22.5.0)(graphql@16.9.0)':
+ dependencies:
+ '@ardatan/sync-fetch': 0.0.1
+ '@graphql-tools/executor-http': 1.1.6(@types/node@22.5.0)(graphql@16.9.0)
+ '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@whatwg-node/fetch': 0.9.21
+ graphql: 16.9.0
+ tslib: 2.7.0
+ value-or-promise: 1.0.12
+ transitivePeerDependencies:
+ - '@types/node'
+ - encoding
+ - supports-color
+
+ '@graphql-tools/graphql-file-loader@8.0.1(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/import': 7.0.1(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ globby: 11.1.0
+ graphql: 16.9.0
+ tslib: 2.7.0
+ unixify: 1.0.0
+
+ '@graphql-tools/graphql-tag-pluck@8.3.2(graphql@16.9.0)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/parser': 7.25.4
+ '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2)
+ '@babel/traverse': 7.25.4(supports-color@5.5.0)
+ '@babel/types': 7.25.4
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@graphql-tools/import@7.0.1(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ resolve-from: 5.0.0
+ tslib: 2.7.0
+
+ '@graphql-tools/json-file-loader@8.0.1(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ globby: 11.1.0
+ graphql: 16.9.0
+ tslib: 2.7.0
+ unixify: 1.0.0
+
+ '@graphql-tools/load@8.0.2(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/schema': 10.0.6(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ p-limit: 3.1.0
+ tslib: 2.7.0
+
+ '@graphql-tools/merge@9.0.7(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ '@graphql-tools/optimize@1.4.0(graphql@16.9.0)':
+ dependencies:
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ '@graphql-tools/optimize@2.0.0(graphql@16.9.0)':
+ dependencies:
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ '@graphql-tools/prisma-loader@8.0.4(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@graphql-tools/url-loader': 8.0.2(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@types/js-yaml': 4.0.9
+ '@whatwg-node/fetch': 0.9.21
+ chalk: 4.1.2
+ debug: 4.3.6(supports-color@5.5.0)
+ dotenv: 16.4.5
+ graphql: 16.9.0
+ graphql-request: 6.1.0(graphql@16.9.0)
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.5
+ jose: 5.8.0
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ scuid: 1.1.0
+ tslib: 2.7.0
+ yaml-ast-parser: 0.0.43
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - encoding
+ - supports-color
+ - utf-8-validate
+
+ '@graphql-tools/relay-operation-optimizer@6.5.18(graphql@16.9.0)':
+ dependencies:
+ '@ardatan/relay-compiler': 12.0.0(graphql@16.9.0)
+ '@graphql-tools/utils': 9.2.1(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-tools/relay-operation-optimizer@7.0.1(graphql@16.9.0)':
+ dependencies:
+ '@ardatan/relay-compiler': 12.0.0(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ '@graphql-tools/schema@10.0.6(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/merge': 9.0.7(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.7.0
+ value-or-promise: 1.0.12
+
+ '@graphql-tools/url-loader@8.0.2(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@ardatan/sync-fetch': 0.0.1
+ '@graphql-tools/delegate': 10.0.21(graphql@16.9.0)
+ '@graphql-tools/executor-graphql-ws': 1.2.0(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)
+ '@graphql-tools/executor-http': 1.1.6(@types/node@22.5.0)(graphql@16.9.0)
+ '@graphql-tools/executor-legacy-ws': 1.1.0(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ '@graphql-tools/wrap': 10.0.5(graphql@16.9.0)
+ '@types/ws': 8.5.12
+ '@whatwg-node/fetch': 0.9.21
+ graphql: 16.9.0
+ isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+ tslib: 2.7.0
+ value-or-promise: 1.0.12
+ ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - encoding
+ - utf-8-validate
+
+ '@graphql-tools/utils@10.5.4(graphql@16.9.0)':
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0)
+ cross-inspect: 1.0.1
+ dset: 3.1.4
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ '@graphql-tools/utils@8.13.1(graphql@16.9.0)':
+ dependencies:
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ '@graphql-tools/utils@9.2.1(graphql@16.9.0)':
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ '@graphql-tools/wrap@10.0.5(graphql@16.9.0)':
+ dependencies:
+ '@graphql-tools/delegate': 10.0.21(graphql@16.9.0)
+ '@graphql-tools/schema': 10.0.6(graphql@16.9.0)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ graphql: 16.9.0
+ tslib: 2.7.0
+ value-or-promise: 1.0.12
+
+ '@graphql-typed-document-node/core@3.2.0(graphql@16.9.0)':
+ dependencies:
+ graphql: 16.9.0
+
'@hapi/hoek@9.3.0': {}
'@hapi/topo@5.1.0':
@@ -8061,6 +9399,8 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
+ '@kamilkisiela/fast-url-parser@1.1.4': {}
+
'@lifi/sdk@3.1.5(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)))(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(viem@2.10.11(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8))':
dependencies:
'@lifi/types': 15.3.2
@@ -8246,6 +9586,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@molt/command@0.9.0':
+ dependencies:
+ '@molt/types': 0.2.0
+ alge: 0.8.1
+ chalk: 5.3.0
+ lodash.camelcase: 4.3.0
+ lodash.snakecase: 4.1.1
+ readline-sync: 1.4.10
+ string-length: 6.0.0
+ strip-ansi: 7.1.0
+ ts-toolbelt: 9.6.0
+ type-fest: 4.26.1
+ zod: 3.23.8
+
+ '@molt/types@0.2.0':
+ dependencies:
+ ts-toolbelt: 9.6.0
+
'@motionone/animation@10.18.0':
dependencies:
'@motionone/easing': 10.18.0
@@ -8391,6 +9749,24 @@ snapshots:
'@parcel/watcher-win32-ia32': 2.4.1
'@parcel/watcher-win32-x64': 2.4.1
+ '@peculiar/asn1-schema@2.3.13':
+ dependencies:
+ asn1js: 3.0.5
+ pvtsutils: 1.3.5
+ tslib: 2.7.0
+
+ '@peculiar/json-schema@1.1.12':
+ dependencies:
+ tslib: 2.7.0
+
+ '@peculiar/webcrypto@1.5.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.3.13
+ '@peculiar/json-schema': 1.1.12
+ pvtsutils: 1.3.5
+ tslib: 2.7.0
+ webcrypto-core: 1.8.0
+
'@react-native-community/cli-clean@14.0.0':
dependencies:
'@react-native-community/cli-tools': 14.0.0
@@ -8693,6 +10069,8 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.4
+ '@repeaterjs/repeater@3.0.6': {}
+
'@rollup/rollup-android-arm-eabi@4.21.1':
optional: true
@@ -9186,6 +10564,8 @@ snapshots:
dependencies:
'@types/istanbul-lib-report': 3.0.3
+ '@types/js-yaml@4.0.9': {}
+
'@types/json5@0.0.29': {}
'@types/ms@0.7.34': {}
@@ -9791,6 +11171,36 @@ snapshots:
'@walletconnect/window-getters': 1.0.1
tslib: 1.14.1
+ '@whatwg-node/events@0.0.3': {}
+
+ '@whatwg-node/fetch@0.8.8':
+ dependencies:
+ '@peculiar/webcrypto': 1.5.0
+ '@whatwg-node/node-fetch': 0.3.6
+ busboy: 1.6.0
+ urlpattern-polyfill: 8.0.2
+ web-streams-polyfill: 3.3.3
+
+ '@whatwg-node/fetch@0.9.21':
+ dependencies:
+ '@whatwg-node/node-fetch': 0.5.26
+ urlpattern-polyfill: 10.0.0
+
+ '@whatwg-node/node-fetch@0.3.6':
+ dependencies:
+ '@whatwg-node/events': 0.0.3
+ busboy: 1.6.0
+ fast-querystring: 1.1.2
+ fast-url-parser: 1.1.3
+ tslib: 2.7.0
+
+ '@whatwg-node/node-fetch@0.5.26':
+ dependencies:
+ '@kamilkisiela/fast-url-parser': 1.1.4
+ busboy: 1.6.0
+ fast-querystring: 1.1.2
+ tslib: 2.7.0
+
JSONStream@1.3.5:
dependencies:
jsonparse: 1.3.1
@@ -9835,6 +11245,11 @@ snapshots:
dependencies:
humanize-ms: 1.2.1
+ aggregate-error@3.1.0:
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+
ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
@@ -9849,8 +11264,19 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
+ alge@0.8.1:
+ dependencies:
+ lodash.ismatch: 4.4.0
+ remeda: 1.61.0
+ ts-toolbelt: 9.6.0
+ zod: 3.23.8
+
anser@1.4.10: {}
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
ansi-escapes@7.0.0:
dependencies:
environment: 1.1.0
@@ -9973,6 +11399,12 @@ snapshots:
asap@2.0.6: {}
+ asn1js@3.0.5:
+ dependencies:
+ pvtsutils: 1.3.5
+ pvutils: 1.1.3
+ tslib: 2.7.0
+
assertion-error@1.1.0: {}
ast-types-flow@0.0.8: {}
@@ -9995,6 +11427,8 @@ snapshots:
atomic-sleep@1.0.0: {}
+ auto-bind@4.0.0: {}
+
available-typed-arrays@1.0.7:
dependencies:
possible-typed-array-names: 1.0.0
@@ -10051,15 +11485,50 @@ snapshots:
picomatch: 2.3.1
styled-components: 5.3.11(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
transitivePeerDependencies:
- - '@babel/core'
+ - '@babel/core'
+ - supports-color
+
+ babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {}
+
+ babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.25.2):
+ dependencies:
+ '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - '@babel/core'
+
+ babel-preset-fbjs@3.4.0(@babel/core@7.25.2):
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2)
+ '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.25.2)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2)
+ '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2)
+ '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2)
+ '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2)
+ '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2)
+ '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2)
+ '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2)
+ '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2)
+ '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2)
+ babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0
+ transitivePeerDependencies:
- supports-color
- babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.25.2):
- dependencies:
- '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2)
- transitivePeerDependencies:
- - '@babel/core'
-
balanced-match@1.0.2: {}
balanced-match@2.0.0: {}
@@ -10157,6 +11626,10 @@ snapshots:
esbuild: 0.19.12
load-tsconfig: 0.2.5
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
+
bytes@3.0.0: {}
cac@6.7.14: {}
@@ -10181,6 +11654,11 @@ snapshots:
callsites@3.1.0: {}
+ camel-case@4.1.2:
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.7.0
+
camelcase@5.3.1: {}
camelcase@6.3.0: {}
@@ -10191,6 +11669,12 @@ snapshots:
caniuse-lite@1.0.30001653: {}
+ capital-case@1.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.7.0
+ upper-case-first: 2.0.2
+
chai@4.5.0:
dependencies:
assertion-error: 1.1.0
@@ -10219,8 +11703,51 @@ snapshots:
chalk@5.3.0: {}
+ change-case-all@1.0.14:
+ dependencies:
+ change-case: 4.1.2
+ is-lower-case: 2.0.2
+ is-upper-case: 2.0.2
+ lower-case: 2.0.2
+ lower-case-first: 2.0.2
+ sponge-case: 1.0.1
+ swap-case: 2.0.2
+ title-case: 3.0.3
+ upper-case: 2.0.2
+ upper-case-first: 2.0.2
+
+ change-case-all@1.0.15:
+ dependencies:
+ change-case: 4.1.2
+ is-lower-case: 2.0.2
+ is-upper-case: 2.0.2
+ lower-case: 2.0.2
+ lower-case-first: 2.0.2
+ sponge-case: 1.0.1
+ swap-case: 2.0.2
+ title-case: 3.0.3
+ upper-case: 2.0.2
+ upper-case-first: 2.0.2
+
+ change-case@4.1.2:
+ dependencies:
+ camel-case: 4.1.2
+ capital-case: 1.0.4
+ constant-case: 3.0.4
+ dot-case: 3.0.4
+ header-case: 2.0.4
+ no-case: 3.0.4
+ param-case: 3.0.4
+ pascal-case: 3.1.2
+ path-case: 3.0.4
+ sentence-case: 3.0.4
+ snake-case: 3.0.4
+ tslib: 2.7.0
+
change-case@5.4.4: {}
+ chardet@0.7.0: {}
+
check-error@1.0.3:
dependencies:
get-func-name: 2.0.2
@@ -10265,6 +11792,8 @@ snapshots:
dependencies:
consola: 3.2.3
+ clean-stack@2.2.0: {}
+
cli-cursor@3.1.0:
dependencies:
restore-cursor: 3.1.0
@@ -10279,11 +11808,18 @@ snapshots:
cli-spinners@2.9.2: {}
+ cli-truncate@2.1.0:
+ dependencies:
+ slice-ansi: 3.0.0
+ string-width: 4.2.3
+
cli-truncate@4.0.0:
dependencies:
slice-ansi: 5.0.0
string-width: 7.2.0
+ cli-width@3.0.0: {}
+
clipboardy@4.0.0:
dependencies:
execa: 8.0.1
@@ -10344,6 +11880,8 @@ snapshots:
commander@9.5.0: {}
+ common-tags@1.8.2: {}
+
commondir@1.0.1: {}
compare-func@2.0.0:
@@ -10401,6 +11939,12 @@ snapshots:
consola@3.2.3: {}
+ constant-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.7.0
+ upper-case: 2.0.2
+
conventional-changelog-angular@7.0.0:
dependencies:
compare-func: 2.0.0
@@ -10440,6 +11984,15 @@ snapshots:
js-yaml: 3.14.1
parse-json: 4.0.0
+ cosmiconfig@8.3.6(typescript@5.5.4):
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.5.4
+
cosmiconfig@9.0.0(typescript@5.5.4):
dependencies:
env-paths: 2.2.1
@@ -10465,6 +12018,10 @@ snapshots:
transitivePeerDependencies:
- encoding
+ cross-inspect@1.0.1:
+ dependencies:
+ tslib: 2.7.0
+
cross-spawn@7.0.3:
dependencies:
path-key: 3.1.1
@@ -10525,6 +12082,8 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.1
+ dataloader@2.2.2: {}
+
date-fns@2.30.0:
dependencies:
'@babel/runtime': 7.25.4
@@ -10612,6 +12171,8 @@ snapshots:
depd@2.0.0: {}
+ dependency-graph@0.11.0: {}
+
dequal@2.0.3: {}
destr@2.0.3: {}
@@ -10620,6 +12181,8 @@ snapshots:
detect-browser@5.3.0: {}
+ detect-indent@6.1.0: {}
+
detect-libc@1.0.3: {}
diff-sequences@29.6.3: {}
@@ -10649,6 +12212,11 @@ snapshots:
'@babel/runtime': 7.25.4
csstype: 3.1.3
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.7.0
+
dot-prop@5.3.0:
dependencies:
is-obj: 2.0.0
@@ -10657,6 +12225,8 @@ snapshots:
dotenv@16.4.5: {}
+ dset@3.1.4: {}
+
duplexify@4.1.3:
dependencies:
end-of-stream: 1.4.4
@@ -11187,8 +12757,18 @@ snapshots:
readable-stream: 3.6.2
webextension-polyfill: 0.10.0
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ extract-files@11.0.0: {}
+
eyes@0.1.8: {}
+ fast-decode-uri-component@1.0.1: {}
+
fast-deep-equal@3.1.3: {}
fast-glob@3.3.2:
@@ -11203,6 +12783,10 @@ snapshots:
fast-levenshtein@2.0.6: {}
+ fast-querystring@1.1.2:
+ dependencies:
+ fast-decode-uri-component: 1.0.1
+
fast-redact@3.5.0: {}
fast-safe-stringify@2.1.1: {}
@@ -11211,6 +12795,10 @@ snapshots:
fast-uri@3.0.1: {}
+ fast-url-parser@1.1.3:
+ dependencies:
+ punycode: 1.4.1
+
fast-xml-parser@4.4.1:
dependencies:
strnum: 1.0.5
@@ -11225,10 +12813,28 @@ snapshots:
dependencies:
bser: 2.1.1
+ fbjs-css-vars@1.0.2: {}
+
+ fbjs@3.0.5:
+ dependencies:
+ cross-fetch: 3.1.8
+ fbjs-css-vars: 1.0.2
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ promise: 7.3.1
+ setimmediate: 1.0.5
+ ua-parser-js: 1.0.38
+ transitivePeerDependencies:
+ - encoding
+
fdir@6.3.0(picomatch@3.0.1):
optionalDependencies:
picomatch: 3.0.1
+ figures@3.2.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
file-entry-cache@6.0.1:
dependencies:
flat-cache: 3.2.0
@@ -11471,6 +13077,53 @@ snapshots:
graphemer@1.4.0: {}
+ graphql-config@5.1.2(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(typescript@5.5.4)(utf-8-validate@5.0.10):
+ dependencies:
+ '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0)
+ '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0)
+ '@graphql-tools/load': 8.0.2(graphql@16.9.0)
+ '@graphql-tools/merge': 9.0.7(graphql@16.9.0)
+ '@graphql-tools/url-loader': 8.0.2(@types/node@22.5.0)(bufferutil@4.0.8)(graphql@16.9.0)(utf-8-validate@5.0.10)
+ '@graphql-tools/utils': 10.5.4(graphql@16.9.0)
+ cosmiconfig: 9.0.0(typescript@5.5.4)
+ graphql: 16.9.0
+ jiti: 1.21.6
+ minimatch: 9.0.5
+ string-env-interpolation: 1.0.1
+ tslib: 2.7.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+
+ graphql-request@6.1.0(graphql@16.9.0):
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0)
+ cross-fetch: 3.1.8
+ graphql: 16.9.0
+ transitivePeerDependencies:
+ - encoding
+
+ graphql-request@7.1.0(graphql@16.9.0):
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0)
+ '@molt/command': 0.9.0
+ graphql: 16.9.0
+ zod: 3.23.8
+
+ graphql-tag@2.12.6(graphql@16.9.0):
+ dependencies:
+ graphql: 16.9.0
+ tslib: 2.7.0
+
+ graphql-ws@5.16.0(graphql@16.9.0):
+ dependencies:
+ graphql: 16.9.0
+
+ graphql@16.9.0: {}
+
h3@1.12.0:
dependencies:
cookie-es: 1.2.2
@@ -11513,6 +13166,11 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ header-case@2.0.4:
+ dependencies:
+ capital-case: 1.0.4
+ tslib: 2.7.0
+
hermes-estree@0.22.0: {}
hermes-estree@0.23.0: {}
@@ -11587,6 +13245,10 @@ snapshots:
dependencies:
'@babel/runtime': 7.25.4
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
@@ -11601,6 +13263,8 @@ snapshots:
dependencies:
queue: 6.0.2
+ immutable@3.7.6: {}
+
import-fresh@2.0.0:
dependencies:
caller-path: 2.0.0
@@ -11611,6 +13275,8 @@ snapshots:
parent-module: 1.0.1
resolve-from: 4.0.0
+ import-from@4.0.0: {}
+
import-meta-resolve@4.1.0: {}
imurmurhash@0.1.4: {}
@@ -11628,6 +13294,24 @@ snapshots:
ini@4.1.1: {}
+ inquirer@8.2.6:
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 6.2.0
+
internal-slot@1.0.7:
dependencies:
es-errors: 1.3.0
@@ -11640,6 +13324,11 @@ snapshots:
iron-webcrypto@1.2.1: {}
+ is-absolute@1.0.0:
+ dependencies:
+ is-relative: 1.0.0
+ is-windows: 1.0.2
+
is-arguments@1.1.1:
dependencies:
call-bind: 1.0.7
@@ -11725,6 +13414,10 @@ snapshots:
is-interactive@2.0.0: {}
+ is-lower-case@2.0.2:
+ dependencies:
+ tslib: 2.7.0
+
is-map@2.0.3: {}
is-negative-zero@2.0.3: {}
@@ -11752,6 +13445,10 @@ snapshots:
call-bind: 1.0.7
has-tostringtag: 1.0.2
+ is-relative@1.0.0:
+ dependencies:
+ is-unc-path: 1.0.0
+
is-set@2.0.3: {}
is-shared-array-buffer@1.0.3:
@@ -11778,10 +13475,18 @@ snapshots:
dependencies:
which-typed-array: 1.1.15
+ is-unc-path@1.0.0:
+ dependencies:
+ unc-path-regex: 0.1.2
+
is-unicode-supported@0.1.0: {}
is-unicode-supported@1.3.0: {}
+ is-upper-case@2.0.2:
+ dependencies:
+ tslib: 2.7.0
+
is-weakmap@2.0.2: {}
is-weakref@1.0.2:
@@ -11793,6 +13498,8 @@ snapshots:
call-bind: 1.0.7
get-intrinsic: 1.2.4
+ is-windows@1.0.2: {}
+
is-wsl@1.1.0: {}
is-wsl@2.2.0:
@@ -11819,6 +13526,10 @@ snapshots:
dependencies:
ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)):
+ dependencies:
+ ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+
isows@1.0.4(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)):
dependencies:
ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
@@ -11934,6 +13645,8 @@ snapshots:
'@sideway/formula': 3.0.1
'@sideway/pinpoint': 2.0.0
+ jose@5.8.0: {}
+
js-tokens@4.0.0: {}
js-tokens@9.0.0: {}
@@ -12029,6 +13742,11 @@ snapshots:
json-stringify-safe@5.0.1: {}
+ json-to-pretty-yaml@1.2.2:
+ dependencies:
+ remedial: 1.0.8
+ remove-trailing-spaces: 1.0.8
+
json5@1.0.2:
dependencies:
minimist: 1.2.8
@@ -12138,6 +13856,17 @@ snapshots:
transitivePeerDependencies:
- uWebSockets.js
+ listr2@4.0.5:
+ dependencies:
+ cli-truncate: 2.1.0
+ colorette: 2.0.20
+ log-update: 4.0.0
+ p-map: 4.0.0
+ rfdc: 1.4.1
+ rxjs: 7.8.1
+ through: 2.3.8
+ wrap-ansi: 7.0.0
+
listr2@8.2.4:
dependencies:
cli-truncate: 4.0.0
@@ -12193,6 +13922,8 @@ snapshots:
lodash.isequal@4.5.0: {}
+ lodash.ismatch@4.4.0: {}
+
lodash.isplainobject@4.0.6: {}
lodash.kebabcase@4.1.1: {}
@@ -12203,6 +13934,8 @@ snapshots:
lodash.snakecase@4.1.1: {}
+ lodash.sortby@4.7.0: {}
+
lodash.startcase@4.4.0: {}
lodash.throttle@4.1.1: {}
@@ -12225,6 +13958,13 @@ snapshots:
chalk: 5.3.0
is-unicode-supported: 1.3.0
+ log-update@4.0.0:
+ dependencies:
+ ansi-escapes: 4.3.2
+ cli-cursor: 3.1.0
+ slice-ansi: 4.0.0
+ wrap-ansi: 6.2.0
+
log-update@6.1.0:
dependencies:
ansi-escapes: 7.0.0
@@ -12247,6 +13987,14 @@ snapshots:
dependencies:
get-func-name: 2.0.2
+ lower-case-first@2.0.2:
+ dependencies:
+ tslib: 2.7.0
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.7.0
+
lru-cache@10.4.3: {}
lru-cache@5.1.1:
@@ -12282,6 +14030,8 @@ snapshots:
dependencies:
tmpl: 1.0.5
+ map-cache@0.2.2: {}
+
markdown-it@14.1.0:
dependencies:
argparse: 2.0.1
@@ -12309,6 +14059,10 @@ snapshots:
merge2@1.4.1: {}
+ meros@1.3.0(@types/node@22.5.0):
+ optionalDependencies:
+ '@types/node': 22.5.0
+
mersenne-twister@1.1.0: {}
metro-babel-transformer@0.80.10:
@@ -12574,6 +14328,8 @@ snapshots:
multiformats@9.9.0: {}
+ mute-stream@0.0.8: {}
+
nanoid@3.3.7: {}
natural-compare-lite@1.4.0: {}
@@ -12589,6 +14345,11 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.7.0
+
nocache@3.0.4: {}
node-abort-controller@3.1.1: {}
@@ -12619,6 +14380,10 @@ snapshots:
node-stream-zip@1.15.0: {}
+ normalize-path@2.1.1:
+ dependencies:
+ remove-trailing-separator: 1.1.0
+
normalize-path@3.0.0: {}
npm-run-path@4.0.1:
@@ -12770,6 +14535,8 @@ snapshots:
strip-ansi: 7.1.0
wcwidth: 1.0.1
+ os-tmpdir@1.0.2: {}
+
p-limit@2.3.0:
dependencies:
p-try: 2.2.0
@@ -12802,12 +14569,27 @@ snapshots:
dependencies:
p-limit: 4.0.0
+ p-map@4.0.0:
+ dependencies:
+ aggregate-error: 3.1.0
+
p-try@2.2.0: {}
+ param-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.7.0
+
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
+ parse-filepath@1.0.2:
+ dependencies:
+ is-absolute: 1.0.0
+ map-cache: 0.2.2
+ path-root: 0.1.1
+
parse-json@4.0.0:
dependencies:
error-ex: 1.3.2
@@ -12826,6 +14608,16 @@ snapshots:
parseurl@1.3.3: {}
+ pascal-case@3.1.2:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.7.0
+
+ path-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.7.0
+
path-exists@3.0.0: {}
path-exists@4.0.0: {}
@@ -12840,6 +14632,12 @@ snapshots:
path-parse@1.0.7: {}
+ path-root-regex@0.1.2: {}
+
+ path-root@0.1.1:
+ dependencies:
+ path-root-regex: 0.1.2
+
path-type@4.0.0: {}
pathe@1.1.2: {}
@@ -12965,6 +14763,10 @@ snapshots:
process-warning@1.0.0: {}
+ promise@7.3.1:
+ dependencies:
+ asap: 2.0.6
+
promise@8.3.0:
dependencies:
asap: 2.0.6
@@ -12991,8 +14793,16 @@ snapshots:
punycode.js@2.3.1: {}
+ punycode@1.4.1: {}
+
punycode@2.3.1: {}
+ pvtsutils@1.3.5:
+ dependencies:
+ tslib: 2.7.0
+
+ pvutils@1.1.3: {}
+
qr-code-styling@1.6.0-rc.1:
dependencies:
qrcode-generator: 1.4.4
@@ -13186,6 +14996,8 @@ snapshots:
dependencies:
picomatch: 2.3.1
+ readline-sync@1.4.10: {}
+
readline@1.3.0: {}
real-require@0.1.0: {}
@@ -13246,6 +15058,22 @@ snapshots:
dependencies:
jsesc: 0.5.0
+ relay-runtime@12.0.0:
+ dependencies:
+ '@babel/runtime': 7.25.4
+ fbjs: 3.0.5
+ invariant: 2.2.4
+ transitivePeerDependencies:
+ - encoding
+
+ remeda@1.61.0: {}
+
+ remedial@1.0.8: {}
+
+ remove-trailing-separator@1.1.0: {}
+
+ remove-trailing-spaces@1.0.8: {}
+
require-directory@2.1.1: {}
require-from-string@2.0.2: {}
@@ -13351,10 +15179,16 @@ snapshots:
rrweb-cssom@0.7.1: {}
+ run-async@2.4.1: {}
+
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.7.0
+
safe-array-concat@1.1.2:
dependencies:
call-bind: 1.0.7
@@ -13388,6 +15222,8 @@ snapshots:
dependencies:
loose-envify: 1.4.0
+ scuid@1.1.0: {}
+
secp256k1@5.0.0:
dependencies:
elliptic: 6.5.7
@@ -13423,6 +15259,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ sentence-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.7.0
+ upper-case-first: 2.0.2
+
serialize-error@2.1.0: {}
serve-static@1.15.0:
@@ -13454,6 +15296,8 @@ snapshots:
functions-have-names: 1.2.3
has-property-descriptors: 1.0.2
+ setimmediate@1.0.5: {}
+
setprototypeof@1.2.0: {}
sha.js@2.4.11:
@@ -13493,6 +15337,8 @@ snapshots:
signal-exit@4.1.0: {}
+ signedsource@1.0.0: {}
+
sisteransi@1.0.5: {}
slash@3.0.0: {}
@@ -13503,6 +15349,12 @@ snapshots:
astral-regex: 1.0.0
is-fullwidth-code-point: 2.0.0
+ slice-ansi@3.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+
slice-ansi@4.0.0:
dependencies:
ansi-styles: 4.3.0
@@ -13519,6 +15371,11 @@ snapshots:
ansi-styles: 6.2.1
is-fullwidth-code-point: 5.0.0
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.7.0
+
socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10):
dependencies:
'@socket.io/component-emitter': 3.1.2
@@ -13558,6 +15415,10 @@ snapshots:
split2@4.2.0: {}
+ sponge-case@1.0.1:
+ dependencies:
+ tslib: 2.7.0
+
sprintf-js@1.0.3: {}
stack-utils@2.0.6:
@@ -13588,10 +15449,18 @@ snapshots:
stream-shift@1.0.3: {}
+ streamsearch@1.1.0: {}
+
strict-uri-encode@2.0.0: {}
string-argv@0.3.2: {}
+ string-env-interpolation@1.0.1: {}
+
+ string-length@6.0.0:
+ dependencies:
+ strip-ansi: 7.1.0
+
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
@@ -13806,6 +15675,10 @@ snapshots:
svg-tags@1.0.0: {}
+ swap-case@2.0.2:
+ dependencies:
+ tslib: 2.7.0
+
symbol-tree@3.2.4: {}
system-architecture@0.1.0: {}
@@ -13868,6 +15741,14 @@ snapshots:
tinyspy@2.2.1: {}
+ title-case@3.0.3:
+ dependencies:
+ tslib: 2.7.0
+
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
tmpl@1.0.5: {}
to-fast-properties@2.0.0: {}
@@ -13895,6 +15776,8 @@ snapshots:
dependencies:
typescript: 5.5.4
+ ts-log@2.2.5: {}
+
ts-node@10.9.2(@swc/core@1.7.18(@swc/helpers@0.5.12))(@types/node@22.5.0)(typescript@5.5.4):
dependencies:
'@cspotcode/source-map-support': 0.8.1
@@ -13915,6 +15798,8 @@ snapshots:
optionalDependencies:
'@swc/core': 1.7.18(@swc/helpers@0.5.12)
+ ts-toolbelt@9.6.0: {}
+
tsc-files@1.1.4(typescript@5.5.4):
dependencies:
typescript: 5.5.4
@@ -13928,6 +15813,8 @@ snapshots:
tslib@1.14.1: {}
+ tslib@2.4.1: {}
+
tslib@2.6.2: {}
tslib@2.7.0: {}
@@ -13942,8 +15829,12 @@ snapshots:
type-fest@0.20.2: {}
+ type-fest@0.21.3: {}
+
type-fest@0.7.1: {}
+ type-fest@4.26.1: {}
+
typed-array-buffer@1.0.2:
dependencies:
call-bind: 1.0.7
@@ -14004,6 +15895,8 @@ snapshots:
typescript@5.5.4: {}
+ ua-parser-js@1.0.38: {}
+
uc.micro@2.1.0: {}
ufo@1.5.4: {}
@@ -14019,6 +15912,8 @@ snapshots:
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
+ unc-path-regex@0.1.2: {}
+
uncrypto@0.1.3: {}
undici-types@6.19.8: {}
@@ -14050,6 +15945,10 @@ snapshots:
universalify@2.0.1: {}
+ unixify@1.0.0:
+ dependencies:
+ normalize-path: 2.1.1
+
unpipe@1.0.0: {}
unplugin@1.12.2:
@@ -14088,6 +15987,14 @@ snapshots:
escalade: 3.1.2
picocolors: 1.0.1
+ upper-case-first@2.0.2:
+ dependencies:
+ tslib: 2.7.0
+
+ upper-case@2.0.2:
+ dependencies:
+ tslib: 2.7.0
+
uqr@0.1.2: {}
uri-js@4.4.1:
@@ -14099,6 +16006,10 @@ snapshots:
querystringify: 2.2.0
requires-port: 1.0.0
+ urlpattern-polyfill@10.0.0: {}
+
+ urlpattern-polyfill@8.0.2: {}
+
use-debounce@10.0.3(react@18.3.1):
dependencies:
react: 18.3.1
@@ -14141,6 +16052,8 @@ snapshots:
'@types/react': 18.3.4
react: 18.3.1
+ value-or-promise@1.0.12: {}
+
vary@1.1.2: {}
viem@2.10.11(bufferutil@4.0.8)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.23.8):
@@ -14274,6 +16187,16 @@ snapshots:
dependencies:
defaults: 1.0.4
+ web-streams-polyfill@3.3.3: {}
+
+ webcrypto-core@1.8.0:
+ dependencies:
+ '@peculiar/asn1-schema': 2.3.13
+ '@peculiar/json-schema': 1.1.12
+ asn1js: 3.0.5
+ pvtsutils: 1.3.5
+ tslib: 2.7.0
+
webextension-polyfill@0.10.0: {}
webidl-conversions@3.0.1: {}
@@ -14429,6 +16352,8 @@ snapshots:
yallist@3.1.1: {}
+ yaml-ast-parser@0.0.43: {}
+
yaml@2.5.0: {}
yargs-parser@18.1.3:
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
deleted file mode 100644
index 63b127d0..00000000
--- a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List.tsx
+++ /dev/null
@@ -1,279 +0,0 @@
-import { useState } from 'react'
-import styled, { css } from 'styled-components'
-
-import {
- ExternalLink,
- CopyButton,
- Toast,
- SkeletonLoading,
- breakpointMediaQuery,
- Item,
-} from '@bootnodedev/db-ui-toolkit'
-import { useSuspenseQuery } from '@tanstack/react-query'
-import request from 'graphql-request'
-import { toast } from 'react-hot-toast'
-import { arbitrum, base, type Chain, optimism, polygon } from 'viem/chains'
-
-import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
-import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
-import ArbitrumDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Arbitrum'
-import BaseDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Base'
-import OptimismDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
-import PolygonDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Polygon'
-import { allAaveReservesQueryDocument } from '@/src/subgraphs/queries/aave/reserves'
-import { allUniswapPoolsQueryDocument } from '@/src/subgraphs/queries/uniswap/pools'
-import { appSchemas } from '@/src/subgraphs/utils/appSchemas'
-import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
-
-const chainNameMapping: { [key: number]: string } = {
- [arbitrum.id]: 'arbitrum',
- [optimism.id]: 'optimism',
- [polygon.id]: 'polygon',
-}
-
-const Wrapper = styled.div`
- [data-theme='light'] & {
- --theme-subgraph-title-color: #2e3048;
- --theme-subgraph-name-color: #2e3048;
- --theme-subgraph-bullet-color: #f7f7f7;
- --theme-subgraph-bullet-background-color: #2e3048;
- }
-
- [data-theme='dark'] & {
- --theme-subgraph-title-color: #fff;
- --theme-subgraph-name-color: #fff;
- --theme-subgraph-bullet-color: #2e3048;
- --theme-subgraph-bullet-background-color: #fff;
- }
-
- display: flex;
- flex-direction: column;
- padding-top: var(--base-common-padding);
- row-gap: calc(var(--base-gap-xl) * 2);
- width: 100%;
-
- ${breakpointMediaQuery(
- 'tabletPortraitStart',
- css`
- padding-top: calc(var(--base-common-padding) * 3);
- row-gap: calc(var(--base-gap-xl) * 3);
- `,
- )}
-`
-
-const Group = styled.div`
- counter-reset: item-number;
- display: flex;
- flex-direction: column;
- row-gap: var(--base-gap-xl);
- padding: 0 var(--base-common-padding);
-
- ${breakpointMediaQuery(
- 'desktopStart',
- css`
- padding: 0;
- `,
- )}
-`
-
-const Title = styled.h3`
- align-items: center;
- color: var(--theme-subgraph-title-color);
- column-gap: var(--base-gap);
- display: flex;
- font-size: 1.6rem;
- font-weight: 700;
- line-height: 1.2;
- margin: 0;
- padding-bottom: var(--base-common-padding);
-`
-
-const Arbitrum = styled(ArbitrumDefault)`
- height: 20px;
- width: 20px;
-`
-
-const Polygon = styled(PolygonDefault)`
- height: 20px;
- width: 20px;
-`
-
-const Optimism = styled(OptimismDefault)`
- height: 20px;
- width: 20px;
-`
-
-const Base = styled(BaseDefault)`
- height: 20px;
- width: 20px;
-`
-
-const Row = styled.div`
- align-items: center;
- color: var(--theme-subgraph-name-color);
- column-gap: var(--base-gap);
- display: flex;
-
- &::before {
- --base-size: 18px;
-
- align-items: center;
- background-color: var(--theme-subgraph-bullet-background-color);
- border-radius: 50%;
- color: var(--theme-subgraph-bullet-color);
- content: counter(item-number, decimal-leading-zero);
- counter-increment: item-number;
- display: flex;
- flex-shrink: 0;
- font-size: 1rem;
- font-weight: 700;
- height: var(--base-size);
- justify-content: center;
- letter-spacing: -1px;
- line-height: 1;
- padding-right: 2px;
- width: var(--base-size);
- }
-`
-
-const Name = styled.div`
- font-size: 1.6rem;
- font-weight: 400;
- line-height: 1.2;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- display: block;
-`
-
-const Copy = ({ value }: { value: string }) => {
- const handleCopy = () => {
- const timeDelay = 2500
- toast.custom(Copied to the clipboard! , {
- duration: timeDelay,
- position: 'top-center',
- id: 'copy-to-clipboard',
- })
- }
-
- return
-}
-
-// eslint-disable-next-line react-refresh/only-export-components
-export const getNetworkIcon = (chainName: string) => (
- <>
- {chainName === 'arbitrum one' && }
- {chainName === 'polygon' && }
- {chainName === 'op mainnet' && }
- {chainName === 'base' && }
- >
-)
-
-export const SkeletonLoadingItem = () => (
-
-
-
-
-
-
-)
-
-const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
- const { data } = useSuspenseQuery({
- queryKey: ['allUniswapPools', chain.id],
- queryFn: async () => {
- const { positions } = await request(
- appSchemas.uniswap[chain.id],
- allUniswapPoolsQueryDocument,
- )
- return positions
- },
- })
-
- const baseUrl = `https://app.uniswap.org/explore/pools/${chainNameMapping[chain.id]}/`
-
- return (
-
- Uniswap Pool {getNetworkIcon(chain.name.toLowerCase())}
- {data.map((position) => (
-
- {position.pool.symbol}
-
-
-
- ))}
-
- )
-})
-
-const Aave = withSuspenseAndRetry(() => {
- const { data } = useSuspenseQuery({
- queryKey: ['allAaveReserves', base.id],
- queryFn: async () => {
- const { reserves } = await request(appSchemas.aave[base.id], allAaveReservesQueryDocument)
- return reserves
- },
- })
- const baseUrl = 'https://app.aave.com/reserve-overview/?marketName=proto_base_v3&underlyingAsset='
-
- return (
-
-
- AAVE Reserves
- {getNetworkIcon(base.name.toLowerCase())}
-
- {data.map(({ id, name, underlyingAsset }) => (
-
- {name}
-
-
-
- ))}
-
- )
-})
-
-const uniswapNetworks = [optimism, polygon, arbitrum]
-
-const List = ({ ...restProps }) => {
- const [currentChain, setCurrentChain] = useState(uniswapNetworks[0])
- const dropdownItems = [...uniswapNetworks, base]
-
- return (
-
-
- {dropdownItems.find((item) => item.name === currentChain?.name)?.name}
-
- }
- defaultActiveItem={0}
- items={dropdownItems.map((item, index) => (
- - setCurrentChain(item)}>
- {item.name}
-
- ))}
- />
- {uniswapNetworks.map(
- (chain) =>
- currentChain?.id === chain.id && (
- } />
- ),
- )}
- {currentChain?.id === base.id && } />}
-
- )
-}
-
-export default List
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx
index 6a95342d..2d83f798 100644
--- a/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx
@@ -1,30 +1,287 @@
-import { lazy } from 'react'
-
-import { Text } from '@bootnodedev/db-ui-toolkit'
-
-import { PrimaryButton } from '@/src/components/sharedComponents/ui/Buttons'
-import { isSubgraphConfigValid } from '@/src/constants/common'
-
-const List = lazy(() => import('./List'))
-
-const SubgraphDemo = () => {
- return isSubgraphConfigValid ? (
-
- ) : (
- <>
-
- Remember to configure the env vars
-
-
- Learn How
-
- >
+import { useState } from 'react'
+import styled, { css } from 'styled-components'
+
+import { generateSchemasMapping } from '@bootnodedev/db-subgraph'
+import {
+ ExternalLink,
+ CopyButton,
+ Toast,
+ SkeletonLoading,
+ breakpointMediaQuery,
+ Item,
+} from '@bootnodedev/db-ui-toolkit'
+import { useSuspenseQuery } from '@tanstack/react-query'
+import request from 'graphql-request'
+import { toast } from 'react-hot-toast'
+import { arbitrum, base, type Chain, optimism, polygon } from 'viem/chains'
+
+import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
+import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
+import ArbitrumDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Arbitrum'
+import BaseDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Base'
+import OptimismDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Optimism'
+import PolygonDefault from '@/src/components/pageComponents/home/Examples/demos/assets/Polygon'
+import { env } from '@/src/env'
+import { allAaveReservesQueryDocument } from '@/src/subgraphs/queries/aave/reserves'
+import { allUniswapPoolsQueryDocument } from '@/src/subgraphs/queries/uniswap/pools'
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+const chainNameMapping: { [key: number]: string } = {
+ [arbitrum.id]: 'arbitrum',
+ [optimism.id]: 'optimism',
+ [polygon.id]: 'polygon',
+}
+
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-subgraph-title-color: #2e3048;
+ --theme-subgraph-name-color: #2e3048;
+ --theme-subgraph-bullet-color: #f7f7f7;
+ --theme-subgraph-bullet-background-color: #2e3048;
+ }
+
+ [data-theme='dark'] & {
+ --theme-subgraph-title-color: #fff;
+ --theme-subgraph-name-color: #fff;
+ --theme-subgraph-bullet-color: #2e3048;
+ --theme-subgraph-bullet-background-color: #fff;
+ }
+
+ display: flex;
+ flex-direction: column;
+ padding-top: var(--base-common-padding);
+ row-gap: calc(var(--base-gap-xl) * 2);
+ width: 100%;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ padding-top: calc(var(--base-common-padding) * 3);
+ row-gap: calc(var(--base-gap-xl) * 3);
+ `,
+ )}
+`
+
+const Group = styled.div`
+ counter-reset: item-number;
+ display: flex;
+ flex-direction: column;
+ row-gap: var(--base-gap-xl);
+ padding: 0 var(--base-common-padding);
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ padding: 0;
+ `,
+ )}
+`
+
+const Title = styled.h3`
+ align-items: center;
+ color: var(--theme-subgraph-title-color);
+ column-gap: var(--base-gap);
+ display: flex;
+ font-size: 1.6rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+ padding-bottom: var(--base-common-padding);
+`
+
+const Arbitrum = styled(ArbitrumDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Polygon = styled(PolygonDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Optimism = styled(OptimismDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Base = styled(BaseDefault)`
+ height: 20px;
+ width: 20px;
+`
+
+const Row = styled.div`
+ align-items: center;
+ color: var(--theme-subgraph-name-color);
+ column-gap: var(--base-gap);
+ display: flex;
+
+ &::before {
+ --base-size: 18px;
+
+ align-items: center;
+ background-color: var(--theme-subgraph-bullet-background-color);
+ border-radius: 50%;
+ color: var(--theme-subgraph-bullet-color);
+ content: counter(item-number, decimal-leading-zero);
+ counter-increment: item-number;
+ display: flex;
+ flex-shrink: 0;
+ font-size: 1rem;
+ font-weight: 700;
+ height: var(--base-size);
+ justify-content: center;
+ letter-spacing: -1px;
+ line-height: 1;
+ padding-right: 2px;
+ width: var(--base-size);
+ }
+`
+
+const Name = styled.div`
+ font-size: 1.6rem;
+ font-weight: 400;
+ line-height: 1.2;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: block;
+`
+
+const Copy = ({ value }: { value: string }) => {
+ const handleCopy = () => {
+ const timeDelay = 2500
+ toast.custom(Copied to the clipboard! , {
+ duration: timeDelay,
+ position: 'top-center',
+ id: 'copy-to-clipboard',
+ })
+ }
+
+ return
+}
+
+// eslint-disable-next-line react-refresh/only-export-components
+export const getNetworkIcon = (chainName: string) => (
+ <>
+ {chainName === 'arbitrum one' && }
+ {chainName === 'polygon' && }
+ {chainName === 'op mainnet' && }
+ {chainName === 'base' && }
+ >
+)
+
+export const SkeletonLoadingItem = () => (
+
+
+
+
+
+
+)
+
+const appSchemas = generateSchemasMapping({
+ apiKey: env.PUBLIC_SUBGRAPHS_API_KEY!,
+ chainsResourceIds: env.PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS!,
+ environment: env.PUBLIC_SUBGRAPHS_ENVIRONMENT,
+ productionUrl: env.PUBLIC_SUBGRAPHS_PRODUCTION_URL,
+})
+
+const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
+ const { data } = useSuspenseQuery({
+ queryKey: ['allUniswapPools', chain.id],
+ queryFn: async () => {
+ const { positions } = await request(
+ appSchemas.uniswap[chain.id],
+ allUniswapPoolsQueryDocument,
+ )
+ return positions
+ },
+ })
+
+ const baseUrl = `https://app.uniswap.org/explore/pools/${chainNameMapping[chain.id]}/`
+
+ return (
+
+ Uniswap Pool {getNetworkIcon(chain.name.toLowerCase())}
+ {data.map((position) => (
+
+ {position.pool.symbol}
+
+
+
+ ))}
+
+ )
+})
+
+const Aave = withSuspenseAndRetry(() => {
+ const { data } = useSuspenseQuery({
+ queryKey: ['allAaveReserves', base.id],
+ queryFn: async () => {
+ const { reserves } = await request(appSchemas.aave[base.id], allAaveReservesQueryDocument)
+ return reserves
+ },
+ })
+ const baseUrl = 'https://app.aave.com/reserve-overview/?marketName=proto_base_v3&underlyingAsset='
+
+ return (
+
+
+ AAVE Reserves
+ {getNetworkIcon(base.name.toLowerCase())}
+
+ {data.map(({ id, name, underlyingAsset }) => (
+
+ {name}
+
+
+
+ ))}
+
+ )
+})
+
+const uniswapNetworks = [optimism, polygon, arbitrum]
+
+const List = ({ ...restProps }) => {
+ const [currentChain, setCurrentChain] = useState(uniswapNetworks[0])
+ const dropdownItems = [...uniswapNetworks, base]
+
+ return (
+
+
+ {dropdownItems.find((item) => item.name === currentChain?.name)?.name}
+
+ }
+ defaultActiveItem={0}
+ items={dropdownItems.map((item, index) => (
+ - setCurrentChain(item)}>
+ {item.name}
+
+ ))}
+ />
+ {uniswapNetworks.map(
+ (chain) =>
+ currentChain?.id === chain.id && (
+ } />
+ ),
+ )}
+ {currentChain?.id === base.id && } />}
+
)
}
-export default SubgraphDemo
+export default List
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx
deleted file mode 100644
index f51916cb..00000000
--- a/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/List.tsx
+++ /dev/null
@@ -1,208 +0,0 @@
-import { type FC, useState } from 'react'
-import styled, { css } from 'styled-components'
-
-import { Item, SkeletonLoading, breakpointMediaQuery } from '@bootnodedev/db-ui-toolkit'
-import { arbitrum, base, type Chain, optimism, polygon } from 'viem/chains'
-
-import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
-import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
-import { getNetworkIcon } from '@/src/components/pageComponents/home/Examples/demos/SubgraphDemo/List'
-import { useSubgraphIndexingStatus } from '@/src/hooks/useSubgraphIndexingStatus'
-import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
-
-const Wrapper = styled.div`
- [data-theme='light'] & {
- --theme-subgraph-status-background: #fff;
- --theme-subgraph-status-data-row-color: #2e3048;
- --theme-subgraph-status-data-color: #5f6178;
- }
-
- [data-theme='dark'] & {
- --theme-subgraph-status-background: #373954;
- --theme-subgraph-status-data-row-color: #fff;
- --theme-subgraph-status-data-color: #e2e0e7;
- }
-
- display: flex;
- flex-direction: column;
- padding: var(--base-common-padding) 0 0;
- row-gap: var(--base-gap-xl);
- width: 100%;
-
- ${breakpointMediaQuery(
- 'tabletPortraitStart',
- css`
- padding-top: calc(var(--base-common-padding) * 3);
- `,
- )}
-`
-
-const Row = styled.div`
- background-color: var(--theme-subgraph-status-background);
- border-radius: var(--base-border-radius);
- display: flex;
- flex-direction: column;
- padding: var(--base-common-padding-xl);
- row-gap: var(--base-gap-xl);
- width: 100%;
-`
-
-const Title = styled.h3`
- align-items: center;
- color: var(--theme-subgraph-title-color);
- column-gap: var(--base-gap);
- display: flex;
- font-size: 1.6rem;
- font-weight: 700;
- line-height: 1.2;
- margin: 0;
-`
-
-const Data = styled.div<{ $status: 'error' | 'ok' }>`
- --base-status-size: 10px;
-
- align-items: center;
- color: var(--theme-subgraph-status-data-row-color);
- column-gap: var(--base-gap);
- display: grid;
- font-size: 1.6rem;
- font-weight: 400;
- grid-template-columns: var(--base-status-size) 1fr;
- line-height: 1.2;
- max-width: 100%;
- white-space: nowrap;
- width: fit-content;
-
- &::before {
- align-items: center;
- background-color: var(
- ${({ $status }) => ($status === 'error' ? '--theme-color-danger' : '--theme-color-ok')}
- );
- border-radius: 50%;
- content: '';
- display: flex;
- height: var(--base-status-size);
- width: var(--base-status-size);
- transition: background-color var(--base-transition-duration);
- }
-
- ${breakpointMediaQuery(
- 'tabletPortraitStart',
- css`
- grid-template-columns: var(--base-status-size) auto 10px auto;
- `,
- )}
-`
-
-const SG = styled.span``
-
-const Separator = styled.span`
- display: none;
-
- ${breakpointMediaQuery(
- 'tabletPortraitStart',
- css`
- display: block;
- `,
- )}
-`
-
-const BC = styled.span`
- padding-left: calc(var(--base-status-size) + var(--base-gap));
-
- ${breakpointMediaQuery(
- 'tabletPortraitStart',
- css`
- padding-left: 0;
- `,
- )}
-`
-
-export const SkeletonLoadingItem = () => (
-
-
-
-
-)
-
-const SubgraphStatus: FC<{
- indexingStatus: ReturnType
-}> = ({ indexingStatus }) => {
- const { chain, isSynced, networkBlockNumber, resource, subgraphBlockNumber } = indexingStatus
-
- return (
-
-
- {`${resource}@${chain.id}`}
- {getNetworkIcon(chain.name.toLowerCase())}
-
-
-
- SG: {subgraphBlockNumber.toString()}
-
- -
-
- BC:
- {networkBlockNumber?.toString() ?? '-'}
-
-
-
- )
-}
-
-const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
- const indexingStatus = useSubgraphIndexingStatus({ chain, resource: 'uniswap' })
-
- return
-})
-
-const Aave = withSuspenseAndRetry(() => {
- const indexingStatus = useSubgraphIndexingStatus({ chain: base, resource: 'aave' })
-
- return
-})
-
-const uniswapNetworks = [optimism, polygon, arbitrum]
-
-const List = ({ ...restProps }) => {
- const [currentChain, setCurrentChain] = useState(uniswapNetworks[0])
- const dropdownItems = [...uniswapNetworks, base]
-
- return (
-
-
- {dropdownItems.find((item) => item.name === currentChain?.name)?.name}
-
- }
- defaultActiveItem={0}
- items={dropdownItems.map((item, index) => (
- - setCurrentChain(item)}>
- {item.name}
-
- ))}
- />
- {uniswapNetworks.map(
- (chain) =>
- currentChain?.id === chain.id && (
- } />
- ),
- )}
- {currentChain?.id === base.id && } />}
-
- )
-}
-
-export default List
diff --git a/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx
index a705932e..b55820f0 100644
--- a/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo/index.tsx
@@ -1,31 +1,217 @@
-import { lazy } from 'react'
+import { type FC, useState } from 'react'
+import styled, { css } from 'styled-components'
-import { Text } from '@bootnodedev/db-ui-toolkit'
+import { useSubgraphIndexingStatus, type SchemaMappingConfig } from '@bootnodedev/db-subgraph'
+import { Item, SkeletonLoading, breakpointMediaQuery } from '@bootnodedev/db-ui-toolkit'
+import { arbitrum, base, type Chain, optimism, polygon } from 'viem/chains'
-import { PrimaryButton } from '@/src/components/sharedComponents/ui/Buttons'
-import { isSubgraphConfigValid } from '@/src/constants/common'
+import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
+import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
+import { getNetworkIcon } from '@/src/components/pageComponents/home/Examples/demos/SubgraphDemo'
+import { env } from '@/src/env'
import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
-const List = lazy(() => import('./List'))
-
-const SubgraphStatusDemo = withSuspenseAndRetry(() => {
- return isSubgraphConfigValid ? (
-
- ) : (
- <>
-
- Remember to configure the env vars
-
-
- Learn How
-
- >
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-subgraph-status-background: #fff;
+ --theme-subgraph-status-data-row-color: #2e3048;
+ --theme-subgraph-status-data-color: #5f6178;
+ }
+
+ [data-theme='dark'] & {
+ --theme-subgraph-status-background: #373954;
+ --theme-subgraph-status-data-row-color: #fff;
+ --theme-subgraph-status-data-color: #e2e0e7;
+ }
+
+ display: flex;
+ flex-direction: column;
+ padding: var(--base-common-padding) 0 0;
+ row-gap: var(--base-gap-xl);
+ width: 100%;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ padding-top: calc(var(--base-common-padding) * 3);
+ `,
+ )}
+`
+
+const Row = styled.div`
+ background-color: var(--theme-subgraph-status-background);
+ border-radius: var(--base-border-radius);
+ display: flex;
+ flex-direction: column;
+ padding: var(--base-common-padding-xl);
+ row-gap: var(--base-gap-xl);
+ width: 100%;
+`
+
+const Title = styled.h3`
+ align-items: center;
+ color: var(--theme-subgraph-title-color);
+ column-gap: var(--base-gap);
+ display: flex;
+ font-size: 1.6rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+`
+
+const Data = styled.div<{ $status: 'error' | 'ok' }>`
+ --base-status-size: 10px;
+
+ align-items: center;
+ color: var(--theme-subgraph-status-data-row-color);
+ column-gap: var(--base-gap);
+ display: grid;
+ font-size: 1.6rem;
+ font-weight: 400;
+ grid-template-columns: var(--base-status-size) 1fr;
+ line-height: 1.2;
+ max-width: 100%;
+ white-space: nowrap;
+ width: fit-content;
+
+ &::before {
+ align-items: center;
+ background-color: var(
+ ${({ $status }) => ($status === 'error' ? '--theme-color-danger' : '--theme-color-ok')}
+ );
+ border-radius: 50%;
+ content: '';
+ display: flex;
+ height: var(--base-status-size);
+ width: var(--base-status-size);
+ transition: background-color var(--base-transition-duration);
+ }
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ grid-template-columns: var(--base-status-size) auto 10px auto;
+ `,
+ )}
+`
+
+const SG = styled.span``
+
+const Separator = styled.span`
+ display: none;
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ display: block;
+ `,
+ )}
+`
+
+const BC = styled.span`
+ padding-left: calc(var(--base-status-size) + var(--base-gap));
+
+ ${breakpointMediaQuery(
+ 'tabletPortraitStart',
+ css`
+ padding-left: 0;
+ `,
+ )}
+`
+
+export const SkeletonLoadingItem = () => (
+
+
+
+
+)
+
+const SubgraphStatus: FC<{
+ indexingStatus: ReturnType
+}> = ({ indexingStatus }) => {
+ const { chain, isSynced, networkBlockNumber, resource, subgraphBlockNumber } = indexingStatus
+
+ return (
+
+
+ {`${resource}@${chain.id}`}
+ {getNetworkIcon(chain.name.toLowerCase())}
+
+
+
+ SG: {subgraphBlockNumber.toString()}
+
+ -
+
+ BC:
+ {networkBlockNumber?.toString() ?? '-'}
+
+
+
)
+}
+
+// define the schema configuration for the current implementation and needs
+const schemaConfig: SchemaMappingConfig = {
+ apiKey: env.PUBLIC_SUBGRAPHS_API_KEY,
+ chainsResourceIds: env.PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS,
+ environment: env.PUBLIC_SUBGRAPHS_ENVIRONMENT,
+ productionUrl: env.PUBLIC_SUBGRAPHS_PRODUCTION_URL,
+}
+
+const Uniswap = withSuspenseAndRetry(({ chain }: { chain: Chain }) => {
+ const indexingStatus = useSubgraphIndexingStatus({ chain, resource: 'uniswap', schemaConfig })
+
+ return
})
-export default SubgraphStatusDemo
+const Aave = withSuspenseAndRetry(() => {
+ const indexingStatus = useSubgraphIndexingStatus({ chain: base, resource: 'aave', schemaConfig })
+
+ return
+})
+
+const uniswapNetworks = [optimism, polygon, arbitrum]
+
+const List = ({ ...restProps }) => {
+ const [currentChain, setCurrentChain] = useState(uniswapNetworks[0])
+ const dropdownItems = [...uniswapNetworks, base]
+
+ return (
+
+
+ {dropdownItems.find((item) => item.name === currentChain?.name)?.name}
+
+ }
+ defaultActiveItem={0}
+ items={dropdownItems.map((item, index) => (
+ - setCurrentChain(item)}>
+ {item.name}
+
+ ))}
+ />
+ {uniswapNetworks.map(
+ (chain) =>
+ currentChain?.id === chain.id && (
+ } />
+ ),
+ )}
+ {currentChain?.id === base.id && } />}
+
+ )
+}
+
+export default List
diff --git a/src/env.ts b/src/env.ts
index 86627a0a..28842c66 100644
--- a/src/env.ts
+++ b/src/env.ts
@@ -43,6 +43,13 @@ export const env = createEnv({
PUBLIC_RPC_SEPOLIA: z.string().optional(),
PUBLIC_WALLETCONNECT_PROJECT_ID: z.string().optional().default(''),
PUBLIC_INCLUDE_TESTNETS: zBoolean,
+ PUBLIC_SUBGRAPHS_API_KEY: z.string(),
+ PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS: z.string(),
+ PUBLIC_SUBGRAPHS_ENVIRONMENT: z
+ .union([z.literal('development'), z.literal('production')])
+ .default('production'),
+ PUBLIC_SUBGRAPHS_DEVELOPMENT_URL: z.string().optional(),
+ PUBLIC_SUBGRAPHS_PRODUCTION_URL: z.string().optional(),
},
runtimeEnv: import.meta.env,
emptyStringAsUndefined: true,
diff --git a/src/subgraphs/codegen.ts b/src/subgraphs/codegen.ts
new file mode 100644
index 00000000..d0aefb3f
--- /dev/null
+++ b/src/subgraphs/codegen.ts
@@ -0,0 +1,15 @@
+import { generateCodegenConfig } from '@bootnodedev/db-subgraph'
+import { loadEnv } from 'vite'
+
+const env = loadEnv('subgraphs', process.cwd(), '')
+
+export default generateCodegenConfig({
+ subgraphs: [
+ {
+ apiKey: env.PUBLIC_SUBGRAPHS_API_KEY,
+ chainsResourceIds: env.PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS,
+ environment: 'production',
+ productionUrl: env.PUBLIC_SUBGRAPHS_PRODUCTION_URL,
+ },
+ ],
+})
From b67b9aa203cc27c2e04b47acb88a5430df292554 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Wed, 11 Sep 2024 09:03:46 -0300
Subject: [PATCH 043/228] fix: component background
---
src/styles/themes/lightThemeCSSVars.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/styles/themes/lightThemeCSSVars.tsx b/src/styles/themes/lightThemeCSSVars.tsx
index c1066fff..e5c0ac5a 100644
--- a/src/styles/themes/lightThemeCSSVars.tsx
+++ b/src/styles/themes/lightThemeCSSVars.tsx
@@ -186,7 +186,7 @@ const lightThemeCSSVars = css`
/* Token Input */
--theme-token-input-title-color: #2e3048;
- --theme-token-input-background: #f0f0f0;
+ --theme-token-input-background: #fff;
--theme-token-input-textfield-background-color: #fff;
--theme-token-input-textfield-background-color-active: rgb(0 0 0 / 5%);
From def1ba7a6bf8e6a1a0db0dd39172ac1f37526a15 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Wed, 11 Sep 2024 09:04:09 -0300
Subject: [PATCH 044/228] fix: docs links
---
src/components/pageComponents/home/Welcome/DocsButton.tsx | 7 +------
src/constants/menuItems.ts | 2 +-
2 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/src/components/pageComponents/home/Welcome/DocsButton.tsx b/src/components/pageComponents/home/Welcome/DocsButton.tsx
index a3ff83a5..94291af8 100644
--- a/src/components/pageComponents/home/Welcome/DocsButton.tsx
+++ b/src/components/pageComponents/home/Welcome/DocsButton.tsx
@@ -18,12 +18,7 @@ const Wrapper = styled(SecondaryButton)`
const DocsButton = ({ ...restProps }) => {
return (
-
+
Docs
diff --git a/src/constants/menuItems.ts b/src/constants/menuItems.ts
index b5b5e986..ce2e59fe 100644
--- a/src/constants/menuItems.ts
+++ b/src/constants/menuItems.ts
@@ -10,7 +10,7 @@ type MenuItem = {
export const menuItems: MenuItem[] = [
{
label: 'Documentation',
- href: 'https://bootnodedev.github.io/dAppBooster/',
+ href: 'https://docs.dappbooster.dev/',
},
{
label: 'Examples',
From b17a7de7578ba81b4d3bbdc4d8a76b16b995dd18 Mon Sep 17 00:00:00 2001
From: nicosampler
Date: Thu, 12 Sep 2024 18:12:49 -0300
Subject: [PATCH 045/228] feat: optimism cross domain messenger example
---
.../home/Examples/assets/Optimism.tsx | 39 ++++++
.../demos/OptimismCrossDomainMessenger.tsx | 53 +++++++
.../demos/TransactionButtonDemo/index.tsx | 38 ++---
.../pageComponents/home/Examples/index.tsx | 22 +++
src/constants/contracts/abis/AAVEWeth.ts | 132 ++++++++++++++++++
src/constants/contracts/contracts.ts | 10 +-
6 files changed, 276 insertions(+), 18 deletions(-)
create mode 100644 src/components/pageComponents/home/Examples/assets/Optimism.tsx
create mode 100644 src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
create mode 100644 src/constants/contracts/abis/AAVEWeth.ts
diff --git a/src/components/pageComponents/home/Examples/assets/Optimism.tsx b/src/components/pageComponents/home/Examples/assets/Optimism.tsx
new file mode 100644
index 00000000..6468fb64
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/assets/Optimism.tsx
@@ -0,0 +1,39 @@
+import { type FC, type HTMLAttributes } from 'react'
+import { styled } from 'styled-components'
+
+const Wrapper = styled.svg`
+ display: block;
+ flex-shrink: 0;
+`
+
+const OptimismIcon: FC> = ({ ...restProps }) => (
+
+
+
+
+
+
+
+)
+
+export default OptimismIcon
diff --git a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
new file mode 100644
index 00000000..04f8b162
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
@@ -0,0 +1,53 @@
+import { parseEther } from 'viem'
+import { optimismSepolia, sepolia } from 'viem/chains'
+
+import Wrapper from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper'
+import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
+import { WalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
+import { PrimaryButton } from '@/src/components/sharedComponents/ui/Buttons'
+import { getContract } from '@/src/constants/contracts/contracts'
+import { useL1CrossDomainMessengerProxy } from '@/src/hooks/useL1CrossDomainMessengerProxy'
+import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+const OptimismCrossDomainMessenger = withSuspenseAndRetry(() => {
+ // https://sepolia-optimism.etherscan.io/address/0xb50201558b00496a145fe76f7424749556e326d8
+ const AAVEProxy = '0xb50201558b00496a145fe76f7424749556e326d8'
+ const { address: walletAddress } = useWeb3StatusConnected()
+
+ const contract = getContract('AAVEWeth', optimismSepolia.id)
+ const depositValue = parseEther('0.01')
+
+ const sendCrossChainMessage = useL1CrossDomainMessengerProxy({
+ fromChain: sepolia,
+ contractName: 'AAVEWeth',
+ functionName: 'depositETH',
+ l2ContractAddress: contract.address,
+ args: [AAVEProxy, walletAddress, 0],
+ value: depositValue,
+ })
+
+ return (
+
+
+
+ Deposit 0.01 ETH in{' '}
+
+ Optimism sepolia AAVE market
+ {' '}
+ from sepolia.
+
+
+ Deposit ETH
+
+ Deposit take approximately 1-3 minutes.
+
+
+ )
+})
+
+export default OptimismCrossDomainMessenger
diff --git a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx
index ea4c8305..baf456c0 100644
--- a/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/index.tsx
@@ -2,11 +2,13 @@ import { useState } from 'react'
import styled, { css } from 'styled-components'
import { Item, breakpointMediaQuery } from '@bootnodedev/db-ui-toolkit'
+import { sepolia } from 'viem/chains'
import { OptionsButton } from '@/src/components/pageComponents/home/Examples/demos/OptionsButton'
import { OptionsDropdown } from '@/src/components/pageComponents/home/Examples/demos/OptionsDropdown'
import ERC20ApproveAndTransferButtonDemo from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/ERC20ApproveAndTransferButtonDemo'
import NativeTokenDemo from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/NativeTokenDemo'
+import { WalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
const Wrapper = styled.div`
align-items: center;
@@ -34,23 +36,25 @@ const TransactionButtonDemo = () => {
const [currentTokenInput, setCurrentTokenInput] = useState('erc20')
return (
-
-
- {dropdownItems.find((item) => item.type === currentTokenInput)?.label}
-
- }
- defaultActiveItem={0}
- items={dropdownItems.map((item, index) => (
- - setCurrentTokenInput(item.type as Options)}>
- {item.label}
-
- ))}
- />
- {currentTokenInput === 'erc20' && }
- {currentTokenInput === 'native' && }
-
+
+
+
+ {dropdownItems.find((item) => item.type === currentTokenInput)?.label}
+
+ }
+ defaultActiveItem={0}
+ items={dropdownItems.map((item, index) => (
+ - setCurrentTokenInput(item.type as Options)}>
+ {item.label}
+
+ ))}
+ />
+ {currentTokenInput === 'erc20' && }
+ {currentTokenInput === 'native' && }
+
+
)
}
diff --git a/src/components/pageComponents/home/Examples/index.tsx b/src/components/pageComponents/home/Examples/index.tsx
index d84a17c3..37fd33f6 100644
--- a/src/components/pageComponents/home/Examples/index.tsx
+++ b/src/components/pageComponents/home/Examples/index.tsx
@@ -11,6 +11,7 @@ import { Props as ItemProps } from '@/src/components/pageComponents/home/Example
import List from '@/src/components/pageComponents/home/Examples/List'
import ImgEns from '@/src/components/pageComponents/home/Examples/assets/Ens'
import ImgInputAddress from '@/src/components/pageComponents/home/Examples/assets/InputAddress'
+import OptimismIcon from '@/src/components/pageComponents/home/Examples/assets/Optimism'
import ImgSign from '@/src/components/pageComponents/home/Examples/assets/Sign'
import ImgSubgraph from '@/src/components/pageComponents/home/Examples/assets/Subgraph'
import ImgSubgraphStatus from '@/src/components/pageComponents/home/Examples/assets/SubgraphStatus'
@@ -21,6 +22,7 @@ import ImgTransaction from '@/src/components/pageComponents/home/Examples/assets
import ImgWallet from '@/src/components/pageComponents/home/Examples/assets/Wallet'
import EnsNameDemo from '@/src/components/pageComponents/home/Examples/demos/EnsNameDemo'
import HashHandlingDemo from '@/src/components/pageComponents/home/Examples/demos/HashHandlingDemo'
+import OptimismCrossDomainMessenger from '@/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger'
import SignMessageDemo from '@/src/components/pageComponents/home/Examples/demos/SignMessageDemo'
import SubgraphDemo from '@/src/components/pageComponents/home/Examples/demos/SubgraphDemo'
import SubgraphStatusDemo from '@/src/components/pageComponents/home/Examples/demos/SubgraphStatusDemo'
@@ -205,6 +207,26 @@ const Examples: FC> = ({ ...restProps }) => {
text: 'Sign a message with your wallet and get the signature on a dialog.',
title: 'Sign button',
},
+ {
+ sourceCodeHref:
+ 'https://github.com/BootNodeDev/dAppBooster/blob/main/src/hooks/useL1CrossDomainMessengerProxy.ts',
+ demo: ,
+ href: 'https://bootnodedev.github.io/dAppBooster/modules/hooks_useL1CrossDomainMessengerProxy.html',
+ icon: ,
+ text: (
+ <>
+ Learn more in{' '}
+
+ Optimism cross domain messenger.
+
+ >
+ ),
+ title: 'Optimism cross domain messenger',
+ },
]
return (
diff --git a/src/constants/contracts/abis/AAVEWeth.ts b/src/constants/contracts/abis/AAVEWeth.ts
new file mode 100644
index 00000000..fd2bd327
--- /dev/null
+++ b/src/constants/contracts/abis/AAVEWeth.ts
@@ -0,0 +1,132 @@
+export const AAVEWethABI = [
+ {
+ inputs: [
+ { internalType: 'address', name: 'weth', type: 'address' },
+ { internalType: 'address', name: 'owner', type: 'address' },
+ { internalType: 'contract IPool', name: 'pool', type: 'address' },
+ ],
+ stateMutability: 'nonpayable',
+ type: 'constructor',
+ },
+ {
+ anonymous: false,
+ inputs: [
+ { indexed: true, internalType: 'address', name: 'previousOwner', type: 'address' },
+ { indexed: true, internalType: 'address', name: 'newOwner', type: 'address' },
+ ],
+ name: 'OwnershipTransferred',
+ type: 'event',
+ },
+ { stateMutability: 'payable', type: 'fallback' },
+ {
+ inputs: [
+ { internalType: 'address', name: '', type: 'address' },
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
+ { internalType: 'uint256', name: 'interestRateMode', type: 'uint256' },
+ { internalType: 'uint16', name: 'referralCode', type: 'uint16' },
+ ],
+ name: 'borrowETH',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '', type: 'address' },
+ { internalType: 'address', name: 'onBehalfOf', type: 'address' },
+ { internalType: 'uint16', name: 'referralCode', type: 'uint16' },
+ ],
+ name: 'depositETH',
+ outputs: [],
+ stateMutability: 'payable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: 'to', type: 'address' },
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
+ ],
+ name: 'emergencyEtherTransfer',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: 'token', type: 'address' },
+ { internalType: 'address', name: 'to', type: 'address' },
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
+ ],
+ name: 'emergencyTokenTransfer',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [],
+ name: 'getWETHAddress',
+ outputs: [{ internalType: 'address', name: '', type: 'address' }],
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ inputs: [],
+ name: 'owner',
+ outputs: [{ internalType: 'address', name: '', type: 'address' }],
+ stateMutability: 'view',
+ type: 'function',
+ },
+ {
+ inputs: [],
+ name: 'renounceOwnership',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '', type: 'address' },
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
+ { internalType: 'uint256', name: 'rateMode', type: 'uint256' },
+ { internalType: 'address', name: 'onBehalfOf', type: 'address' },
+ ],
+ name: 'repayETH',
+ outputs: [],
+ stateMutability: 'payable',
+ type: 'function',
+ },
+ {
+ inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],
+ name: 'transferOwnership',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '', type: 'address' },
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
+ { internalType: 'address', name: 'to', type: 'address' },
+ ],
+ name: 'withdrawETH',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ {
+ inputs: [
+ { internalType: 'address', name: '', type: 'address' },
+ { internalType: 'uint256', name: 'amount', type: 'uint256' },
+ { internalType: 'address', name: 'to', type: 'address' },
+ { internalType: 'uint256', name: 'deadline', type: 'uint256' },
+ { internalType: 'uint8', name: 'permitV', type: 'uint8' },
+ { internalType: 'bytes32', name: 'permitR', type: 'bytes32' },
+ { internalType: 'bytes32', name: 'permitS', type: 'bytes32' },
+ ],
+ name: 'withdrawETHWithPermit',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ { stateMutability: 'payable', type: 'receive' },
+] as const
diff --git a/src/constants/contracts/contracts.ts b/src/constants/contracts/contracts.ts
index 68acd9dc..dff9f263 100644
--- a/src/constants/contracts/contracts.ts
+++ b/src/constants/contracts/contracts.ts
@@ -6,8 +6,9 @@ import {
erc20Abi,
isAddress,
} from 'viem'
-import { mainnet, polygon, sepolia } from 'viem/chains'
+import { mainnet, optimismSepolia, polygon, sepolia } from 'viem/chains'
+import { AAVEWethABI } from '@/src/constants/contracts/abis/AAVEWeth'
import { AaveFaucetABI } from '@/src/constants/contracts/abis/AaveFaucet'
import { ENSRegistryABI } from '@/src/constants/contracts/abis/ENSRegistry'
import { L1CrossDomainMessengerProxyABI } from '@/src/constants/contracts/abis/L1CrossDomainMessengerProxy'
@@ -63,6 +64,13 @@ const contracts = [
},
name: 'L1CrossDomainMessengerProxy',
},
+ {
+ abi: AAVEWethABI,
+ address: {
+ [optimismSepolia.id]: '0x589750BA8aF186cE5B55391B0b7148cAD43a1619',
+ },
+ name: 'AAVEWeth',
+ },
] as const satisfies ContractConfig[]
/**
From b4e39c15d2003470f23e57954a4730dc0e81e8fd Mon Sep 17 00:00:00 2001
From: nicosampler
Date: Thu, 12 Sep 2024 18:35:53 -0300
Subject: [PATCH 046/228] fix: replace WalletStatusVerifier with
withWalletStatusVerifier
---
.../demos/OptimismCrossDomainMessenger.tsx | 80 ++++++++++---------
1 file changed, 43 insertions(+), 37 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
index 04f8b162..77e1eb9c 100644
--- a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
+++ b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
@@ -2,52 +2,58 @@ import { parseEther } from 'viem'
import { optimismSepolia, sepolia } from 'viem/chains'
import Wrapper from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper'
+import ConnectButton from '@/src/components/sharedComponents/ConnectButton'
import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
-import { WalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
+import {
+ WalletStatusVerifier,
+ withWalletStatusVerifier,
+} from '@/src/components/sharedComponents/WalletStatusVerifier'
import { PrimaryButton } from '@/src/components/sharedComponents/ui/Buttons'
import { getContract } from '@/src/constants/contracts/contracts'
import { useL1CrossDomainMessengerProxy } from '@/src/hooks/useL1CrossDomainMessengerProxy'
import { useWeb3StatusConnected } from '@/src/hooks/useWeb3Status'
import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
-const OptimismCrossDomainMessenger = withSuspenseAndRetry(() => {
- // https://sepolia-optimism.etherscan.io/address/0xb50201558b00496a145fe76f7424749556e326d8
- const AAVEProxy = '0xb50201558b00496a145fe76f7424749556e326d8'
- const { address: walletAddress } = useWeb3StatusConnected()
+const OptimismCrossDomainMessenger = withWalletStatusVerifier(
+ withSuspenseAndRetry(() => {
+ // https://sepolia-optimism.etherscan.io/address/0xb50201558b00496a145fe76f7424749556e326d8
+ const AAVEProxy = '0xb50201558b00496a145fe76f7424749556e326d8'
+ const { address: walletAddress } = useWeb3StatusConnected()
- const contract = getContract('AAVEWeth', optimismSepolia.id)
- const depositValue = parseEther('0.01')
+ const contract = getContract('AAVEWeth', optimismSepolia.id)
+ const depositValue = parseEther('0.01')
- const sendCrossChainMessage = useL1CrossDomainMessengerProxy({
- fromChain: sepolia,
- contractName: 'AAVEWeth',
- functionName: 'depositETH',
- l2ContractAddress: contract.address,
- args: [AAVEProxy, walletAddress, 0],
- value: depositValue,
- })
+ const sendCrossChainMessage = useL1CrossDomainMessengerProxy({
+ fromChain: sepolia,
+ contractName: 'AAVEWeth',
+ functionName: 'depositETH',
+ l2ContractAddress: contract.address,
+ args: [AAVEProxy, walletAddress, 0],
+ value: depositValue,
+ })
- return (
-
-
-
- Deposit 0.01 ETH in{' '}
-
- Optimism sepolia AAVE market
- {' '}
- from sepolia.
-
-
- Deposit ETH
-
- Deposit take approximately 1-3 minutes.
-
-
- )
-})
+ return (
+ }>
+
+
+ Deposit 0.01 ETH in{' '}
+
+ Optimism sepolia AAVE market
+ {' '}
+ from sepolia.
+
+
+ Deposit ETH
+
+ Deposit take approximately 1-3 minutes.
+
+
+ )
+ }),
+)
export default OptimismCrossDomainMessenger
From 8b2e9a02fe3aba24319ebe9973e8e93c2d29d01f Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 13 Sep 2024 09:16:51 -0300
Subject: [PATCH 047/228] fix: op icon
---
.../home/Examples/assets/Optimism.tsx | 40 ++++++++-----------
1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/assets/Optimism.tsx b/src/components/pageComponents/home/Examples/assets/Optimism.tsx
index 6468fb64..65c05657 100644
--- a/src/components/pageComponents/home/Examples/assets/Optimism.tsx
+++ b/src/components/pageComponents/home/Examples/assets/Optimism.tsx
@@ -2,38 +2,32 @@ import { type FC, type HTMLAttributes } from 'react'
import { styled } from 'styled-components'
const Wrapper = styled.svg`
+ border-radius: 50%;
display: block;
flex-shrink: 0;
+ height: 42px;
+ width: 42px;
`
-const OptimismIcon: FC> = ({ ...restProps }) => (
+const Icon: FC> = ({ ...restProps }) => (
-
-
-
-
-
+
+
+
)
-export default OptimismIcon
+export default Icon
From 05862cc6b22d9195b3f11c5fd2cffed56dc2fa33 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 13 Sep 2024 09:56:40 -0300
Subject: [PATCH 048/228] fix: spelling
---
.../home/Examples/demos/OptimismCrossDomainMessenger.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
index 77e1eb9c..cc3e533f 100644
--- a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
+++ b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
@@ -42,14 +42,14 @@ const OptimismCrossDomainMessenger = withWalletStatusVerifier(
rel="noreferrer"
target="_blank"
>
- Optimism sepolia AAVE market
+ Optimism Sepolia AAVE market
{' '}
- from sepolia.
+ from Sepolia.
Deposit ETH
- Deposit take approximately 1-3 minutes.
+ Deposits take approximately 1-3 minutes.
)
From 315150f5989fea36dd40e8637eb669e2dbe11302 Mon Sep 17 00:00:00 2001
From: Gabito Esmiapodo
Date: Fri, 13 Sep 2024 10:16:44 -0300
Subject: [PATCH 049/228] fix: op wrapper styles
---
.../OptimismCrossDomainMessenger/Wrapper.tsx | 71 +++++++++++++++++++
.../index.tsx} | 6 +-
2 files changed, 74 insertions(+), 3 deletions(-)
create mode 100644 src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/Wrapper.tsx
rename src/components/pageComponents/home/Examples/demos/{OptimismCrossDomainMessenger.tsx => OptimismCrossDomainMessenger/index.tsx} (93%)
diff --git a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/Wrapper.tsx b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/Wrapper.tsx
new file mode 100644
index 00000000..2c7c34e3
--- /dev/null
+++ b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/Wrapper.tsx
@@ -0,0 +1,71 @@
+import { type FC, ComponentProps, type ReactNode } from 'react'
+import styled, { css } from 'styled-components'
+
+import { breakpointMediaQuery } from '@bootnodedev/db-ui-toolkit'
+
+const Wrapper = styled.div`
+ [data-theme='light'] & {
+ --theme-op-background: #fff;
+ --theme-op-title-color: #2e3048;
+ --theme-op-text-color: #2e3048;
+ }
+
+ [data-theme='dark'] & {
+ --theme-op-background: #373954;
+ --theme-op-title-color: #fff;
+ --theme-op-text-color: #e2e0e7;
+ }
+
+ background-color: var(--theme-op-background);
+ border-radius: var(--base-border-radius);
+ display: flex;
+ flex-direction: column;
+ padding: var(--base-common-padding-xl);
+ row-gap: calc(var(--base-gap) * 3);
+ width: 100%;
+
+ ${breakpointMediaQuery(
+ 'desktopStart',
+ css`
+ margin-top: calc(var(--base-common-padding) * 3);
+ `,
+ )}
+
+ p {
+ font-size: 1.5rem;
+ line-height: 1.2;
+ margin: 0;
+
+ &,
+ & a {
+ color: var(--theme-op-text-color);
+ }
+
+ a:hover {
+ text-decoration: none;
+ }
+ }
+`
+
+const Title = styled.h3`
+ color: var(--theme-op-title-color);
+ font-size: 1.4rem;
+ font-weight: 700;
+ line-height: 1.2;
+ margin: 0;
+`
+
+interface Props extends Omit, 'title'> {
+ title: string | ReactNode
+}
+
+const WrapperComponent: FC = ({ children, title, ...restProps }) => {
+ return (
+
+ {title}
+ {children}
+
+ )
+}
+
+export default WrapperComponent
diff --git a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
similarity index 93%
rename from src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
rename to src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
index cc3e533f..f06eda0a 100644
--- a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger.tsx
+++ b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
@@ -1,7 +1,7 @@
import { parseEther } from 'viem'
import { optimismSepolia, sepolia } from 'viem/chains'
-import Wrapper from '@/src/components/pageComponents/home/Examples/demos/TransactionButtonDemo/Wrapper'
+import Wrapper from '@/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/Wrapper'
import ConnectButton from '@/src/components/sharedComponents/ConnectButton'
import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
import {
@@ -34,7 +34,7 @@ const OptimismCrossDomainMessenger = withWalletStatusVerifier(
return (
}>
-
+
Deposit 0.01 ETH in{' '}
Deposit ETH
- Deposits take approximately 1-3 minutes.
+ Deposits take approximately 1-3 minutes.
)
From ad9601b8ac518e8fc8f56eb2713486fcb7cd490a Mon Sep 17 00:00:00 2001
From: nicosampler
Date: Fri, 13 Sep 2024 14:47:15 -0300
Subject: [PATCH 050/228] fix: remove duplicated verifyWallet
---
.../OptimismCrossDomainMessenger/index.tsx | 36 +++++++++----------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
index f06eda0a..0538a9d0 100644
--- a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
@@ -33,25 +33,23 @@ const OptimismCrossDomainMessenger = withWalletStatusVerifier(
})
return (
- }>
-
-
- Deposit 0.01 ETH in{' '}
-
- Optimism Sepolia AAVE market
- {' '}
- from Sepolia.
-
-
- Deposit ETH
-
- Deposits take approximately 1-3 minutes.
-
-
+
+
+ Deposit 0.01 ETH in{' '}
+
+ Optimism Sepolia AAVE market
+ {' '}
+ from Sepolia.
+
+
+ Deposit ETH
+
+ Deposits take approximately 1-3 minutes.
+
)
}),
)
From 7b91dbb735704e693810ecb4e6fecf7d92fbc94b Mon Sep 17 00:00:00 2001
From: nicosampler
Date: Fri, 13 Sep 2024 15:03:16 -0300
Subject: [PATCH 051/228] fix: ci
---
.../Examples/demos/OptimismCrossDomainMessenger/index.tsx | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
index 0538a9d0..d4b92b37 100644
--- a/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
+++ b/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/index.tsx
@@ -2,12 +2,8 @@ import { parseEther } from 'viem'
import { optimismSepolia, sepolia } from 'viem/chains'
import Wrapper from '@/src/components/pageComponents/home/Examples/demos/OptimismCrossDomainMessenger/Wrapper'
-import ConnectButton from '@/src/components/sharedComponents/ConnectButton'
import TransactionButton from '@/src/components/sharedComponents/TransactionButton'
-import {
- WalletStatusVerifier,
- withWalletStatusVerifier,
-} from '@/src/components/sharedComponents/WalletStatusVerifier'
+import { withWalletStatusVerifier } from '@/src/components/sharedComponents/WalletStatusVerifier'
import { PrimaryButton } from '@/src/components/sharedComponents/ui/Buttons'
import { getContract } from '@/src/constants/contracts/contracts'
import { useL1CrossDomainMessengerProxy } from '@/src/hooks/useL1CrossDomainMessengerProxy'
From 379907cfa601e02969a68634a7c8e3dc6afae4ac Mon Sep 17 00:00:00 2001
From: fernandomg
Date: Fri, 13 Sep 2024 20:25:00 +0200
Subject: [PATCH 052/228] chore: update telegram link
---
src/components/sharedComponents/ui/Footer/Socials/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/sharedComponents/ui/Footer/Socials/index.tsx b/src/components/sharedComponents/ui/Footer/Socials/index.tsx
index 9f6ccc68..ab1ed8ff 100644
--- a/src/components/sharedComponents/ui/Footer/Socials/index.tsx
+++ b/src/components/sharedComponents/ui/Footer/Socials/index.tsx
@@ -25,7 +25,7 @@ const Link = styled.a`
const Socials: FC> = ({ ...restProps }) => {
const items = [
- { label: 'Telegram', icon: , href: 'https://t.me/mgarciap' },
+ { label: 'Telegram', icon: , href: 'https://t.me/dAppBooster' },
{ label: 'Github', icon: , href: 'https://github.com/BootNodeDev' },
{ label: 'Twitter', icon: , href: 'https://twitter.com/bootnodedev' },
{
From 7e9ba0a6b9af5d7e4dc78300e51e3ff95c29bec5 Mon Sep 17 00:00:00 2001
From: nicosampler
Date: Tue, 17 Sep 2024 13:09:27 -0300
Subject: [PATCH 053/228] feat: merge dappbooster 0.9.10
---
.gitignore | 3 +-
README.md | 100 -
SUBGRAPHS.md | 162 -
docs/footer.tsx | 10 +
docs/pages/components/introduction.mdx | 5 +
docs/pages/index.mdx | 10 +
docs/pages/introduction/getting-started.mdx | 57 +
docs/pages/introduction/stack.mdx | 99 +
docs/pages/introduction/why-dappBooster.mdx | 7 +
docs/pages/plugins/index.mdx | 13 +
docs/pages/plugins/subgraphs.mdx | 118 +
docs/pages/recipes/basic-styling.mdx | 158 +
docs/pages/recipes/my-first-dapp.mdx | 394 ++
docs/pages/recipes/subgraphs.mdx | 92 +
docs/pages/styling/basic-styling.mdx | 158 +
docs/pages/styling/integration.mdx | 73 +
docs/public/img/basic-css/1.jpg | Bin 0 -> 35075 bytes
docs/public/img/basic-css/2.jpg | Bin 0 -> 32745 bytes
docs/public/img/basic-css/3.png | Bin 0 -> 36837 bytes
docs/public/img/basic-css/4.png | Bin 0 -> 36911 bytes
docs/public/img/footer/logo.svg | 28 +
docs/public/img/repo_banner.svg | 1 +
package.json | 8 +-
pnpm-lock.yaml | 3350 ++++++++++++++++-
.../OptimismCrossDomainMessenger/index.tsx | 2 +-
...xy.ts => OPL1CrossDomainMessengerProxy.ts} | 2 +-
src/constants/contracts/contracts.ts | 6 +-
...ts => useOPL1CrossDomainMessengerProxy.ts} | 124 +-
vocs.config.ts | 67 +
29 files changed, 4596 insertions(+), 451 deletions(-)
delete mode 100644 SUBGRAPHS.md
create mode 100644 docs/footer.tsx
create mode 100644 docs/pages/components/introduction.mdx
create mode 100644 docs/pages/index.mdx
create mode 100644 docs/pages/introduction/getting-started.mdx
create mode 100644 docs/pages/introduction/stack.mdx
create mode 100644 docs/pages/introduction/why-dappBooster.mdx
create mode 100644 docs/pages/plugins/index.mdx
create mode 100644 docs/pages/plugins/subgraphs.mdx
create mode 100644 docs/pages/recipes/basic-styling.mdx
create mode 100644 docs/pages/recipes/my-first-dapp.mdx
create mode 100644 docs/pages/recipes/subgraphs.mdx
create mode 100644 docs/pages/styling/basic-styling.mdx
create mode 100644 docs/pages/styling/integration.mdx
create mode 100644 docs/public/img/basic-css/1.jpg
create mode 100644 docs/public/img/basic-css/2.jpg
create mode 100644 docs/public/img/basic-css/3.png
create mode 100644 docs/public/img/basic-css/4.png
create mode 100644 docs/public/img/footer/logo.svg
create mode 100644 docs/public/img/repo_banner.svg
rename src/constants/contracts/abis/{L1CrossDomainMessengerProxy.ts => OPL1CrossDomainMessengerProxy.ts} (87%)
rename src/hooks/{useL1CrossDomainMessengerProxy.ts => useOPL1CrossDomainMessengerProxy.ts} (56%)
create mode 100644 vocs.config.ts
diff --git a/.gitignore b/.gitignore
index 98c9c8fd..e0f17a7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,5 +30,4 @@ coverage
src/hooks/generated.ts
src/subgraphs/gql
-vite.config.ts.timestamp*
-docs/
\ No newline at end of file
+vite.config.ts.timestamp*
\ No newline at end of file
diff --git a/README.md b/README.md
index 8bcc1102..5d9075bb 100644
--- a/README.md
+++ b/README.md
@@ -173,103 +173,3 @@ export default {
## Contributing
If you want to contribute to this project, please read the [contributing guidelines](CONTRIBUTING.md). Issues and pull requests are welcome!
-
-## (Very) opinionated list of tools and libraries
-
-### Vite
-
-[Oficial site](https://vitejs.dev/)
-
-This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. It uses [SWC](https://swc.rs/) for fast refresh.
-
-#### React SWC
-
-[Github repository](https://github.com/vitejs/vite-plugin-react-swc)
-
-### TanStack
-
-#### React Query
-
-[Official docs](https://tanstack.com/query/latest)
-
-#### React Virtual
-
-[Official docs](https://tanstack.com/virtual/latest)
-
-#### React Router
-
-[Official docs](https://tanstack.com/router/latest)
-
-Serve dev mode watching for routes changes:
-
-```bash
- pnpm routes:watch
-```
-
-Manually generate `routeTree.gen` file:
-
-```bash
- pnpm routes:generate
-```
-
-#### Dev tools
-
-Dev tools are not visible in production mode.
-
-### Wallet connection
-
-You should be able to seamlessly switch between several libraries for wallet connection.
-
-#### Connectkit
-
-[Official docs](https://docs.family.co/connectkit/getting-started#getting-started) | [Setup file](src/lib/wallets/connectkit.config.tsx)
-
-#### Rainbowkit
-
-[Official docs](https://www.rainbowkit.com/docs/installation) | [Setup file](src/lib/wallets/rainbowkit.config.tsx)
-
-#### Web3modal
-
-[Official docs](https://docs.walletconnect.com/web3modal/react/about#implementation) | [Setup file](src/lib/wallets/web3modal.config.tsx)
-
-### Number Formatting
-
-#### Conedison
-
-[Github repository](https://github.com/Uniswap/conedison) | [`numberFormat.ts`](src/utils/numberFormat.ts) | [`numberFormat.test.ts`](src/utils/format.test.ts)
-
-### Styles
-
-#### Modern Normalize
-
-[Github repository](https://github.com/sindresorhus/modern-normalize)
-
-#### Styled Components
-
-[Official docs](https://styled-components.com/) | [Global CSS vars](src/styles/baseCSSVars.tsx) | [Global styles](src/styles/globalStyles.tsx)
-
-#### Stylelint
-
-[Official docs](https://stylelint.io/) | [Setup file](.stylelintrc)
-
-The [official extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint) is recommended if you're using VSCode.
-
-**Note:** check the "Extension Settings" section if you want errors to be fixed on save, etc.
-
-#### Next Themes
-
-[Github repository](https://github.com/pacocoursey/next-themes) | [Light theme CSS vars](src/styles/themes/lightThemeCSSVars.tsx) | [Dark theme CSS vars](src/styles/themes/darkThemeCSSVars.tsx)
-
-### Faceless UI Modal
-
-[Github repository](https://github.com/faceless-ui/modal) | [Official docs](https://facelessui.com/docs/getting-started)
-
-### React Hot Toast
-
-[Github repository](https://github.com/timolins/react-hot-toast)
-
-### Vercel Web Analytics
-
-[Official docs](https://vercel.com/docs/analytics)
-
-Simply [Enable Web Analytics in Vercel](https://vercel.com/docs/analytics/quickstart#enable-web-analytics-in-vercel) within your Vercel project. Everything else is already integrated and ready to go.
diff --git a/SUBGRAPHS.md b/SUBGRAPHS.md
deleted file mode 100644
index 8f5007c2..00000000
--- a/SUBGRAPHS.md
+++ /dev/null
@@ -1,162 +0,0 @@
-# Subgraphs
-
-## Table of Contents
-
-1. [Env vars](#env-vars)
-2. [Codegen](#codegen)
-3. [Subgraph's folder structure](#subgraphs-folder-structure)
-4. [Example](#example)
-
-## Env vars
-
-> [!IMPORTANT]
->
-> All env variables must be defined in order to be able to consume the subgraph.
-
-> [!NOTE]
->
-> To run the app locally, you can avoid defining the env variables.
->
-> A `ELIFECYCLE Command failed with exit code 1.` message will be show on install, but won't affect the app during development. And subgraph example won't be loaded.
-
-> [!WARNING]
->
-> However, the build will fail if you don't remove the subgraph example from the example page.
-
-### `PUBLIC_SUBGRAPHS_API_KEY`
-
-You need to create and retrieve the API key from https://thegraph.com/studio/apikeys/
-
-### `PUBLIC_SUBGRAPHS__URL`
-
-A URL with replaceable tokens `[api-key]`, `[subgraph-id]`, and `[resource-id]` that matches the Subgraph URLs requirements.
-
-e.g.:
-
-```shell
-PUBLIC_SUBGRAPHS_DEVELOPMENT_URL='https://api.studio.thegraph.com/query/[api-key]/[subgraph-id]/[resource-id]'
-PUBLIC_SUBGRAPHS_PRODUCTION_URL='https://gateway-arbitrum.network.thegraph.com/api/[api-key]/subgraphs/id/[resource-id]'
-```
-
-### `PUBLIC_SUBGRAPHS_ENVIRONMENT`
-
-Values: `development` or `production`
-
-This param matches one of the URLs in the previously explained env var.
-
-It's used to decide which URL will be used to retrieve Subgraphs information.
-
-### `PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS`
-
-Comma separated list of `::`
-
-e.g.:
-
-```shell
-1:uniswap:uniswapResourceIdMainnet,10:aave:aaveResourceIdOptimism
-```
-
-## Codegen
-
-This project uses [`@graphql-codegen`](https://the-guild.dev/graphql/codegen/docs/getting-started) to type and ease the consumption of subgraphs.
-
-To be able to generate the files be sure to have all the env variables defined, and run:
-
-```bash
-# one-time code generation
-# This is ran as part of the `postinstall` hook. So, if you already have
-# the env vars defined, you don't need to run it.
-$ pnpm subgraph-codegen
-
-# if you want for the codegen to watch for changes and regenerate the code
-$ pnpm subraph-codegen --watch
-```
-
-## Subgraph's folder structure
-
-### [`src/subgraphs`](./src/subgraphs/)
-
-Subgraphs in dAppBooster are organized under this directory.
-
-#### [`src/subgraphs/queries`](./src/subgraphs/queries/)
-
-An organized directory whose sub-directories must match `subgraphId` defined in the [chain_resource_ids](#public_subgraphs_chains_resource_ids) env var.
-
-Inside here, you can define individual `.ts` files with `graphql` queries.
-
-#### [`src/subgraphs/codegen.ts`](./src/subgraphs/codegen.ts)
-
-The file that `subgraph-codegen` script will use to generate the code.
-
-#### [`/src/subgraphs/utils/schemas.ts`](./src/subgraphs/utils/schemas.ts)
-
-This file exposes two functions used by `codegen.ts` that allows to organize the data in an easy to consume fashion.
-
-```ts
-const parsedResourceIds = parseResourceIds(SUBGRAPHS_CHAINS_RESOURCE_IDS)
-const schemas = generateSchemas(parsedResourceIds, SUBGRAPHS_API_KEY, SUBGRAPHS_ENVIRONMENT, {
- development: SUBGRAPHS_DEVELOPMENT_URL,
- production: SUBGRAPHS_PRODUCTION_URL,
-})
-```
-
-> `schemas` is then used by the config to generate diverse subgraphs, grouped by `subgraphId`.
-
-#### `src/subgraphs/gql`
-
-The generated directory, which is not versioned. So if you don't see it, an error may have
-happened, you forgot to define all the env variables, or you don't have queries defined.
-
-## Example
-
-1. With a `PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS` defined in the following way:
-
-```shell
-PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS=1:uniswap:uniswapResourceIdMainnet,137:uniswap:uniswapResourceIdPolygon,10:aave:aaveResourceIdOptimism
-```
-
-2. You need to create two directories, with their respective graphql queries files:
-
-```shell
-src/subgraphs/queries/uniswap/
-# and
-src/subgraphs/queries/aave/
-```
-
-An example of a query file inside `uniswap/` directory:
-
-```ts
-// pools.ts
-
-import { graphql } from '@/src/subgraphs/gql/uniswap'
-
-export const allUniswapPoolsQueryDocument = graphql(/* GraphQL */ `
- query allUniswapPools {
- positions(first: 3, orderBy: liquidityUSD, orderDirection: asc) {
- id
- pool {
- id
- symbol
- }
- }
- }
-`)
-```
-
-3. Run the `pnpm subgraph-codegen` script
-
-4. And consume the data in the following way, by using `@tanstack/react-query`:
-
-```ts
-import { allUniswapPoolsQueryDocument } from '@/src/subgraphs/queries/uniswap/pools'
-
-const { data } = useSuspenseQuery({
- queryKey: ['allUniswapPools', mainnet.id],
- queryFn: async () => {
- const { positions } = await request(schemas.uniswap[mainnet.id], allUniswapPoolsQueryDocument)
- return positions
- },
-})
-```
-
-We use suspense queries as an internal decision, but you can use `useQuery` instead, or any of the query hooks the library provides
diff --git a/docs/footer.tsx b/docs/footer.tsx
new file mode 100644
index 00000000..9298a8b3
--- /dev/null
+++ b/docs/footer.tsx
@@ -0,0 +1,10 @@
+import React from 'react'
+
+export default function Footer() {
+ return (
+
+
Released under the MIT License.
+
Copyright © 2024-present -
+
+ )
+ }
diff --git a/docs/pages/components/introduction.mdx b/docs/pages/components/introduction.mdx
new file mode 100644
index 00000000..9586d581
--- /dev/null
+++ b/docs/pages/components/introduction.mdx
@@ -0,0 +1,5 @@
+# Introduction
+
+This section is a work in progress. We are working on improving the documentation and adding more content.
+
+You can refer to the components technical documentation for more information: https://bootnodedev.github.io/dAppBooster/
diff --git a/docs/pages/index.mdx b/docs/pages/index.mdx
new file mode 100644
index 00000000..6a4a59eb
--- /dev/null
+++ b/docs/pages/index.mdx
@@ -0,0 +1,10 @@
+# dAppBooster
+
+
+
+Welcome to [dAppBooster](https://github.com/BootNodeDev/dAppBooster)'s documentation!
+
+This guide will help you get started with dAppBooster, a powerful tool designed to simplify and accelerate the development of dApps and equip you with all the essential tools and configurations to kickstart your project.
+
+Here, you'll find detailed instructions on how to set up, customize, and deploy your dApp using dAppBooster. Let's dive in!
+
diff --git a/docs/pages/introduction/getting-started.mdx b/docs/pages/introduction/getting-started.mdx
new file mode 100644
index 00000000..95805b0b
--- /dev/null
+++ b/docs/pages/introduction/getting-started.mdx
@@ -0,0 +1,57 @@
+# Getting started [Getting started with dAppBooster in just a few lines of code.]
+
+## Overview
+
+dAppBooster is a starter-kit for boosting the development of decentralized applications (dApps).
+It is build onto the last tools available such us [React](https://react.dev/), [Typescript](https://www.typescriptlang.org/), [Wagmi](https://wagmi.sh/), [viem](https://viem.sh/), [@tanstank-query](https://tanstack.com/query/latest), [@tanstank-query](https://tanstack.com/router/latest), [vite](https://vitejs.dev/).
+
+Learn more about the [stack](/introduction/stack).
+
+After more than five years of making decentralized apps, our team at [BootNode](https://bootnode.dev) has put together a simple yet powerful toolkit. This toolkit is designed to tackle the common hurdles and big decisions that come up when building dApps. It makes starting a new dApp smoother, cutting down on both time and complexity while focusing on developer experience, stability, bundle size, and performance. Here are some main features this starter-kit provides:
+
+- **Structure:** a flexible structure to handle contracts, ABIS, subgraphs and common decentralized components.
+- **Multi-chain:** native support and configuration to work with multiple chains with automatic type safe and super intuitive.
+- **Wallets connectivity:** native support to work with [connectkit](https://docs.family.co/connectkit), [rainbowkit](https://www.rainbowkit.com/), [web3modal](https://github.com/WalletConnect/web3modal).
+- **Decentralized components:** Tree-shakable components that any dApp needs.
+- **Subgraphs:** multi-chain subgraphs support with auto generated typed hooks to query data.
+
+You can learn more about the rationale behind the project in the [Why dAppBooster](/introduction/why-dappBooster) section.
+
+## Installation
+
+Get a clean instance of the starter-kit by running
+
+```bash [npx]
+npx dappbooster dappBooster-firstDapp
+```
+
+Now, move to the project and install dependencies
+
+```bash
+cd dappBooster-firstDapp && pnpm i
+```
+
+Clone environment variables
+
+```bash
+cp .env.example .env
+```
+
+Set wallet-connect project ID. You can get one in [cloud.walletconnect.com](https://cloud.walletconnect.com).
+
+edit your `.env` by setting your wallet connect project id.
+
+```
+# WalletConnect Project ID
+PUBLIC_WALLETCONNECT_PROJECT_ID=
+```
+
+Run the dApp in dev mode and open the link provided by this command in the browser.
+
+```bash [pnpm]
+pnpm dev
+```
+
+## Warming engines
+
+We recommend starting with the [My first dApp recipe](/recipes/my-first-dapp) to see how easy it is to build a DApp with our starter kit. In just five minutes, this guide will show you how to create a DApp that lets you wrap and unwrap WETH on the Sepolia network. This hands-on introduction is an excellent first step to using dappBooster and getting familiar with its components.
\ No newline at end of file
diff --git a/docs/pages/introduction/stack.mdx b/docs/pages/introduction/stack.mdx
new file mode 100644
index 00000000..a01d8cfd
--- /dev/null
+++ b/docs/pages/introduction/stack.mdx
@@ -0,0 +1,99 @@
+# Stack [dAppBooster stack and rationale]
+
+## Vite
+
+[Oficial site](https://vitejs.dev/)
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. It uses [SWC](https://swc.rs/) for fast refresh.
+
+### React SWC
+
+[Github repository](https://github.com/vitejs/vite-plugin-react-swc)
+
+## TanStack
+
+### React Query
+
+[Official docs](https://tanstack.com/query/latest)
+
+### React Virtual
+
+[Official docs](https://tanstack.com/virtual/latest)
+
+### React Router
+
+[Official docs](https://tanstack.com/router/latest)
+
+Serve dev mode watching for routes changes:
+
+```bash
+ pnpm routes:watch
+```
+
+Manually generate `routeTree.gen` file:
+
+```bash
+ pnpm routes:generate
+```
+
+### Dev tools
+
+Dev tools are not visible in production mode.
+
+## Wallet connection
+
+You should be able to seamlessly switch between several libraries for wallet connection.
+
+### Connectkit
+
+[Official docs](https://docs.family.co/connectkit/getting-started#getting-started) | [Setup file](https://github.com/BootNodeDev/dAppBooster/blob/main/src/lib/wallets/connectkit.config.tsx)
+
+### Rainbowkit
+
+[Official docs](https://www.rainbowkit.com/docs/installation) | [Setup file](https://github.com/BootNodeDev/dAppBooster/blob/main/src/lib/wallets/rainbowkit.config.tsx)
+
+### Web3modal
+
+[Official docs](https://docs.walletconnect.com/web3modal/react/about#implementation) | [Setup file](https://github.com/BootNodeDev/dAppBooster/blob/main/src/lib/wallets/web3modal.config.tsx)
+
+## Number Formatting
+
+### Conedison
+
+[Github repository](https://github.com/Uniswap/conedison) | [`numberFormat.ts`](https://github.com/BootNodeDev/dAppBooster/blob/main/src/utils/numberFormat.ts)
+
+## Styles
+
+### Modern Normalize
+
+[Github repository](https://github.com/sindresorhus/modern-normalize)
+
+### Styled Components
+
+[Official docs](https://styled-components.com/)
+
+### Stylelint
+
+[Official docs](https://stylelint.io/)
+
+The [official extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint) is recommended if you're using VSCode.
+
+**Note:** check the "Extension Settings" section if you want errors to be fixed on save, etc.
+
+### Next Themes
+
+[Github repository](https://github.com/pacocoursey/next-themes)
+
+## Faceless UI Modal
+
+[Github repository](https://github.com/faceless-ui/modal) | [Official docs](https://facelessui.com/docs/getting-started)
+
+## React Hot Toast
+
+[Github repository](https://github.com/timolins/react-hot-toast)
+
+## Vercel Web Analytics
+
+[Official docs](https://vercel.com/docs/analytics)
+
+Simply [Enable Web Analytics in Vercel](https://vercel.com/docs/analytics/quickstart#enable-web-analytics-in-vercel) within your Vercel project. Everything else is already integrated and ready to go.
\ No newline at end of file
diff --git a/docs/pages/introduction/why-dappBooster.mdx b/docs/pages/introduction/why-dappBooster.mdx
new file mode 100644
index 00000000..79fa313b
--- /dev/null
+++ b/docs/pages/introduction/why-dappBooster.mdx
@@ -0,0 +1,7 @@
+# Why dAppBooster
+
+dAppBooster is a repository template, a starting point designed to streamline the development of decentralized applications (dApps) for Ethereum and other compatible blockchains. This template provides developers with a solid foundation, including essential configurations and tools for integrating with blockchain networks. By utilizing dAppBooster, developers can quickly scaffold new dApps with a standardized setup, ensuring best practices for security, scalability, and efficiency are embedded from the start.
+
+It includes a ready-to-use development environment and whether you're building DeFi apps, or other blockchain solutions, dAppBooster saves time making it easier to launch robust blockchain-based applications.
+
+Whether you're a beginner or an experienced blockchain developer, dAppBooster provides a reliable, scalable starting point that takes care of much of the initial setup, letting you focus on building unique features for your dApp. Its flexibility makes it suitable for a wide range of blockchain-based applications, from simple token systems to complex decentralized ecosystems.
\ No newline at end of file
diff --git a/docs/pages/plugins/index.mdx b/docs/pages/plugins/index.mdx
new file mode 100644
index 00000000..4ad423ed
--- /dev/null
+++ b/docs/pages/plugins/index.mdx
@@ -0,0 +1,13 @@
+# Plugin System Overview
+dAppBooster is designed with a flexible and modular architecture that allows users to extend its core functionality through a plugin system. Plugins are independent modules that can be added as dependencies, enabling new features or enhancing existing ones without modifying the main project. This approach not only keeps the core codebase clean and maintainable but also allows developers to customize and scale their applications by adding only the functionalities they need.
+
+## How Plugins Work
+Plugins integrate seamlessly with dAppBooster by hooking into its architecture, offering a straightforward way to augment the platform's capabilities. By installing and configuring plugins, developers can tailor dAppBooster to suit their specific needs, whether it's adding support for new technologies, streamlining workflows, or enhancing performance.
+
+## Benefits of Using Plugins
+- Modularity: Only add the features you need without bloating your project.
+- Scalability: Easily enhance your project's capabilities as requirements grow.
+- Ease of Use: Simple integration with minimal configuration required.
+- Community Contributions: Leverage plugins developed by the community or create your own to extend functionality further.
+
+The plugin system empowers developers to build on top of dAppBooster, making it adaptable and versatile for various use cases. Whether you're building a simple application or a complex dApp, the plugin system ensures that dAppBooster can evolve alongside your project's needs.
\ No newline at end of file
diff --git a/docs/pages/plugins/subgraphs.mdx b/docs/pages/plugins/subgraphs.mdx
new file mode 100644
index 00000000..33d0bb25
--- /dev/null
+++ b/docs/pages/plugins/subgraphs.mdx
@@ -0,0 +1,118 @@
+# dAppBooster Subgraph Plugin
+
+This package provides a flexible and reusable solution for generating GraphQL clients using @graphql-codegen/cli, integrated with @tanstack/react-query. It simplifies the process of setting up and managing GraphQL code generation for multiple subgraphs.
+
+## Installation
+
+This package uses pnpm as the preferred package manager. First, install the package along with other required dependencies:
+
+```bash [Terminal]
+pnpm add @bootnodedev/db-subgraph graphql graphql-request
+```
+
+Then, add the development dependencies:
+
+```bash [_Terminal]
+pnpm add -D @graphql-codegen/cli @graphql-typed-document-node/core
+```
+
+This separation ensures that the runtime dependencies are installed in your main dependencies, while the code generation tools are kept in your development dependencies.
+
+## Usage
+
+::::steps
+### Set Up CodeGen Configuration
+
+Create a codegen file (e.g., `src/subgraphs/codegen.ts`) in your project:
+
+```ts [src/subgraphs/codegen.ts] showLineNumbers
+import { generateCodegenConfig } from "@bootnodedev/db-subgraph";
+import { loadEnv } from "vite";
+
+const env = loadEnv("subgraphs", process.cwd(), "");
+
+export default generateCodegenConfig({
+ subgraphs: [
+ {
+ apiKey: env.PUBLIC_SUBGRAPHS_API_KEY,
+ chainsResourceIds: env.PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS,
+ environment: "production",
+ productionUrl: env.PUBLIC_SUBGRAPHS_PRODUCTION_URL,
+ },
+ ],
+});
+```
+:::tip
+You can use environment variables, hard-coded values, or a combination of both. Adjust the configuration according to your project's needs.
+:::
+
+This file uses the `generateCodegenConfig` function from our package to create the configuration for @graphql-codegen/cli.
+
+### Run CodeGen
+
+Add a script to your `package.json` to run the code generation:
+
+```json [package.json]
+{
+ "scripts": {
+ "subgraph-codegen": "graphql-codegen --config ./src/subgraphs/codegen.ts" // [!code ++]
+ }
+}
+```
+
+Now you can generate your GraphQL clients by running:
+
+```bash [Terminal]
+pnpm run subgraph-codegen
+```
+
+### Consume the queries
+
+You can see a how it's been used in the [dAppBooster Landing Page](https://github.com/BootNodeDev/dAppBoosterLandingPage).
+
+And for further information refer to the [subgraphs recipe](/recipes/subgraphs).
+::::
+
+## Configuration Options
+
+The `PackageConfig` interface accepts the following options for each subgraph:
+
+- `apiKey`: Your subgraph API key.
+- `chainsResourceIds`: A string of comma-separated `::`.
+ - i.e.:
+```txt
+137:uniswap:BvYimJ6vCLkk63oWZy7WB5cVDTVVMugUAF35RAUZpQXE,8453:aave:GQFbb95cE6d8mV989mL5figjaGaKCQB3xqYrr1bRyXqF
+```
+- `developmentUrl`: The URL for the development environment.
+- `productionUrl`: The URL for the production environment.
+- `environment`: Either 'development' or 'production'.
+- `queriesDirectory`: The directory where your GraphQL queries are located.
+ - default: `./src/subgraphs/queries`
+- `destinationDirectory`: The directory where your typed queries will be generated.
+ - defult: `./src/subgraphs/gql`
+
+## Adding Multiple Subgraphs
+
+You can configure multiple subgraphs by adding more objects to the `subgraphs` array in your configuration:
+
+```ts [src/subgraphs/codegen.ts]
+export default generateCodegenConfig({
+ subgraphs: [
+ {
+ // First subgraph configuration
+ },
+ {
+ // Second subgraph configuration
+ },
+ // Add more as needed
+ ],
+});
+```
+
+## Generated Files
+
+The package will generate GraphQL clients in the `src/subgraphs/gql/` directory, organized by subgraph ID.
+
+## Customization
+
+If you need to customize the generation process further, you can modify the `codegen.ts` file. The package is designed to be flexible, allowing you to define configurations in the way that best suits your project structure and requirements.
diff --git a/docs/pages/recipes/basic-styling.mdx b/docs/pages/recipes/basic-styling.mdx
new file mode 100644
index 00000000..ef04db06
--- /dev/null
+++ b/docs/pages/recipes/basic-styling.mdx
@@ -0,0 +1,158 @@
+# Basic Styling
+
+## Overview
+
+We use [Styled Components](https://styled-components.com/) for styling. Basic CSS and CSS-in-JS knowledge will be beneficial to understand this guide, but you can also learn as you go. There's nothing too complicated about this.
+
+Refer to the [official documentation](https://styled-components.com/docs) for more information about more advanced features.
+
+Before continuing, be sure to follow the steps in [getting started](/introduction/getting-started) so you have a project to work with.
+
+## Some basic concepts
+
+- **Folder structure:** App-wide styles are located in the `src/styles` folder.
+- **Global styles:** `src/styles/globalStyles.tsx` we use this file to define global CSS styles.
+- **Base CSS vars:** `src/styles/baseCSSVars.tsx` is used to define global CSS variables. This file is mostly used for **non theme specific** base CSS variables like font families, layout spacing, font size, etc.
+- **Themes:** `src/styles/themes/lightThemeCSSVars.tsx` and `src/styles/themes/darkThemeCSSVars.tsx` are used to define theme-specific CSS variables. Use them for CSS variables like colors, shadows, etc. Theming is handled by the [next-themes](https://github.com/pacocoursey/next-themes) library, refer to the documentation for more information.
+- **Styled Components:** Is used to style components, so each component has its own styles following the CSS-in-JS pattern and philosophy.
+- **HTML props**: All the _core_ components should accept the `style` and `className` props, so you can style them as you wish (inline styles, CSS classes, etc.).
+
+## Let's get started
+
+:::info
+**Tip:** a complete demo with the results of this guide can be found in the https://github.com/BootNodeDev/dAppBoosterBasicStyling fork of the dAppBooster repository.
+:::
+
+Let's say you want to change some colors from one of our core components: `TokenInput`. Easy peasy!
+
+You can find the component in the `src/components/sharedComponents/TokenInput` folder, but there's no need to go there. You can override the basic styles using some CSS variables in the light or dark theme files (or even in the same file where you're using the component, but let's not go there... yet).
+
+This is how our initial dApp looks like:
+
+
+
+Here's an example of how you can change the colors of the `TokenInput` component using CSS variables only:
+
+- For simplicity's sake, let's say you want to change only the light theme colors. Open the `src/styles/themes/lightThemeCSSVars.tsx` file.
+- You'll find CSS vars for several components there, but let's focus on the `TokenInput` component. You can search for the "Token Input" section in the file, or just go to [line 186](https://github.com/BootNodeDev/dAppBooster/blob/0cac08c86299da9c8ab147de29f0f972069f4177/src/styles/themes/lightThemeCSSVars.tsx#L186) (wink wink). You'll see something like this:
+
+```tsx
+ --theme-token-input-title-color: #2e3048;
+
+ --theme-token-input-background: #fff;
+
+ --theme-token-input-textfield-background-color: #fff;
+ --theme-token-input-textfield-background-color-active: rgb(0 0 0 / 5%);
+ --theme-token-input-textfield-border-color: #e2e0e7;
+ --theme-token-input-textfield-border-color-active: #e2e0e7;
+ --theme-token-input-textfield-color: #2e3048;
+ --theme-token-input-textfield-color-active: #2e3048;
+ --theme-token-input-textfield-placeholder-color: rgb(22 29 26 / 60%);
+
+ // ...
+```
+
+The var names are pretty self-explanatory. There are CSS vars for each part of the `TokenInput` component: title, background, textfield, etc. You can change the values of these vars to whatever you want. For example, if you want to change the background color of the `TokenInput` component, you can change the `--theme-token-input-background` var to `#f0f0f0`:
+
+```tsx
+ --theme-token-input-background: #f0f0f0;
+```
+
+This is what this simple change will get you:
+
+
+
+Experiment with the rest of the CSS vars to see what you can achieve. You can also change the colors of other components in the same way.
+
+:::info
+**Remember:** we're changing only the light theme colors here. If you want to change the dark theme colors, you can modify them in `src/styles/themes/darkThemeCSSVars.tsx`.
+:::
+
+## What about things that are not theme-related?
+
+Some things like padding, column gap, etc. are not theme related (they stay the same when you change themes), so they shouldn't be placed in either theme file. You can modify those in the `src/styles/baseCSSVars.tsx` file, or locally in your component.
+
+We already saw how to modify some of the global files, so now let's say we do it locally in our `TokenInput` example located in the `src/components/pageComponents/home/index.tsx` file. We import `TokenInput` and also `styled` from `styled-components`, and then we create a `CustomTokenInput` component with the `TokenInput` component as a base:
+
+
+```tsx
+import styled from 'styled-components'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+
+const CustomTokenInput = styled(TokenInput)`
+ /* our custom CSS vars and styles go here */
+`
+```
+
+There's a bunch of "base" CSS vars we can modify that will affect how the `TokenInput` component looks, and they should be self-explanatory, but you can check the component's documentation for more info. For example:
+
+```tsx
+ --base-token-input-border-radius
+ --base-token-input-padding
+ --base-token-input-gap
+```
+
+Let's say we want straight corners and a bit more padding. We can change the `--base-token-input-border-radius` and `--base-token-input-padding` vars like this:
+
+```tsx
+const CustomTokenInput = styled(TokenInput)`
+ --base-token-input-border-radius: 0;
+ --base-token-input-padding: 20px;
+`
+```
+
+That and the previous changes will give us something like this:
+
+
+
+Neat, huh? You can experiment with the [rest of TokenInput's CSS vars](https://github.com/BootNodeDev/dAppBooster/blob/0cac08c86299da9c8ab147de29f0f972069f4177/src/components/sharedComponents/TokenInput/index.tsx#L72) to see what you can achieve.
+
+## That's fine and all, but I want to change the component even more...
+
+You can always extend the components using Styled Components. For example, let's say you want to change `TokenInput` to center it on the screen. In our example that's very easy to do, we only need to add `margin: auto` to the component's wrapper. Here's how you can do it:
+
+```tsx
+import styled from 'styled-components'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+
+const CustomTokenInput = styled(TokenInput)`
+ /* Applies to component's wrapper */
+ margin: auto;
+`
+```
+
+And that's it! Now the component is centered.
+
+## What about the internal components and everything not covered by CSS vars?
+
+One way you can go about this is extending the component as we did in the previous example and styling the internal components using each component's class name. For example:
+
+```tsx
+import styled from 'styled-components'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+
+const CustomTokenInput = styled(TokenInput)`
+ /* Title */
+ .tokenInputTitle {
+ font-size: 18px;
+ font-weight: 700;
+ padding-bottom: 8px;
+ }
+
+ /* Input component */
+ .tokenInputTextfield {
+ font-size: 20px;
+ }
+`
+```
+
+That will result in the following:
+
+
+
+Finally, the last way you can do this (and my favorite!) is to dig into the [components code](https://github.com/BootNodeDev/dAppBoosterBasicStyling/tree/0cac08c86299da9c8ab147de29f0f972069f4177/src/components/sharedComponents) and modify it as you please. It's all there, so the sky and your skills are the limit.
+
+**And remember:** if you want to contribute to the project, fix bugs, add features, etc. you can always [create a PR](https://github.com/BootNodeDev/dAppBooster/blob/develop/CONTRIBUTING.md) with your changes!
\ No newline at end of file
diff --git a/docs/pages/recipes/my-first-dapp.mdx b/docs/pages/recipes/my-first-dapp.mdx
new file mode 100644
index 00000000..6d25194c
--- /dev/null
+++ b/docs/pages/recipes/my-first-dapp.mdx
@@ -0,0 +1,394 @@
+# Building Your First dApp [Wrapping and Unwrapping WETH]
+
+## Introduction
+This guide will walk you through developing your first dApp using dappBooster. You'll learn how to create a simple dApp that enables users to wrap and unwrap WETH (in less than five minutes).
+
+## Hands-on
+
+Before continuing, be sure to have followed the steps in [getting started](/introduction/getting-started)
+
+### Network Configuration
+
+The Sepolia network is pre-configured in [src/lib/networks.config.ts](https://github.com/BootNodeDev/dAppBooster/blob/develop/src/lib/networks.config.ts). Review this file if you're interested in adding more networks by following the existing pattern.
+
+### Contract Configuration
+
+We have already deployed a smart contract to the Sepolia network. Now it'ss time to let the dApp know about it existence:
+
+1. Download the [ABI](https://sepolia.etherscan.io/address/0xa45f5716cab1a49b107a5de96ec26da26d1eba9e#code) and save it in `src/constants/contracts/abis/WETH.ts` using the following format:
+
+```tsx
+export const WETH_ABI = [
+ // ...abi code
+] as const
+```
+
+2. Update `src/constants/contracts/contracts.ts` with the WETH contract address and ABI:
+
+```tsx
+import { WETH_ABI } from '@/src/constants/contracts/abis/WETH'
+
+export const contracts = {
+ // ...
+ {
+ abi: WETH_ABI,
+ name: 'WETH',
+ address: {
+ [sepolia.id]: '0xa45f5716cab1a49b107a5de96ec26da26d1eba9e',
+ },
+ },
+}
+```
+
+### Generate WETH hooks
+
+Use the wagmi utility to generate React hooks for the WETH contract. We have [configured](https://github.com/BootNodeDev/dAppBooster/blob/develop/src/lib/wagmi/config.ts) wagmi to generate hooks with both suspense and promised hooks.
+
+```bash
+pnpm wagmi-generate
+```
+
+### Create the weth page
+
+1. Add a new file `/src/routes/weth.lazy.tsx` with the following content:
+
+```tsx
+import { createLazyFileRoute } from '@tanstack/react-router'
+
+import { Weth } from '@/src/components/pageComponents/weth'
+
+export const Route = createLazyFileRoute('/weth')({
+ component: Weth,
+})
+```
+
+With this file we are registering a new page under the path `/weth`.
+
+2. Create a new folder `src/components/pageComponents/weth`.
+
+3. Create a new file `src/components/pageComponents/weth/index.tsx` with this content:
+
+```tsx
+import { Card } from 'db-ui-toolkit'
+
+export const Weth = () => {
+ return Hello Annon!
+}
+```
+
+This is just a simple component that we will use to add all the WETH logic.
+
+Now, you can open this link [http://localhost:5173/weth](http://localhost:5173/weth) to see it working.
+
+### Add a custom token list
+
+dappBooster has a set of components and utilities designed to simplify the integration of tokens while following the standard defined by [tokenlists.org](https://tokenlists.org/). As we are working with a home-made WETH token, we will create a custom token link where the only token it holds is our WETH token. Let's add it to our code:
+
+1. Create `public/tokens.json` with the following content:
+
+```json
+{
+ "name": "custom",
+ "tokens": [
+ {
+ "address": "0xa45f5716cab1a49b107a5de96ec26da26d1eba9e",
+ "chainId": 11155111,
+ "name": "WETH",
+ "symbol": "WETH",
+ "decimals": 18,
+ "logoURI": "https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1696503332"
+ }
+ ]
+}
+```
+
+2. Add the new token list to the following constant `src/constants/tokenLists.ts` like so:
+
+```tsx
+{
+ // ...
+ CUSTOM: '/tokens.json',
+}
+```
+
+Now, all the token related utilities will make use of this new list.
+
+:::info
+Use [useTokenLists](https://github.com/BootNodeDev/dAppBooster/blob/develop/src/hooks/useTokenLists.ts) hook it to obtain all the tokens configured.
+:::
+
+### The TokenInput component
+
+We will use the `TokenInput` component. This component will provide us with the following features:
+
+* Show the user the token they are interacting with (ETH when wrapping and WETH when unwrapping).
+* It will allow the user to enter the token amount in decimal format and will return the parsed amount in wei.
+* It will fetch the selected token's balance.
+* It will notify the user of any issues found with the input value entered.
+
+Let's modify the `@/src/components/pageComponents/weth` file as follows:
+
+```tsx
+import { Card } from 'db-ui-toolkit'
+import { sepolia } from 'viem/chains'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+import { useTokenInput } from '@/src/components/sharedComponents/TokenInput/useTokenInput'
+import { getContract } from '@/src/constants/contracts/contracts'
+import { env } from '@/src/env'
+import { useTokenLists } from '@/src/hooks/useTokenLists'
+
+export const Weth = () => {
+ // get the list of tokens.
+ const { tokensByChainId } = useTokenLists()
+
+ // helper that give us information given a contract name.
+ const weth = getContract('WETH', sepolia.id)
+
+ // get the tokens from the token list we need to use.
+ const wethToken = tokensByChainId[sepolia.id].find((token) => token.address === weth.address)
+ const ethToken = tokensByChainId[sepolia.id].find(
+ (token) => token.address === env.PUBLIC_NATIVE_TOKEN_ADDRESS,
+ )
+ if (!wethToken) throw new Error('WETH token not found')
+ if (!ethToken) throw new Error('ETH token not found')
+
+ // hook that gives us the state that needs.
+ const tokenInput = useTokenInput(ethToken)
+
+ return (
+
+ WETH EXAMPLE
+
+
+ )
+}
+```
+
+Now, you should see the `TokenInput` component in action. Connect a wallet with a Sepolia ETH balance, and the component will display it.
+
+### Suspense loading
+
+As you might have noticed, after the page is loaded the component will take some time before appearing. This is happening because dappBooster makes use of [Suspense](https://react.dev/reference/react/Suspense) for some internal requests.
+
+To improve the UX we can show a loading component until the component is ready to be rendered. We'll use a utility function called `withSuspenseAndRetry` to wrap our `Weth` component, and indicate that while the component is fetching data, we want to render a "loading..." text:
+
+```tsx
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+export const SuspendedWeth = withSuspenseAndRetry(() => {
+ // ...
+})
+
+export const Weth = () => (
+ Loading...} />
+)
+```
+
+### Wallet status & contract interaction
+
+Now it's time to develop the functionality for deposit and withdrawal.
+
+We will consume different hooks that will take care of triggering the transactions for deposit, approve and withdraw.
+
+Also, we will make use of another special hook [useWeb3Status()](https://github.com/BootNodeDev/dAppBooster/blob/develop/src/hooks/useWeb3Status.tsx) provided by dappBooster. This hook will return important information of the context of the connected wallet and selected chain.
+
+```tsx
+import { Card } from 'db-ui-toolkit'
+import { Address } from 'viem'
+import { sepolia } from 'viem/chains'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+import { useTokenInput } from '@/src/components/sharedComponents/TokenInput/useTokenInput'
+import { getContract } from '@/src/constants/contracts/contracts'
+import { env } from '@/src/env'
+import { // [!code focus]
+ useReadWethAllowance, // [!code focus]
+ useWriteWethApprove, // [!code focus]
+ useWriteWethDeposit, // [!code focus]
+ useWriteWethWithdraw, // [!code focus]
+} from '@/src/hooks/generated' // [!code focus]
+import { useTokenLists } from '@/src/hooks/useTokenLists'
+import { useWeb3Status } from '@/src/hooks/useWeb3Status' // [!code focus]
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+export const SuspendedWeth = withSuspenseAndRetry(() => {
+ // get the list of tokens.
+ const { tokensByChainId } = useTokenLists()
+
+ // helper that give us information given a contract name.
+ const weth = getContract('WETH', sepolia.id)
+
+ // get the tokens from the token list we need to use.
+ const wethToken = tokensByChainId[sepolia.id].find((token) => token.address === weth.address)
+ const ethToken = tokensByChainId[sepolia.id].find(
+ (token) => token.address === env.PUBLIC_NATIVE_TOKEN_ADDRESS,
+ )
+ if (!wethToken) throw new Error('WETH token not found')
+ if (!ethToken) throw new Error('ETH token not found')
+
+ // hook that gives us the state that needs.
+ const tokenInput = useTokenInput(ethToken)
+
+ // status of the Web3 connection. // [!code focus]
+ const { address } = useWeb3Status() // [!code focus]
+
+ // contracts calls // [!code focus]
+ const { writeContractAsync: wethDeposit } = useWriteWethDeposit() // [!code focus]
+ const { writeContractAsync: wethApprove } = useWriteWethApprove() // [!code focus]
+ const { writeContractAsync: wethWithdraw } = useWriteWethWithdraw() // [!code focus]
+
+ // contracts reads // [!code focus]
+ const wethAllowance = useReadWethAllowance({ // [!code focus]
+ args: [address as Address, weth.address], // [!code focus]
+ query: { // [!code focus]
+ enabled: !!address, // [!code focus]
+ }, // [!code focus]
+ }) // [!code focus]
+
+ return (
+
+ WETH EXAMPLE
+
+
+ )
+})
+
+export const Weth = () => (
+ Loading...} />
+)
+```
+
+### Deposit, approve and withdraw
+
+After the user enters a valid value, we need a button to trigger one of the possible actions. We will make use of the [TransactionButton](https://github.com/BootNodeDev/dAppBooster/blob/develop/src/components/sharedComponents/TransactionButton.tsx) component to handle the transaction lifecycle. We will only pass two properties `transaction`, which receives a function returning a promise with a transaction hash, and `onMined` where we will refetch the user balance once the transaction has been mined.
+
+```tsx
+import { ChangeEvent, useState } from 'react' // [!code focus]
+
+import { Card } from 'db-ui-toolkit'
+import { Address } from 'viem' // [!code focus]
+import { sepolia } from 'viem/chains'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+import { useTokenInput } from '@/src/components/sharedComponents/TokenInput/useTokenInput'
+import TransactionButton from '@/src/components/sharedComponents/TransactionButton' // [!code focus]
+import { getContract } from '@/src/constants/contracts/contracts'
+import { env } from '@/src/env'
+import {
+ useReadWethAllowance,
+ useWriteWethApprove,
+ useWriteWethDeposit,
+ useWriteWethWithdraw,
+} from '@/src/hooks/generated'
+import { useTokenLists } from '@/src/hooks/useTokenLists'
+import { useWeb3Status } from '@/src/hooks/useWeb3Status'
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+type Operation = 'Deposit' | 'Withdraw' // [!code focus]
+
+export const SuspendedWeth = withSuspenseAndRetry(() => {
+ const [operation, setOperation] = useState('Deposit') // [!code focus]
+
+ // get the list of tokens.
+ const { tokensByChainId } = useTokenLists()
+
+ // helper that give us information given a contract name.
+ const weth = getContract('WETH', sepolia.id)
+
+ // get the tokens from the token list we need to use.
+ const wethToken = tokensByChainId[sepolia.id].find((token) => token.address === weth.address)
+ const ethToken = tokensByChainId[sepolia.id].find(
+ (token) => token.address === env.PUBLIC_NATIVE_TOKEN_ADDRESS,
+ )
+ if (!wethToken) throw new Error('WETH token not found')
+ if (!ethToken) throw new Error('ETH token not found')
+
+ // hook that gives us the state that needs.
+ const tokenInput = useTokenInput(ethToken)
+
+ // status of the Web3 connection.
+ const { address } = useWeb3Status()
+
+ // contracts calls
+ const { writeContractAsync: wethDeposit } = useWriteWethDeposit()
+ const { writeContractAsync: wethApprove } = useWriteWethApprove()
+ const { writeContractAsync: wethWithdraw } = useWriteWethWithdraw()
+
+ // contracts reads
+ const wethAllowance = useReadWethAllowance({
+ args: [address as Address, weth.address],
+ query: {
+ enabled: !!address,
+ },
+ })
+
+ const sendOperation = async () => { // [!code focus]
+ if (operation == 'Deposit') { // [!code focus]
+ const res = await wethDeposit({ value: tokenInput.amount }) // [!code focus]
+ return res // [!code focus]
+ } else if (tokenInput.amount > (wethAllowance.data || 0n)) { // [!code focus]
+ const res = await wethApprove({ args: [weth.address, tokenInput.amount] }) // [!code focus]
+ return res // [!code focus]
+ } else { // [!code focus]
+ const res = await wethWithdraw({ args: [tokenInput.amount] }) // [!code focus]
+ return res // [!code focus]
+ } // [!code focus]
+ } // [!code focus]
+
+ // giving context to the toast // [!code focus]
+ sendOperation.methodId = `WETH:${operation}` // [!code focus]
+ if (operation === 'Withdraw' && tokenInput.amount > (wethAllowance.data || 0n)) { // [!code focus]
+ sendOperation.methodId = `WETH:Approve` // [!code focus]
+ } // [!code focus]
+
+ const getActionText = () => { // [!code focus]
+ if (operation === 'Withdraw' && tokenInput.amount > (wethAllowance.data || 0n)) { // [!code focus]
+ return 'Approve' // [!code focus]
+ } // [!code focus]
+ return operation // [!code focus]
+ }
+
+ const handleOperation = (e: ChangeEvent) => { // [!code focus]
+ const newValue = e.target.value as Operation // [!code focus]
+ tokenInput.setTokenSelected(newValue === 'Deposit' ? ethToken : wethToken) // [!code focus]
+ setOperation(e.target.value as Operation) // [!code focus]
+ } // [!code focus]
+
+ return (
+
+ WETH EXAMPLE
+ // [!code focus]
+ // [!code focus]
+
// [!code focus]
+ Operation{' '} // [!code focus]
+ // [!code focus]
+ Deposit // [!code focus]
+ Withdraw // [!code focus]
+ // [!code focus]
+
// [!code focus]
+
// [!code focus]
+
+
+
+ // [!code focus]
+ wethAllowance.refetch()} // [!code focus]
+ transaction={sendOperation} // [!code focus]
+ > // [!code focus]
+ {getActionText()} // [!code focus]
+ // [!code focus]
+ // [!code focus]
+ )
+})
+
+export const Weth = () => (
+ Loading...} />
+)
+```
+
+:::info
+The `sendOperation.methodId` is used to provide additional context to the toast notification displayed by the `TransactionButton`. This is optional, but if you include a `methodId` property in the function passed to the transaction property, it will display that context in the toast, offering the user more detailed information.
+:::
+
diff --git a/docs/pages/recipes/subgraphs.mdx b/docs/pages/recipes/subgraphs.mdx
new file mode 100644
index 00000000..b965dd56
--- /dev/null
+++ b/docs/pages/recipes/subgraphs.mdx
@@ -0,0 +1,92 @@
+# Subgraphs
+
+## Introduction
+
+This guide will walk you through using the subgraphs plugin.
+
+## Hands-on
+
+Before continuing, be sure to have followed the steps in [subgraphs plugin](/plugins/subgraphs).
+
+:::note
+We'll be exploring the consume of the polygon (137) uniswap pools query.
+:::
+
+## Consume the Subgraph
+
+::::steps
+
+### Create a query to list uniswap pools by liquidy:
+
+```ts [src/subgraphs/queries/uniswap/pool.ts] showLineNumbers
+import { graphql } from '@/src/subgraphs/gql/uniswap'
+
+export const allUniswapPoolsQueryDocument = graphql(/* GraphQL */ `
+ query allUniswapPools {
+ positions(first: 3, orderBy: liquidityUSD, orderDirection: asc) {
+ id
+ pool {
+ id
+ symbol
+ }
+ }
+ }
+`)
+```
+
+### Run the subgraph-codegen script:
+```bash [Terminal]
+pnpm subgraph-codegen
+```
+:::note
+This will consume the query you just creted, poll the information from The Graph services and create the types for you.
+:::
+
+### Consume the data:
+```tsx [UniswapPoolsPolygon.tsx] showLineNumbers
+import { generateSchemasMapping } from '@bootnodedev/db-subgraph'
+
+import { useSuspenseQuery } from '@tanstack/react-query'
+
+import { env } from '@/src/env'
+import { withSuspenseAndRetry } from '@/src/utils/suspenseWrapper'
+
+const appSchemas = generateSchemasMapping({
+ apiKey: env.PUBLIC_SUBGRAPHS_API_KEY!,
+ chainsResourceIds: env.PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS!,
+ environment: env.PUBLIC_SUBGRAPHS_ENVIRONMENT,
+ productionUrl: env.PUBLIC_SUBGRAPHS_PRODUCTION_URL,
+})
+
+export const UniswapPoolsPolygon = withSuspenseAndRetry(() => {
+ const { data } = useSuspenseQuery({
+ queryKey: ['allUniswapPools', 137],
+ queryFn: async () => {
+ const { positions } = await request(
+ appSchemas.uniswap[137],
+ allUniswapPoolsQueryDocument,
+ )
+ return positions
+ },
+ })
+
+ return (
+
+
Uniswap Pool {getNetworkIcon(chain.name.toLowerCase())}
+ {data.map((position) => (
+
+ {position.pool.symbol}
+
+
+
+ ))}
+
+ )
+})
+```
+
+:::tip
+You can find a working example at the [dAppBooster Landing Page codebase](https://github.com/BootNodeDev/dAppBoosterLandingPage/blob/main/src/components/pageComponents/home/Examples/demos/SubgraphDemo/index.tsx)
+:::
+
+::::
diff --git a/docs/pages/styling/basic-styling.mdx b/docs/pages/styling/basic-styling.mdx
new file mode 100644
index 00000000..ef04db06
--- /dev/null
+++ b/docs/pages/styling/basic-styling.mdx
@@ -0,0 +1,158 @@
+# Basic Styling
+
+## Overview
+
+We use [Styled Components](https://styled-components.com/) for styling. Basic CSS and CSS-in-JS knowledge will be beneficial to understand this guide, but you can also learn as you go. There's nothing too complicated about this.
+
+Refer to the [official documentation](https://styled-components.com/docs) for more information about more advanced features.
+
+Before continuing, be sure to follow the steps in [getting started](/introduction/getting-started) so you have a project to work with.
+
+## Some basic concepts
+
+- **Folder structure:** App-wide styles are located in the `src/styles` folder.
+- **Global styles:** `src/styles/globalStyles.tsx` we use this file to define global CSS styles.
+- **Base CSS vars:** `src/styles/baseCSSVars.tsx` is used to define global CSS variables. This file is mostly used for **non theme specific** base CSS variables like font families, layout spacing, font size, etc.
+- **Themes:** `src/styles/themes/lightThemeCSSVars.tsx` and `src/styles/themes/darkThemeCSSVars.tsx` are used to define theme-specific CSS variables. Use them for CSS variables like colors, shadows, etc. Theming is handled by the [next-themes](https://github.com/pacocoursey/next-themes) library, refer to the documentation for more information.
+- **Styled Components:** Is used to style components, so each component has its own styles following the CSS-in-JS pattern and philosophy.
+- **HTML props**: All the _core_ components should accept the `style` and `className` props, so you can style them as you wish (inline styles, CSS classes, etc.).
+
+## Let's get started
+
+:::info
+**Tip:** a complete demo with the results of this guide can be found in the https://github.com/BootNodeDev/dAppBoosterBasicStyling fork of the dAppBooster repository.
+:::
+
+Let's say you want to change some colors from one of our core components: `TokenInput`. Easy peasy!
+
+You can find the component in the `src/components/sharedComponents/TokenInput` folder, but there's no need to go there. You can override the basic styles using some CSS variables in the light or dark theme files (or even in the same file where you're using the component, but let's not go there... yet).
+
+This is how our initial dApp looks like:
+
+
+
+Here's an example of how you can change the colors of the `TokenInput` component using CSS variables only:
+
+- For simplicity's sake, let's say you want to change only the light theme colors. Open the `src/styles/themes/lightThemeCSSVars.tsx` file.
+- You'll find CSS vars for several components there, but let's focus on the `TokenInput` component. You can search for the "Token Input" section in the file, or just go to [line 186](https://github.com/BootNodeDev/dAppBooster/blob/0cac08c86299da9c8ab147de29f0f972069f4177/src/styles/themes/lightThemeCSSVars.tsx#L186) (wink wink). You'll see something like this:
+
+```tsx
+ --theme-token-input-title-color: #2e3048;
+
+ --theme-token-input-background: #fff;
+
+ --theme-token-input-textfield-background-color: #fff;
+ --theme-token-input-textfield-background-color-active: rgb(0 0 0 / 5%);
+ --theme-token-input-textfield-border-color: #e2e0e7;
+ --theme-token-input-textfield-border-color-active: #e2e0e7;
+ --theme-token-input-textfield-color: #2e3048;
+ --theme-token-input-textfield-color-active: #2e3048;
+ --theme-token-input-textfield-placeholder-color: rgb(22 29 26 / 60%);
+
+ // ...
+```
+
+The var names are pretty self-explanatory. There are CSS vars for each part of the `TokenInput` component: title, background, textfield, etc. You can change the values of these vars to whatever you want. For example, if you want to change the background color of the `TokenInput` component, you can change the `--theme-token-input-background` var to `#f0f0f0`:
+
+```tsx
+ --theme-token-input-background: #f0f0f0;
+```
+
+This is what this simple change will get you:
+
+
+
+Experiment with the rest of the CSS vars to see what you can achieve. You can also change the colors of other components in the same way.
+
+:::info
+**Remember:** we're changing only the light theme colors here. If you want to change the dark theme colors, you can modify them in `src/styles/themes/darkThemeCSSVars.tsx`.
+:::
+
+## What about things that are not theme-related?
+
+Some things like padding, column gap, etc. are not theme related (they stay the same when you change themes), so they shouldn't be placed in either theme file. You can modify those in the `src/styles/baseCSSVars.tsx` file, or locally in your component.
+
+We already saw how to modify some of the global files, so now let's say we do it locally in our `TokenInput` example located in the `src/components/pageComponents/home/index.tsx` file. We import `TokenInput` and also `styled` from `styled-components`, and then we create a `CustomTokenInput` component with the `TokenInput` component as a base:
+
+
+```tsx
+import styled from 'styled-components'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+
+const CustomTokenInput = styled(TokenInput)`
+ /* our custom CSS vars and styles go here */
+`
+```
+
+There's a bunch of "base" CSS vars we can modify that will affect how the `TokenInput` component looks, and they should be self-explanatory, but you can check the component's documentation for more info. For example:
+
+```tsx
+ --base-token-input-border-radius
+ --base-token-input-padding
+ --base-token-input-gap
+```
+
+Let's say we want straight corners and a bit more padding. We can change the `--base-token-input-border-radius` and `--base-token-input-padding` vars like this:
+
+```tsx
+const CustomTokenInput = styled(TokenInput)`
+ --base-token-input-border-radius: 0;
+ --base-token-input-padding: 20px;
+`
+```
+
+That and the previous changes will give us something like this:
+
+
+
+Neat, huh? You can experiment with the [rest of TokenInput's CSS vars](https://github.com/BootNodeDev/dAppBooster/blob/0cac08c86299da9c8ab147de29f0f972069f4177/src/components/sharedComponents/TokenInput/index.tsx#L72) to see what you can achieve.
+
+## That's fine and all, but I want to change the component even more...
+
+You can always extend the components using Styled Components. For example, let's say you want to change `TokenInput` to center it on the screen. In our example that's very easy to do, we only need to add `margin: auto` to the component's wrapper. Here's how you can do it:
+
+```tsx
+import styled from 'styled-components'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+
+const CustomTokenInput = styled(TokenInput)`
+ /* Applies to component's wrapper */
+ margin: auto;
+`
+```
+
+And that's it! Now the component is centered.
+
+## What about the internal components and everything not covered by CSS vars?
+
+One way you can go about this is extending the component as we did in the previous example and styling the internal components using each component's class name. For example:
+
+```tsx
+import styled from 'styled-components'
+
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+
+const CustomTokenInput = styled(TokenInput)`
+ /* Title */
+ .tokenInputTitle {
+ font-size: 18px;
+ font-weight: 700;
+ padding-bottom: 8px;
+ }
+
+ /* Input component */
+ .tokenInputTextfield {
+ font-size: 20px;
+ }
+`
+```
+
+That will result in the following:
+
+
+
+Finally, the last way you can do this (and my favorite!) is to dig into the [components code](https://github.com/BootNodeDev/dAppBoosterBasicStyling/tree/0cac08c86299da9c8ab147de29f0f972069f4177/src/components/sharedComponents) and modify it as you please. It's all there, so the sky and your skills are the limit.
+
+**And remember:** if you want to contribute to the project, fix bugs, add features, etc. you can always [create a PR](https://github.com/BootNodeDev/dAppBooster/blob/develop/CONTRIBUTING.md) with your changes!
\ No newline at end of file
diff --git a/docs/pages/styling/integration.mdx b/docs/pages/styling/integration.mdx
new file mode 100644
index 00000000..100b10ff
--- /dev/null
+++ b/docs/pages/styling/integration.mdx
@@ -0,0 +1,73 @@
+# Integration with other libraries
+
+## Overview
+
+Our CSS engineers have been working hard to provide you with a minimalistic set of components and styles useful for your future dApps (you have to understand: they LOVE their raw CSS and creating everything from scratch). But - as they say- with great power comes great responsibility...
+
+dAppBooster provides the **bare minimum** you need to create a dApp, no more, no less. But we understand that you may want to use other libraries to expand the functionality in your project, so in this guide we will show you how to integrate [Chakra UI](https://v2.chakra-ui.com/) with dAppBooster.
+
+We consider Chakra UI to be a great choice for styling your dApps, as it provides a set of standard components and tools and it's also compatible with React's and Styled Components' philosophy.
+
+## Let's get started
+
+:::info
+**Tip:** a complete demo with the results of this guide can be found in the https://github.com/BootNodeDev/dAppBoosterBasicStyling/tree/ChakraUI fork of the dAppBooster repository.
+:::
+
+First, you need to install Chakra UI in your project. You can do this by following the instructions in the [official documentation](https://v2.chakra-ui.com/getting-started/vite-guide).
+
+Done? That's it! Now you can start using Chakra UI components in your dApps.
+
+## A simple example
+
+Let's go back to the example in the [Basic Styling](styling/basic-styling.mdx) guide. Let's say we want to center the TokenInput component in the middle of [the page](https://github.com/BootNodeDev/dAppBoosterBasicStyling/blob/ChakraUI/src/components/pageComponents/home/index.tsx) but this time using Chakra UI.
+
+First, we remove all of Styled Component's code and use the the default TokenInput import:
+
+```tsx
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+// the rest of the imports
+
+export const Home = () => {
+ // TokenInput's needed consts and values
+
+ return (
+
+ )
+}
+```
+
+Now we can use Chakra UI's `Center` component to center the TokenInput:
+
+```tsx
+import { Center } from '@chakra-ui/react'
+import TokenInput from '@/src/components/sharedComponents/TokenInput'
+// the rest of the imports
+
+export const Home = () => {
+ // TokenInput's needed consts and values
+
+ return (
+
+
+
+ )
+}
+```
+
+And that's it, the TokenInput component is now centered in the middle of the page withouth the need of any custom CSS!
+
+You can also check the [Header](https://github.com/BootNodeDev/dAppBoosterBasicStyling/blob/ChakraUI/src/components/sharedComponents/ui/Header.tsx) and [Footer](https://github.com/BootNodeDev/dAppBoosterBasicStyling/blob/ChakraUI/src/components/sharedComponents/ui/Footer.tsx) files to see these components styled with pure Chakra UI.
+
+:::info
+**Remember:** there's no need to do this, but it's there if you need it. You can use 100% Chakra UI, 100% Styled Components, or a mix of both. It's up to you!
+:::
+
+## But what about this or that styling library?
+
+We understand you may prefer some other styling library, but there are dozens if not hundreds of them out there. We can't cover them all, nor guarantee they will work with dAppBooster. Here's a few links you might find useful:
+
+- **Styled Components:** https://styled-components.com/docs
+- **How to combine Tailwind CSS with Styled Components:** https://www.siedykh.com/blog/how-to-combine-tailwind-css-with-styled-components
+- **styled2tailwind:** https://github.com/Blazity/styled2tailwind, transform your Styled-Components into TailwindCSS.
+- **W3 Schools:** https://www.w3schools.com/css/
\ No newline at end of file
diff --git a/docs/public/img/basic-css/1.jpg b/docs/public/img/basic-css/1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2ce307eae0f5be740107358df1b3be6eb2acc454
GIT binary patch
literal 35075
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
C3~^Wh
literal 0
HcmV?d00001
diff --git a/docs/public/img/basic-css/3.png b/docs/public/img/basic-css/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..38a2a9c5948f9ae901280218b4defef5c77a9e02
GIT binary patch
literal 36837
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