Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
423ec54
init
amatureApe Sep 13, 2023
725bbfd
fix exercise oPOP overflow
amatureApe Sep 13, 2023
4a21867
useLastUserVotes hook
amatureApe Sep 13, 2023
2a73d37
cleanup
amatureApe Sep 13, 2023
789f601
cleanup wip
amatureApe Sep 13, 2023
b14c181
remove async
amatureApe Sep 13, 2023
55f3fdb
Merge pull request #46 from amatureApe/feat/vepop-page-amatureApeTick…
RedVeil Sep 14, 2023
8f0f4c8
canVote
RedVeil Sep 14, 2023
427391d
Merge branch 'feat/vepop-page' into feat/gauge-apr
RedVeil Sep 16, 2023
2a1a2ee
Merge pull request #49 from Popcorn-Limited/feat/gauge-apr
RedVeil Sep 16, 2023
8469cdd
fixed build issue
RedVeil Sep 19, 2023
024f1bf
fixed empty votes
RedVeil Sep 19, 2023
90476f9
fixed hooks in gauges
RedVeil Sep 19, 2023
46fdcac
added console logs
RedVeil Sep 20, 2023
d372e6c
removed console logs
RedVeil Sep 20, 2023
764f810
vepop page uses NoSSR
RedVeil Sep 20, 2023
96d988b
wip - added weth claiming
RedVeil Sep 20, 2023
3c1b187
cleanup wETH rewards UI
amatureApe Sep 20, 2023
13e20fd
Merge pull request #52 from amatureApe/feat/vepop-page-amatureApeTick…
RedVeil Sep 22, 2023
a07a0d2
added getVeApy function
RedVeil Sep 22, 2023
c7ab04c
fixed useUserWethRewards
RedVeil Sep 22, 2023
b74189d
deployed on mainnet
RedVeil Oct 19, 2023
ff0b5a6
repalced chainId 5 with 1
RedVeil Oct 19, 2023
1416682
Merge branch 'main' into feat/vepop-page
RedVeil Oct 20, 2023
71636fb
merge cleanup
RedVeil Oct 23, 2023
642648a
added vepop to menus
RedVeil Oct 23, 2023
66010e3
fixed locking
RedVeil Oct 23, 2023
591fcdf
voting fixed
RedVeil Oct 23, 2023
8d122b7
update balances by block
RedVeil Oct 24, 2023
4e3f272
fixed decimals inputs
RedVeil Oct 24, 2023
dcd1e03
added custom time
RedVeil Oct 24, 2023
61ca8af
custom time for lock
RedVeil Oct 24, 2023
54989d8
removed ve rewards
RedVeil Oct 25, 2023
0466e10
vepop works still on other networks
RedVeil Oct 25, 2023
4f31342
vault oPop adjustments
RedVeil Oct 26, 2023
71533b3
OPOP interface
RedVeil Oct 27, 2023
e1ef714
wip - gaugeInteractions
RedVeil Nov 1, 2023
38d114a
checking cow for available zap assets
RedVeil Nov 1, 2023
f6ea8e5
added minor error handling, timeout and zap+router interactions
RedVeil Nov 2, 2023
5c13047
added zap settings
RedVeil Nov 2, 2023
f104b0c
zap settings
RedVeil Nov 2, 2023
4b9377e
zapping in working
RedVeil Nov 3, 2023
7ee4dde
zap out
RedVeil Nov 3, 2023
53ac29d
zap available design
RedVeil Nov 3, 2023
d87c169
using actual receiver
RedVeil Nov 3, 2023
b06d1cf
remove ohm-dai
RedVeil Nov 3, 2023
5746838
mutate page on normal actions
RedVeil Nov 3, 2023
c24b1de
hide yCRV
RedVeil Nov 7, 2023
2f1c685
wip - zapping
RedVeil Nov 7, 2023
7153da3
added vcx migration page
RedVeil Nov 9, 2023
a7e76a0
render when no address
RedVeil Nov 9, 2023
1a948a4
round inputs
RedVeil Nov 9, 2023
874575a
wip - using enso for zap assets
RedVeil Nov 9, 2023
5e489e4
wip - zap using enso
RedVeil Nov 9, 2023
2ba1275
zap demo
RedVeil Nov 10, 2023
385e623
enso wallet
RedVeil Nov 10, 2023
fac670e
zaps working
RedVeil Nov 10, 2023
f3fd9de
wip - logging
RedVeil Nov 10, 2023
fa031f0
zaps working?
RedVeil Nov 13, 2023
0f51544
zaps in and out working
RedVeil Nov 14, 2023
b394521
hide menu on link click
RedVeil Nov 14, 2023
e1cd514
zaps on other chains
RedVeil Nov 15, 2023
5bb3d0f
added action steps, loading vaults globally
RedVeil Nov 16, 2023
e6a77f1
minor style adjustment migration + handleAllowance fix
RedVeil Nov 16, 2023
bffd1e1
adjusted ActionStep colors
RedVeil Nov 16, 2023
79e7d83
renamed pop to vcx and using prod deployment
RedVeil Nov 21, 2023
f46931c
replaced gitbook link
RedVeil Nov 22, 2023
326dfe8
sorting + token metadata cleanup
RedVeil Nov 23, 2023
800f450
added migration link
RedVeil Nov 23, 2023
9e93e5e
contract addresses 1.0.5
RedVeil Nov 25, 2023
ce86689
updated balancer link
RedVeil Nov 27, 2023
d7bf79b
fixed vault inputs
RedVeil Nov 27, 2023
c0470f1
cVCX to oVCX
RedVeil Nov 27, 2023
0543fc0
update sdk to minor 17
RedVeil Nov 27, 2023
11cd6a1
added zap assets for op
RedVeil Nov 28, 2023
d9540b6
fixed typing issue
RedVeil Nov 28, 2023
407f8ab
added bridged usdc to op
RedVeil Nov 28, 2023
4e1bdb8
removed hop arb vaults
RedVeil Nov 28, 2023
c67b97f
removed FeeDistributor
RedVeil Nov 29, 2023
fd292aa
fixed some token icons, removed bsc as supported network
RedVeil Nov 29, 2023
0129531
fixed usdt approval
RedVeil Nov 29, 2023
9591908
adjusted stats subtitle
RedVeil Nov 29, 2023
8af9499
updated redeployed addresses
RedVeil Nov 29, 2023
46ae006
updated social-links
RedVeil Nov 30, 2023
06baa41
filter broken gauge
RedVeil Dec 1, 2023
6573dbc
using mim yearn instead of mim beefy
RedVeil Dec 1, 2023
0b65133
now replaced mim vault
RedVeil Dec 1, 2023
8f0571a
reading apy from defi-db
RedVeil Dec 1, 2023
ac75cd6
sorting shows apy instead of apr
RedVeil Dec 1, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
RPC_URL=
PINATA_API_SECRET=
PINATA_API_KEY=
PINATA_JWT=
IPFS_URL=
DUNE_API_KEY=
ALCHEMY_API_KEY=
ENSO_API_KEY=
14 changes: 5 additions & 9 deletions components/SocialMediaLinks.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
import DiscordIcon from "@/components/svg/socialMedia/DiscordIcon";
import MediumIcon from "@/components/svg/socialMedia/MediumIcon";
import RedditIcon from "@/components/svg/socialMedia/RedditIcon";
import TelegramIcon from "@/components/svg/socialMedia/TelegramIcon";
import TwitterIcon from "@/components/svg/socialMedia/TwitterIcon";
import YoutubeIcon from "@/components/svg/socialMedia/YoutubeIcon";

export default function SocialMediaLinks() {
return <>
<a href="https://twitter.com/Popcorn_DAO">
<a href="https://twitter.com/VaultCraft_io" target="_blank">
<TwitterIcon color={"#645F4B"} size={"24"} />
</a>
<a href="https://discord.gg/NYgNA6wv">
<a href="https://discord.gg/ujxSKu2H" target="_blank">
<DiscordIcon color={"#645F4B"} size={"24"} />
</a>
<a href="https://t.me/popcorndaochat">
<TelegramIcon color={"#645F4B"} size={"24"} />
</a>
<a href="https://medium.com/popcorndao">
<a href="https://medium.com/popcorndao" target="_blank">
<MediumIcon color={"#645F4B"} size={"24"} />
</a>
<a href="https://www.reddit.com/r/popcorndao/">
<a href="https://www.reddit.com/r/popcorndao/" target="_blank">
<RedditIcon color={"#645F4B"} size={"24"} />
</a>
<a href="https://www.youtube.com/channel/UCe8n8mGG4JR7nhFT4v9APyA">
<a href="https://www.youtube.com/channel/UCe8n8mGG4JR7nhFT4v9APyA" target="_blank">
<YoutubeIcon color={"#645F4B"} size={"24"} />
</a>
</>
Expand Down
4 changes: 2 additions & 2 deletions components/button/PseudoRadioButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ interface PseudoRadioButtonProps {
extraClasses?: string;
}

export default function PseudoRadioButton({ label, handleClick, isActive, activeClass, extraClasses, }: PseudoRadioButtonProps): JSX.Element {
export default function PseudoRadioButton({ label, handleClick, isActive, activeClass, extraClasses}: PseudoRadioButtonProps): JSX.Element {
return (
<button
className={`leading-8 ${extraClasses ? extraClasses : "py-2 px-3 h-12 border w-full rounded-lg text-lg"} ${isActive ? `${activeClass ? activeClass : "border-1 border-tokenTextGray"}` : "border-customLightGray"
className={`leading-8 ${extraClasses ? extraClasses : "py-2 px-3 h-12 border w-full rounded-lg text-lg"} ${isActive ? `${activeClass ? activeClass : "border-1 border-tokenTextGray"}` : "border-customLightGray"
}`}
type="button"
onClick={() => handleClick()}
Expand Down
29 changes: 7 additions & 22 deletions components/button/SecondaryActionButton.tsx
Original file line number Diff line number Diff line change
@@ -1,30 +1,15 @@
import RightArrowIcon from "@/components/svg/RightArrowIcon";
import React, { useState } from "react";
import { ButtonProps } from "@/components/button/MainActionButton";

export default function SecondaryActionButton({ label, handleClick, hidden, disabled = false }: ButtonProps): JSX.Element {
const [arrowColor, setArrowColor] = useState("645F4B");
const [arrowClass, setArrowClass] = useState("transform translate-x-0");

const animateArrow = () => {
setArrowColor("000000");
setArrowClass("transform -translate-x-1/2");
setTimeout(() => {
setArrowColor("645F4B");
setArrowClass("transform translate-x-0");
}, 500);
};
export default function SecondaryActionButton({ label, handleClick, disabled = false, hidden = false }: ButtonProps): JSX.Element {
return (
<button
className={`${hidden ? "hidden" : ""
} w-full flex justify-between items-center text-primary hover:text-black transition-all ease-in-out font-medium leading-4 md:leading-7 relative`}
onMouseEnter={animateArrow}
type="button"
className={`whitespace-nowrap px-8 py-3 font-medium text-base transition-all ease-in-out duration-500 w-full flex flex-row items-center justify-center bg-white border border-primary text-primary rounded-4xl hover:bg-primary hover:text-white disabled:bg-white disabled:border-secondaryLight disabled:text-secondaryLight disabled:hover:border-secondaryLight disabled:hover:text-secondaryLight disabled:hover:bg-white ${hidden ? "hidden" : ""
}`}
onClick={handleClick}
disabled={disabled}
>
<span>{label}</span>
<div className={`'absolute right-0 transition-all ease-in-out duration-500 ${arrowClass}`}>
<RightArrowIcon color={arrowColor} />
</div>
{label}
</button>
);
};
};
30 changes: 22 additions & 8 deletions components/button/TertiaryActionButton.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
import RightArrowIcon from "@/components/svg/RightArrowIcon";
import React, { useState } from "react";
import { ButtonProps } from "@/components/button/MainActionButton";

export default function TertiaryActionButton({ label, handleClick, disabled = false, hidden = false }: ButtonProps): JSX.Element {
export default function TertiaryActionButton({ label, handleClick, hidden, disabled = false }: ButtonProps): JSX.Element {
const [arrowColor, setArrowColor] = useState("645F4B");
const [arrowClass, setArrowClass] = useState("transform translate-x-0");

const animateArrow = () => {
setArrowColor("000000");
setArrowClass("transform -translate-x-1/2");
setTimeout(() => {
setArrowColor("645F4B");
setArrowClass("transform translate-x-0");
}, 500);
};
return (
<button
type="button"
className={`whitespace-nowrap px-8 py-3 font-medium text-base transition-all ease-in-out duration-500 w-full flex flex-row items-center justify-center bg-white border border-primary text-primary rounded-4xl hover:bg-primary hover:text-white disabled:bg-white disabled:border-secondaryLight disabled:text-secondaryLight disabled:hover:border-secondaryLight disabled:hover:text-secondaryLight disabled:hover:bg-white ${hidden ? "hidden" : ""
}`}
className={`${hidden ? "hidden" : ""
} w-full flex justify-between items-center text-primary hover:text-black transition-all ease-in-out font-medium leading-4 md:leading-7 relative`}
onMouseEnter={animateArrow}
onClick={handleClick}
disabled={disabled}
>
{label}
<span>{label}</span>
<div className={`'absolute right-0 transition-all ease-in-out duration-500 ${arrowClass}`}>
<RightArrowIcon color={arrowColor} />
</div>
</button>
);
};

};
2 changes: 1 addition & 1 deletion components/common/TokenIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ export default function TokenIcon({
return <img src={icon} alt="token icon" className={imageSize ? imageSize : "w-6 md:w-10 h-6 md:h-10"} />
}
return (
<img src={"/images/icons/POP.svg"} alt="token icon" className={imageSize ? imageSize : "w-6 md:w-10 h-6 md:h-10"} />
<img src={"/images/tokens/pop.svg"} alt="token icon" className={imageSize ? imageSize : "w-6 md:w-10 h-6 md:h-10"} />
);
}
2 changes: 1 addition & 1 deletion components/input/InputTokenWithError.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export default function InputTokenWithError({
</svg>
</div>
<p className="text-secondaryLight group-hover/max:text-primary mb-2.5">
{`${formatNumber(Number(selectedToken?.balance) / (10 ** (selectedToken?.decimals as number)))}`}
{`${formatNumber(Number(selectedToken?.balance) / (10 ** (selectedToken?.decimals as number)))}`}
</p>
</>}
</div>
Expand Down
24 changes: 15 additions & 9 deletions components/landing/Hero.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import StatusWithLabel from "@/components/common/StatusWithLabel";
import { Networth, getTotalNetworth } from "@/lib/getNetworth";
import { vaultsAtom } from "@/lib/atoms/vaults";
import { Networth, getTotalNetworth, getVaultNetworthByChain } from "@/lib/getNetworth";
import { SUPPORTED_NETWORKS } from "@/lib/utils/connectors";
import { NumberFormatter } from "@/lib/utils/formatBigNumber";
import { useAtom } from "jotai";
import { useEffect, useState } from "react";
import { useAccount } from "wagmi";
import { Address, useAccount } from "wagmi";

export default function Hero(): JSX.Element {
const { address: account } = useAccount();
const [vaults] = useAtom(vaultsAtom)
const [networth, setNetworth] = useState<Networth>({ pop: 0, stake: 0, vault: 0, total: 0 });
const [tvl, setTvl] = useState<string>("0");
const [loading, setLoading] = useState<boolean>(true);
Expand All @@ -19,13 +23,15 @@ export default function Hero(): JSX.Element {
))
}, [])


useEffect(() => {
if (account && loading)
// fetch and set networth
getTotalNetworth({ account }).then(res => {
setNetworth(res.total);
setLoading(false);
});
async function fetchNetworth() {
const vaultNetworth = SUPPORTED_NETWORKS.map(chain => getVaultNetworthByChain({ vaults, chainId: chain.id })).reduce((a, b) => a + b, 0)
const totalNetworth = await getTotalNetworth({ account: account as Address })
setNetworth({ ...totalNetworth.total, vault: vaultNetworth, total: totalNetworth.total.total + vaultNetworth });
setLoading(false);
}
if (account && loading && vaults.length > 0) fetchNetworth()
}, [account]);


Expand All @@ -43,7 +49,7 @@ export default function Hero(): JSX.Element {
content={<p className="text-3xl font-bold text-black">$ {loading ? "..." : NumberFormatter.format(networth.stake)}</p>}
/>
<StatusWithLabel
label={"POP in Wallet"}
label={"VCX in Wallet"}
content={<p className="text-3xl font-bold text-black">$ {loading ? "..." : NumberFormatter.format(networth.pop)}</p>}
/>
</div>
Expand Down
4 changes: 2 additions & 2 deletions components/landing/Products.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ export default function Products(): JSX.Element {
</>
}
customContent={<SmileyIcon size={"60"} color={"black"} className="group-hover:fill-[#C391FF]" />}
description="Lock stake your POP LP to boost your rewards with call options on POP"
description="Lock stake your VCX LP to boost your rewards with call options on VCX"
stats={[
{
label: "TVL",
content: <p>Coming soon</p>,
},
]}
route=""
route="boost"
/>
<Product
title={
Expand Down
2 changes: 1 addition & 1 deletion components/navbar/DesktopMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export default function DesktopMenu(): JSX.Element {
<img src="/images/icons/popLogo.svg" alt="Logo" className="w-10 h-10" />
</Link>
</div>
<div className="flex flex-col space-y-6 pb-12">
<div className="flex flex-col space-y-6 pb-12" onClick={() => toggleMenu(false)}>
<NavbarLinks />
</div>
<div>
Expand Down
7 changes: 1 addition & 6 deletions components/navbar/MobileMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,7 @@ export default function MobileMenu(): JSX.Element {
const closePopUp = () => {
setShowPopUp(false);
};

function handleCloseAll() {
toggleMenu(false);
toggleProductsMenu(false);
}


return (
<>
<div className={`flex flex-row justify-between items-center py-6 font-khTeka ${router.pathname === "/" ? "bg-[#FAF9F4]" : ""}`}>
Expand Down
10 changes: 9 additions & 1 deletion components/navbar/NavbarLinks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,21 @@ import NavbarLink from "@/components/navbar/NavbarLink"

const links: { label: string, url: string, onClick?: Function }[] = [
{
label: "Vaults",
label: "Smart Vaults",
url: "/vaults",
},
{
label: "Boost Vaults",
url: "/boost",
},
{
label: "Stats",
url: "/stats"
},
{
label: "Pop to VCX Migration",
url: "/migration"
},
{
label: "VaultCraft",
url: "https://vaultcraft.io/",
Expand Down
2 changes: 1 addition & 1 deletion components/page/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ const GeneralLinks = [
},
{
label: "Gitbook",
href: "https://popcorn-dao.gitbook.io/popcorndao-gitbook/about-popcorn/welcome-to-popcorn",
href: "https://docs.vaultcraft.io/welcome-to-vaultcraft/introduction",
},
{
label: "Disclaimer",
Expand Down
24 changes: 20 additions & 4 deletions components/page/Page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,46 @@ import Navbar from "@/components/navbar/NavBar";
import { useAtom } from "jotai";
import { yieldOptionsAtom } from "@/lib/atoms/sdk";
import { CachedProvider, YieldOptions } from "vaultcraft-sdk";
import { SUPPORTED_NETWORKS } from "@/lib/utils/connectors";
import { getVaultsByChain } from "@/lib/vault/getVault";
import { vaultsAtom } from "@/lib/atoms/vaults";
import { useAccount } from "wagmi";

async function setUpYieldOptions() {
const ttl = 360_000;
const provider = new CachedProvider();
await provider.initialize("https://raw.githubusercontent.com/Popcorn-Limited/apy-data/main/apy-data.json");
await provider.initialize("https://raw.githubusercontent.com/Popcorn-Limited/defi-db/main/apy-data.json");

return new YieldOptions(provider, ttl);
return new YieldOptions({ provider, ttl });
}

export default function Page({ children }: { children: JSX.Element }): JSX.Element {
const { pathname } = useRouter();
const { address: account } = useAccount()

const [yieldOptions, setYieldOptions] = useAtom(yieldOptionsAtom)
const [, setVaults] = useAtom(vaultsAtom)

useEffect(() => {
if (!yieldOptions) {
setUpYieldOptions().then((res: any) => setYieldOptions(res))
}
}, [])

useEffect(() => {
async function getVaults() {
// get vaults
const fetchedVaults = (await Promise.all(
SUPPORTED_NETWORKS.map(async (chain) => getVaultsByChain({ chain, account, yieldOptions: yieldOptions as YieldOptions }))
)).flat();
setVaults(fetchedVaults)
}
if (yieldOptions) getVaults()
}, [account, yieldOptions])

return (
<>
<TermsCheck />
<div className="w-full mx-auto min-h-screen h-full font-khTeka flex flex-col justify-between">
<div className="w-full mx-auto min-h-screen h-full font-khTeka flex flex-col justify-between">
<NoSSR>
<Navbar />
</NoSSR>
Expand Down
12 changes: 12 additions & 0 deletions components/svg/SwitchIcon.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { IconProps } from "@/lib/types"


const SwitchIcon: React.FC<IconProps> = ({ className, color, size}) => {
return (
<svg xmlns="http://www.w3.org/2000/svg" width={size} viewBox="0 0 21 20" fill="none" className={className}>
<path d="M6.33333 13.3334V3.33337M6.33333 3.33337L3 6.66671M6.33333 3.33337L9.66667 6.66671M14.6667 6.66671V16.6667M14.6667 16.6667L18 13.3334M14.6667 16.6667L11.3333 13.3334" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
</svg>
)
}

export default SwitchIcon;
35 changes: 35 additions & 0 deletions components/vault/ActionSteps.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { ActionStep } from "@/lib/vault/getActionSteps"
import { XMarkIcon } from "@heroicons/react/24/outline"

function getStepColor(preFix: string, step: any): string {
if (step.loading || step.success) return `${preFix}-green-500`
if (step.error) return `${preFix}-red-500`
return `${preFix}-warmGray`
}

interface ActionStepsProps {
steps: ActionStep[];
stepCounter: number;
}

export default function ActionSteps({ steps, stepCounter }: ActionStepsProps): JSX.Element {
return (
<div className="flex flex-row items-center">
{
steps.map((step, i) => <>
<div
key={step.label}
className={`w-8 h-8 rounded-full border leading-none flex justify-center items-center cursor-default bg-opacity-40
${i === stepCounter ? "border-[#FFE650] bg-[#FFE650]" : `${getStepColor("border", step)} ${getStepColor("bg", step)}`}`}
>
{step.loading && <img src="/images/loader/puff.svg" className={`h-6 w-6 text-primaryLight`} />}
{!step.loading && step.error && <XMarkIcon className="h-4 w-4 text-red-500" />}
{!step.loading && step.success && <img src="/images/icons/checkIcon.svg" className={`h-4 w-4`} />}
{!step.loading && !step.error && !step.success && <div className={`rounded-full h-3 w-3 ${i === stepCounter ? "bg-[#FFE650]" : "bg-primaryLight bg-opacity-80"}`} />}
</div>
{step.step < steps.length && <p className={`mb-3 tracking-none text-primaryLight`}>________</p>}
</>)
}
</div>
)
}
Loading