From 01810c78511679be8d0b90836e5e6e67d7135ed6 Mon Sep 17 00:00:00 2001 From: folathecoder Date: Mon, 21 Aug 2023 15:15:57 +0100 Subject: [PATCH 01/28] Integrated rainbowkit for wallet connection --- .env | 3 +- package.json | 10 +- src/components/global/header/header.tsx | 19 +- src/pages/_app.tsx | 28 +- src/wallet/walletConfig.ts | 54 ++-- src/wallet/walletInfo.tsx | 18 ++ yarn.lock | 335 ++++++++++++++++++++---- 7 files changed, 370 insertions(+), 97 deletions(-) create mode 100644 src/wallet/walletInfo.tsx diff --git a/.env b/.env index 061ae37..3d55265 100644 --- a/.env +++ b/.env @@ -1,6 +1,7 @@ -WALLET_CONNECT_CLOUD_KEY=201547027406abdbd2521d63a4c827af +NEXT_PUBLIC_WALLET_CONNECT_CLOUD_KEY=201547027406abdbd2521d63a4c827af GRAPHCMS_ENDPOINT=https://eu-west-2.cdn.hygraph.com/content/clksg8cbu032s01t2edsagg9w/master NEXT_PUBLIC_FRONTEND_URL=https://crowdlaunch.vercel.app NEXT_PUBLIC_BACKEND_URL=https://crowdlaunch-backend.fly.dev NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=ddfjqustf NEXT_PUBLIC_CLOUDINARY_API_KEY=928737954645779 +NEXT_PUBLIC_ALCHEMY_API_KEY=9xeTvkkpEiR-PXbo-NmV12O3BkNWixrk diff --git a/package.json b/package.json index 919e01d..c6f2a17 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "@mui/material": "^5.13.6", "@mui/styled-engine-sc": "^5.12.0", "@openzeppelin/contracts": "^4.9.3", + "@rainbow-me/rainbowkit": "^1.0.8", + "@rainbow-me/rainbowkit-siwe-next-auth": "^0.3.0", "@reduxjs/toolkit": "^1.9.5", "@types/draft-js": "^0.11.12", "@types/node": "20.3.1", @@ -31,7 +33,7 @@ "draft-js": "^0.11.7", "eslint": "8.43.0", "eslint-config-next": "13.4.7", - "ethers": "^6.6.0", + "ethers": "^5", "framer-motion": "^10.12.18", "graphql": "^16.7.1", "graphql-request": "^6.1.0", @@ -41,6 +43,7 @@ "lodash.debounce": "^4.0.8", "moment": "^2.29.4", "next": "13.4.7", + "next-auth": "^4.23.1", "next-cloudinary": "^4.18.0", "next-image-loader": "^3.0.0", "next-redux-wrapper": "^8.1.0", @@ -62,13 +65,14 @@ "react-tilt": "^1.0.2", "react-use": "^17.4.0", "sharp": "^0.32.3", + "siwe": "^2", "slate": "^0.94.1", "slate-react": "^0.97.2", "styled-components": "^6.0.1", "typescript": "5.1.3", "use-clipboard-copy": "^0.2.0", - "viem": "^1.1.4", - "wagmi": "^1.2.1" + "viem": "^1.6.4", + "wagmi": "^1.3.10" }, "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^3.0.0", diff --git a/src/components/global/header/header.tsx b/src/components/global/header/header.tsx index b9af8c5..eda1fb2 100644 --- a/src/components/global/header/header.tsx +++ b/src/components/global/header/header.tsx @@ -23,17 +23,16 @@ import useWallet from '@/wallet/useWallet'; import Lottie from 'react-lottie'; import { ProfileSettings } from '@/components/profile'; import { CroppedImage } from '@/components/global'; +import { useConnectModal } from '@rainbow-me/rainbowkit'; const Header = () => { + const { openConnectModal } = useConnectModal(); + const { user, crop } = useContext(AppContext) as AppContextReturnTypes; const { wallet } = useWallet(); const { open } = useWeb3Modal(); - const openWalletConnectionModal = async () => { - await open(); - }; - const [showMobileMenu, setShowMobileMenu] = useState(false); const [showUserMenu, setShowUserMenu] = useState(false); @@ -102,11 +101,13 @@ const Header = () => { )} ) : ( - + + + ); +}; + +const WalletWithdrawCard = () => { + const [withdrawal, setWithdrawal] = useState({ + message: '', + amount: '', + }); + + const handleInputChange = (e: React.ChangeEvent) => { + const { value, name } = e.target; + + setWithdrawal((prevState) => ({ ...prevState, [name]: value })); + }; + return ( + +
+

Withdraw

+

+ Ensure you are connected to that wallet address that has the correct + authorisation to withdraw funds from this wallet. +

+
+
+
+ + + + +
+
+
+ {false && ( +
+

Transaction message:

+ {/*

Withdrawal successful

*/} +

+ Wallet address does not have the required authorisation to + withdraw funds from this wallet. +

+ {/*

+ This wallet does not have sufficient balance to complete this + transaction. +

*/} +
+ )} +
+ +
+
+ locked +
+
+
+ ); +}; + +// Deposit, Withdraw, Dividend +const AllTransactions = () => { + return ( + +

Transactions

+ {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((transaction) => ( +
  • +
    +
    +
    + deposit +
    +
    +

    Deposit

    +
    +
    +

    1,200 {CURRENCY_SYMBOL}

    +
    +
    +
    +

    + Lorem ipsum dolor sit amet consectetur adipisicing elit. +

    +
    +
    +
    +

    12 Sept, 2023

    +
    +
  • + ))} +
    + ); +}; + +export default Wallet; diff --git a/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts b/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts new file mode 100644 index 0000000..b33ee45 --- /dev/null +++ b/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts @@ -0,0 +1,247 @@ +import styled from 'styled-components'; +import { QUERIES } from '@/styles/mediaQueries'; + +export const WalletSection = styled.section` + margin-block: 2.62rem 1.84rem; + width: 100%; + + h2 { + font-size: 1.5rem; + } +`; + +export const WalletContainer = styled.div``; + +export const WalletInfo = styled.div` + display: grid; + gap: 1rem; + grid-template-columns: 1fr; + margin: 1rem 0rem; + + @media ${QUERIES.tablet} { + grid-template-columns: repeat(2, 1fr); + } +`; + +export const WalletInfoCard = styled.div` + min-height: 92px; + width: 100%; + border-radius: 0.5rem; + display: flex; + align-items: center; + padding: 0rem 1rem; + background-color: var(--color-bg-300); + + h3 { + font-size: 14px; + font-weight: 500; + color: var(--color-font-300); + cursor: pointer; + + span { + margin-left: 0.4rem; + } + + svg { + transform: translateY(0.1rem); + } + } + + h4 { + font-size: 30px; + font-weight: 700; + color: var(--color-font-100); + } +`; + +export const WalletTransaction = styled.div` + display: grid; + width: 100%; + /* min-height: 10rem; */ + grid-template-columns: 1fr; + gap: 1rem; + + h3 { + margin-bottom: 1rem; + text-decoration: underline; + text-decoration: underline; + text-decoration-color: var(--color-accent-100); + text-decoration-skip-ink: none; + text-underline-offset: 10px; + } + + @media ${QUERIES.tablet} { + grid-template-columns: repeat(2, 1fr); + } +`; + +export const WalletDeposit = styled.div` + border-radius: 0.5rem; + background-color: var(--color-bg-300); + width: 100%; + min-height: 10rem; + padding: 1rem; + display: flex; + flex-direction: column; + gap: 1rem; + + ol { + margin: 0.4rem; + + li { + font-weight: 400; + list-style-type: decimal; + margin-left: 1rem; + padding-left: 0.2rem; + line-height: 1.5rem; + color: var(--color-font-200); + } + } + + .qrcode { + display: grid; + place-items: center; + + canvas { + width: 250px !important; + height: 250px !important; + background-color: white !important; + padding: 1rem; + border-radius: 0.5rem; + } + } + + .copy { + display: flex; + justify-content: center; + + button { + cursor: pointer; + background-color: var(--color-bg-400); + padding: 0.3rem 0.8rem; + color: var(--color-font-500); + border: transparent; + border-radius: 1rem; + + span { + margin-left: 0.2rem; + + svg { + transform: translateY(0.1rem); + } + } + } + } +`; + +export const WalletWithdraw = styled.div` + border-radius: 0.5rem; + background-color: var(--color-bg-300); + width: 100%; + min-height: 10rem; + padding: 1rem; + display: flex; + flex-direction: column; + gap: 1rem; + position: relative; + + input { + width: 100%; + height: 50px; + padding: 10px; + border-radius: 0.5rem; + border: 0.1rem solid var(--color-border-100); + background-color: var(--color-bg-200); + color: var(--color-font-100); + margin: 1rem 0rem; + font-weight: 500; + + &:active { + outline: 0.1rem solid var(--color-accent-100); + } + + &:focus { + outline: 0.1rem solid var(--color-border-100); + } + + &:hover { + outline: 0.1rem solid var(--color-border-100); + } + } + + .button_container { + display: flex; + justify-content: flex-end; + padding: 1rem 0rem; + } + + .withdraw_message { + background-color: var(--color-bg-500); + border: 0.1rem solid var(--color-border-100); + padding: 1rem; + border-radius: 0.5rem; + + p:first-of-type { + color: var(--color-accent-100); + } + } + + .access { + background-color: hsla(218, 80%, 2%, 0.8); + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + border: 0.1rem solid var(--color-border-100); + border-radius: 0.5rem; + display: grid; + place-items: center; + } +`; + +export const Transactions = styled.ul` + border-radius: 0.5rem; + background-color: var(--color-bg-300); + width: 100%; + min-height: 10rem; + padding: 1rem; + display: flex; + flex-direction: column; + flex-wrap: wrap; + gap: 1rem; + margin-top: 1rem; + + li { + border-bottom: 0.1rem solid var(--color-border-100); + padding-bottom: 1rem; + display: flex; + gap: 1rem; + justify-content: space-between; + flex-wrap: wrap; + flex-direction: column; + + @media ${QUERIES.tablet} { + flex-direction: row; + } + } + + .txn_msg { + margin-top: 0.8rem; + } + + .tnx_header { + display: flex; + align-items: center; + gap: 1rem; + flex-wrap: wrap; + } + + .txn_amount { + text-decoration: underline; + text-decoration: underline; + text-decoration-color: var(--color-accent-100); + text-decoration-skip-ink: none; + text-underline-offset: 5px; + } +`; diff --git a/yarn.lock b/yarn.lock index 3c8b058..33ef5b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1200,7 +1200,7 @@ source-map "^0.5.7" stylis "4.2.0" -"@emotion/cache@^11.11.0": +"@emotion/cache@*", "@emotion/cache@^11.11.0": version "11.11.0" resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== @@ -1259,7 +1259,7 @@ "@emotion/weak-memoize" "^0.3.1" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.2": +"@emotion/serialize@*", "@emotion/serialize@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== @@ -1297,7 +1297,7 @@ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== -"@emotion/utils@^1.2.1": +"@emotion/utils@*", "@emotion/utils@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== @@ -6581,6 +6581,11 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbarcode@^3.8.0: + version "3.11.5" + resolved "https://registry.yarnpkg.com/jsbarcode/-/jsbarcode-3.11.5.tgz#390b3efd0271f35b9d68c7b8af6e972445969014" + integrity sha512-zv3KsH51zD00I/LrFzFSM6dst7rDn0vIMzaiZFL7qusTjPZiPtxg3zxetp0RR7obmjTw4f6NyGgbdkBCgZUIrA== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -7808,6 +7813,11 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +qrcode.react@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" + integrity sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q== + qrcode@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.0.tgz#95abb8a91fdafd86f8190f2836abbfc500c72d1b" @@ -7949,6 +7959,14 @@ react-3d-viewer@^1.0.12: react-scroll-up "^1.3.3" three "^0.95.0" +react-barcode@^1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/react-barcode/-/react-barcode-1.4.6.tgz#a2ffd8717d1b7df6b482872f1692020c235463a0" + integrity sha512-56WCPqjgpExPVi5LgKOfxM6uSCB4Wd1r94jY2VEwkIdigPjLp8P9RyIBIyQmDraxtYGOHE0e4Uer4+QrmOIy7Q== + dependencies: + jsbarcode "^3.8.0" + prop-types "^15.6.2" + react-colorful@^5.6.1: version "5.6.1" resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" @@ -9187,6 +9205,15 @@ tsort@0.0.1: resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== +tss-react@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/tss-react/-/tss-react-4.9.0.tgz#1457e14e89f1c4a033b697f866439f5921c923d8" + integrity sha512-dgqNSR9J0+NxvdwzXoKo2HxGGu2sg0UikLnPumGNLa9CSPVcL6ZNu23CJwxPaMvRnQC8NRyNbUN3pBCS9AWwRA== + dependencies: + "@emotion/cache" "*" + "@emotion/serialize" "*" + "@emotion/utils" "*" + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" From 978b68fa0197559253acf3e133ed864723f0b677 Mon Sep 17 00:00:00 2001 From: folathecoder Date: Sat, 26 Aug 2023 07:48:17 +0100 Subject: [PATCH 11/28] Implemented smart contract and generate ABI --- .../Children/MiniChildren/Wallet/Wallet.tsx | 88 +- .../MiniChildren/Wallet/WalletStyles.ts | 29 +- src/contracts/CrowdLaunchContract.sol | 529 ---------- src/contracts/NFTMarketplaceContract.sol | 250 ----- src/contracts/abi/accountContractABI.json | 134 +++ src/contracts/abi/crowdfundContractABI.json | 919 ++++++++++++++++++ src/contracts/campaignContract.sol | 82 ++ src/contracts/cccountContract.sol | 56 ++ src/contracts/constants/contractInfo.ts | 1 + src/contracts/crowdfundContract.sol | 100 ++ src/contracts/dividendContract.sol | 44 + src/contracts/enums/globalEnums.sol | 29 + src/contracts/interfaces/IAccountContract.sol | 9 + src/contracts/interfaces/ICrowdfunding.sol | 9 + src/contracts/marketplaceContract.sol | 41 + src/contracts/structs/globalStructs.sol | 92 ++ src/contracts/userContract.sol | 40 + 17 files changed, 1659 insertions(+), 793 deletions(-) delete mode 100644 src/contracts/CrowdLaunchContract.sol delete mode 100644 src/contracts/NFTMarketplaceContract.sol create mode 100644 src/contracts/abi/accountContractABI.json create mode 100644 src/contracts/abi/crowdfundContractABI.json create mode 100644 src/contracts/campaignContract.sol create mode 100644 src/contracts/cccountContract.sol create mode 100644 src/contracts/constants/contractInfo.ts create mode 100644 src/contracts/crowdfundContract.sol create mode 100644 src/contracts/dividendContract.sol create mode 100644 src/contracts/enums/globalEnums.sol create mode 100644 src/contracts/interfaces/IAccountContract.sol create mode 100644 src/contracts/interfaces/ICrowdfunding.sol create mode 100644 src/contracts/marketplaceContract.sol create mode 100644 src/contracts/structs/globalStructs.sol create mode 100644 src/contracts/userContract.sol diff --git a/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx b/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx index 887062c..8c0e53a 100644 --- a/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx +++ b/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx @@ -1,4 +1,8 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, useContext } from 'react'; +import { + ProjectDetailContext, + ProjectDetailContextReturnTypes, +} from '@/contexts/ProjectDetailContext'; import Image from 'next/image'; import { useClipboard } from 'use-clipboard-copy'; import { @@ -10,17 +14,17 @@ import { WalletDeposit, WalletWithdraw, Transactions, + WalletDividend, } from './WalletStyles'; -import { Notification } from '@/components/global'; import { BsInfoCircle } from 'react-icons/bs'; import { BiCopy } from 'react-icons/bi'; import Tooltip from '@mui/material/Tooltip'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; -import { BarcodeGenerator } from '@/components/global'; +import { BarcodeGenerator, Button, Notification } from '@/components/global'; import { shortenWalletAddress } from '@/helpers/formatters'; -import { Button } from '@/components/global'; import DepositIcon from 'public/images/global/wallet/deposit-icon.png'; import LockIcon from 'public/images/global/wallet/lock.png'; +import useWallet from '@/wallet/useWallet'; const walletInfoData = { currentBalance: 'Current ETH balance in the wallet.', @@ -73,11 +77,12 @@ const Wallet = () => { description={walletInfoData.outstandingDividend} /> + - + {/* */} { }; const WalletWithdrawCard = () => { + const { wallet } = useWallet(); + const { project } = useContext( + ProjectDetailContext + ) as ProjectDetailContextReturnTypes; + const [withdrawal, setWithdrawal] = useState({ message: '', amount: '', @@ -173,6 +183,13 @@ const WalletWithdrawCard = () => { setWithdrawal((prevState) => ({ ...prevState, [name]: value })); }; + + const handleWithdraw = () => { + if (wallet.walletAddress === project?.project.projectWalletAddress) { + console.log('withdraw'); + } + }; + return (
    @@ -209,7 +226,7 @@ const WalletWithdrawCard = () => {
    {false && ( @@ -227,17 +244,22 @@ const WalletWithdrawCard = () => { )} - -
    -
    - locked -
    -
    + {wallet.walletAddress !== project?.project.projectWalletAddress && ( + +
    +
    + locked +
    +
    +
    + )}
    ); }; -// Deposit, Withdraw, Dividend const AllTransactions = () => { return ( @@ -271,4 +293,44 @@ const AllTransactions = () => { ); }; +const DividendDisbursement = () => { + const { wallet } = useWallet(); + const { project } = useContext( + ProjectDetailContext + ) as ProjectDetailContextReturnTypes; + + const handleDisburseDividend = () => { + if (wallet.walletAddress === project?.project.projectWalletAddress) { + console.log('disbursement'); + } + }; + + return ( + +
    +

    Disburse dividends to investors

    +
    +
    +
    + {wallet.walletAddress !== project?.project.projectWalletAddress && ( + +
    +
    + locked +
    +
    +
    + )} +
    + ); +}; + export default Wallet; diff --git a/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts b/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts index b33ee45..ee5ab7b 100644 --- a/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts +++ b/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts @@ -57,7 +57,6 @@ export const WalletInfoCard = styled.div` export const WalletTransaction = styled.div` display: grid; width: 100%; - /* min-height: 10rem; */ grid-template-columns: 1fr; gap: 1rem; @@ -245,3 +244,31 @@ export const Transactions = styled.ul` text-underline-offset: 5px; } `; + +export const WalletDividend = styled.div` + min-height: 92px; + width: 100%; + border-radius: 0.5rem; + display: flex; + align-items: center; + padding: 1rem; + background-color: var(--color-bg-300); + margin: 1rem 0rem; + justify-content: space-between; + gap: 2rem; + flex-wrap: wrap; + position: relative; + + .access { + background-color: hsla(218, 80%, 2%, 0.8); + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + border: 0.1rem solid var(--color-border-100); + border-radius: 0.5rem; + display: grid; + place-items: center; + } +`; diff --git a/src/contracts/CrowdLaunchContract.sol b/src/contracts/CrowdLaunchContract.sol deleted file mode 100644 index 6a0dbcd..0000000 --- a/src/contracts/CrowdLaunchContract.sol +++ /dev/null @@ -1,529 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 - -pragma solidity >=0.8.4 <0.9.0; - -contract CrowdLaunchContract { - address payable private _platformAddress; - uint256 private _campaignFee; - - event CampaignCreated( - address indexed creatorAddress, - uint256 campaignCount, - CampaignStatus status - ); - - event userCreated(address indexed userAddress, uint256 userId); - - /** - * @dev CampaignStatus Enum - * This enum represents the possible states of a crowdfunding campaign: - * - NotStarted: The campaign has been created but not yet started. - * - Active: The campaign is currently ongoing and accepting contributions. - * - Expired: The deadline for the campaign has passed without it reaching its funding goal. - * - Completed: The campaign has successfully reached its funding goal within the set deadline. - * - Cancelled: The campaign was cancelled before it could reach its conclusion. - */ - - enum CampaignStatus { - NotStarted, - Active, - Expired, - Completed, - Cancelled - } - - /** - * @dev Enum representing the status of a backer in a campaign. - * - Active: The backer still has funds invested in the campaign and has backer privileges, e.g. "Backer can vote". - * - Inactive: The backer has withdrawn all funds and is no longer eligible for dividends, e.g. "Backer cannot vote". - */ - - enum BackerStatus { - Active, - Inactive - } - - /** - * @dev Represents the status of a user in the system. - * - * @param Inactive - An inactive user is unregistered on the platform - * @param Active - An active user has full access to all functions they are authorized to use. - * @param Banned - A banned user has attempted to access critical functions that are out of their reach, - * such as accessing the campaign withdrawal function. After the first such attempt, they lose access to all functions in the contract. - */ - - enum UserStatus { - Inactive, - Active, - Banned - } - - /** - * @dev Represents a user in the system, who can be either a campaign creator or a backer. - * - * @param status - The current status of the user (represented by the UserStatus enum). - * @param userId - The unique identifier of the user for easy tracking. - * @param userAddress - The Ethereum address of the user, which allows for fund transfers. - * @param totalInvestedAmount - The total amount of funds that the user has contributed across all campaigns they have backed. - * @param totalDividendEarned - The total amount of dividends earned by the user from all campaigns they have backed. - * @param campaignsCreated - Array containing the campaigns created by the user. - * @param campaignsBacked - Array containing the campaigns backed by the user. - */ - - struct User { - UserStatus status; - uint256 userId; - address payable userAddress; - uint256 totalInvestedAmount; - uint256 totalDividendEarned; - uint256 campaignsCreatedCount; - uint256 campaignsBackedCount; - Campaign[] campaignsCreated; - Campaign[] campaignsBacked; - } - - /** - * @dev Represents a crowdfunding campaign. - * Each campaign has a status, a unique ID, a current and target funding amount, a deadline, - * minimum and maximum contribution limits, the creator's address, and an array of backers. - * - * @param status - The current status of the campaign (represented by the CampaignStatus enum). - * @param campaignId - The unique identifier of the campaign. - * @param raisedAmount - The total amount of funds currently raised in the campaign. - * @param targetAmount - The funding goal that the campaign aims to reach. - * @param targetDeadline - The timestamp (in seconds since Unix Epoch) by which the campaign aims to reach its funding goal. - * @param minFunding - The minimum contribution amount that a backer can contribute to the campaign. - * @param maxFunding - The maximum contribution amount that a backer can contribute to the campaign. - * @param creatorAddress - The Ethereum address of the user who created the campaign. - * @param backers - Array containing the backers who have contributed to the campaign. - */ - - struct Campaign { - CampaignStatus status; - uint256 campaignId; - uint256 raisedAmount; - uint256 targetAmount; - uint256 targetDeadline; - uint256 minFunding; - address payable creatorAddress; - uint256 backersCount; - Backer[] backers; - } - - /** - * @dev Represents a backer who supports a campaign by contributing funds. - * - * @param status - The current status of the backer (represented by the BackerStatus enum). - * @param backerId - The unique identifier of the backer for easy tracking. - * @param backerAddress - The Ethereum address of the backer, which allows for fund transfers. - * @param backedAmount - The total amount of funds that the backer has contributed to the campaign. - */ - - struct Backer { - BackerStatus status; - uint256 backerId; - address payable backerAddress; - uint256 backedAmount; - uint256 dividendAmount; - } - - mapping(uint256 => Campaign) private campaigns; - mapping(address => User) private users; - - uint256 private _campaignCount = 0; - uint256 private _userCount = 0; - - /** - * @dev Constructor Function - * This function is called once during the deployment of the contract. - * It initializes the _platformAddress state variable with the address of the contract deployer. - * The payable keyword allows this address to receive and transfer Ether. - * It also sets the _campaignFee state variable with the fee (in wei) required for creating a campaign. - * @param campaignFee - The fee (in Wei) required for creating a campaign. - */ - - constructor(uint256 campaignFee) { - _platformAddress = payable(msg.sender); - _campaignFee = campaignFee; - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // MODIFIERS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - modifier requireCampaignFee() { - require( - msg.value == _campaignFee, - "campaign creation fee is insufficient" - ); - _; - } - - modifier requireOnlyPlatform() { - require( - msg.sender == _platformAddress, - "only platform admin can call this function" - ); - _; - } - - modifier noBannedUser() { - require( - isUserBanned(msg.sender) == false, - "user is banned and cannot access this function" - ); - _; - } - - modifier requireRegisteredUser() { - require( - isUserRegistered(msg.sender), - "Only a registered and active user can call this function" - ); - _; - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // PLATFORM FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - /** - * @dev Retrieves the address of the crowdfunding platform. - * This function is a view function, meaning it does not modify the state of the contract. - * It allows external callers to query and view the address of the platform. - * - * @return The Ethereum address of the crowdfunding platform. - */ - - function getPlatformAddress() external view returns (address) { - return _platformAddress; - } - - /** - * @dev Sets the address of the crowdfunding platform. - * This function allows only the platform administrator to update the platform's address. - * To execute this function, the caller must be the current platform administrator. - * - * @param _newAddress The new Ethereum address to set as the crowdfunding platform address. - */ - - function setPlatformAddress( - address _newAddress - ) external requireOnlyPlatform { - _platformAddress = payable(_newAddress); - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // USER FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - /** - * @dev Checks if a user is registered in the system. - * - * This function accepts the Ethereum address of a user. It then retrieves the user's information from the 'users' mapping, - * and checks if the user's status is set to Active. If the status is 'Active', the function returns true; otherwise, it returns false. - * - * @param _userAddress - The Ethereum address of the user. - * @return A boolean value indicating whether the user is registered (Active or not. - */ - - function isUserRegistered( - address _userAddress - ) internal view returns (bool) { - return users[_userAddress].status == UserStatus.Active; - } - - /** - * @dev Checks if a user is banned in the system. - * - * This function accepts the Ethereum address of a user. It then retrieves the user's information from the 'users' mapping, - * and checks if the user's status is set to Banned. If the status is 'Banned', the function returns true; otherwise, it returns false. - * - * @param _userAddress - The Ethereum address of the user. - * @return A boolean value indicating whether the user is banned or not. - */ - - function isUserBanned(address _userAddress) internal view returns (bool) { - return users[_userAddress].status == UserStatus.Banned; - } - - /** - * @dev Bans a user from the platform. This function can only be called by the platform itself. - * If the user is not registered, they will be registered and then banned. - * - * @param _banAddress The address of the user to be banned. - * - * Requirements: - * - The user to be banned must not be the platform itself. - */ - - function banUser(address _banAddress) internal { - require( - _banAddress != _platformAddress, - "Platform address cannot be banned" - ); // prevent backfire attack - - if (isUserRegistered(_banAddress)) { - users[_banAddress].status = UserStatus.Banned; - } else { - _userCount += 1; - - User storage newUser = users[_banAddress]; - newUser.status = UserStatus.Banned; - } - } - - /* - * @dev Registers a new user in the system. - * - * This function allows a user to register their Ethereum address with the system. It first checks whether the user is not banned and is not already registered. - * If the checks pass, the function increases the user count (_userCount), creates a new User instance, sets the user's status to 'Active', and initializes other parameters. - * It then stores this new User instance in the 'users' mapping. - * The function emits a 'userCreated' event upon successful user creation. - * - * @notice This function can only be called by non-banned users. - * @emit userCreated - Event emitted when a new user is successfully created. Contains the Ethereum address and user ID of the new user. - */ - - function registerUser() external noBannedUser { - require( - isUserRegistered(msg.sender) == false, - "This user is already registered" - ); - - _userCount += 1; - - User storage newUser = users[msg.sender]; - - newUser.status = UserStatus.Active; - newUser.userAddress = payable(msg.sender); - newUser.userId = _userCount; - - emit userCreated(newUser.userAddress, newUser.userId); - } - - /** - * @dev Retrieves the details of a specific user. - * The function will return various parameters of the user, including status, ID, address, total invested amount, - * total dividends earned, and the IDs of the campaigns created and backed by the user. - * - * @param _userAddress The address of the user to retrieve. - * - * Requirements: - * - The function caller must not be a banned user. - * - The user must be registered. - */ - - function getUser( - address _userAddress - ) - external - view - noBannedUser - returns ( - UserStatus status, - uint256 userId, - address payable userAddress, - uint256 totalInvestedAmount, - uint256 totalDividendEarned, - Campaign[] memory campaignsCreated, - Campaign[] memory campaignsBacked - ) - { - require(isUserRegistered(_userAddress), "User is not registered"); - - User storage user = users[_userAddress]; - - Campaign[] memory allCampaignsCreated = new Campaign[]( - user.campaignsCreatedCount - ); - Campaign[] memory allCampaignsBacked = new Campaign[]( - user.campaignsBackedCount - ); - - for (uint256 i = 0; i < user.campaignsCreatedCount; i++) { - allCampaignsCreated[i] = user.campaignsCreated[i]; - } - - for (uint256 i = 0; i < user.campaignsBackedCount; i++) { - allCampaignsBacked[i] = user.campaignsBacked[i]; - } - - return ( - user.status, - user.userId, - user.userAddress, - user.totalInvestedAmount, - user.totalDividendEarned, - allCampaignsCreated, - allCampaignsBacked - ); - } - - /** - * @dev Retrieves the total count of registered users in the crowdfunding platform. - * This function is a view function, meaning it does not modify the state of the contract. - * It allows external callers to query and view the total count of registered users. - * - * @return The total count of registered users in the platform. - */ - - function getUserCount() external view returns (uint256) { - return _userCount; - } - - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // CAMPAIGN FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - /** - * @dev Updates the fee required to create a campaign. - * This function can only be called by the platform (enforced by the requireOnlyPlatform modifier). - * @param _newCampaignFee The new fee for creating a campaign, measured in Wei. - * - * Requirements: - * - The function caller must be the platform. - */ - - function setCampaignFee(uint _newCampaignFee) external requireOnlyPlatform { - _campaignFee = _newCampaignFee; - } - - /** - * @dev Returns the current fee required to create a campaign. - * As a view function, it does not change the state and can be called without gas costs. - * - * @return uint256 The current fee required to create a campaign, in Wei. - */ - - function getCampaignFee() external view returns (uint256) { - return _campaignFee; - } - - /* - * @dev This function enables a registered and non-banned user to create a new campaign with the given parameters. - * The function requires the campaign creator to send an amount equal to the campaign fee. - * The fee received is then transferred to the platform address before creating the new campaign. - * The function emits a CampaignCreated event upon successful creation of a new campaign. - * - * @param _targetAmount The desired fundraising goal for the campaign. - * @param _targetDeadline The length of the campaign in seconds from the current time. - * @param _minFunding The minimum fundraising goal that the campaign aims to reach. - * - * Requirements: - * - The function caller must be an active, registered user and not banned. - * - The function caller must send an amount equal to the campaign fee. - * @notice This function is payable and modifies state variables. - * @emit CampaignCreated - Event emitted when a new campaign is successfully created. The event logs the creator's address, the campaign's ID, and its initial status. - */ - - function createCampaign( - uint256 _targetAmount, - uint256 _targetDeadline, - uint256 _minFunding - ) external payable requireCampaignFee noBannedUser requireRegisteredUser { - // Transfer the received campaign fee to the platform address - _platformAddress.transfer(msg.value); - - // Increment the total count of campaigns - _campaignCount += 1; - - // Create a new campaign and store it in the campaigns mapping - Campaign storage newCampaign = campaigns[_campaignCount]; - - // Initialize the parameters for the new campaign - newCampaign.creatorAddress = payable(msg.sender); - newCampaign.targetAmount = _targetAmount; - newCampaign.targetDeadline = block.timestamp + _targetDeadline; - newCampaign.minFunding = _minFunding; - newCampaign.status = CampaignStatus.Active; - newCampaign.campaignId = _campaignCount; - - // Emit an event indicating the successful creation of a new campaign - emit CampaignCreated(msg.sender, _campaignCount, newCampaign.status); - } - - /** - * @dev This function retrieves the details of a specific campaign identified by its ID. - * It is a view function, meaning it does not modify state and can be executed without any gas cost. - * Note that the function will return the various parameters of the campaign, including its status, ID, raised amount, - * target amount, deadline, minimum funding goal,the creator's address, backers count and all backers. - * - * @param _campaignId The unique identifier of the campaign to retrieve. - */ - - function getCampaign( - uint256 _campaignId - ) - external - view - returns ( - CampaignStatus status, - uint256 campaignId, - uint256 raisedAmount, - uint256 targetAmount, - uint256 targetDeadline, - uint256 minFunding, - address payable creatorAddress, - uint256 backersCount, - Backer[] memory backers - ) - { - Campaign storage campaign = campaigns[_campaignId]; - - Backer[] memory allBackers = new Backer[](campaign.backersCount); - - for (uint256 i = 0; i < campaign.backersCount; i++) { - allBackers[i] = campaign.backers[i]; - } - - return ( - campaign.status, - campaign.campaignId, - campaign.raisedAmount, - campaign.targetAmount, - campaign.targetDeadline, - campaign.minFunding, - campaign.creatorAddress, - campaign.backersCount, - allBackers - ); - } - - /** - * @dev Retrieves the total number of campaigns that have been created. - * This is a view function, so it does not modify the state and can be called without gas costs. - * - * @return uint256 The total number of campaigns that have been created. - */ - - function getCampaignCount() external view returns (uint256) { - return _campaignCount; - } - - /** - * @dev Fund a campaign. - * This function allows registered users to invest funds (Ether) to a specific campaign identified by _campaignId. - * The contributed funds are transferred to the smart contract's account, held in escrow until the campaign is completed. - * The function ensures the campaign is active and the minimum funding requirement is met before accepting the contribution. - * This function modifies the state of the contract as it updates the campaign's raised amount. - * - * @param _campaignId The unique identifier of the campaign to which the user wants to contribute funds. - */ - - function fundCampaign( - uint256 _campaignId - ) external payable noBannedUser requireRegisteredUser { - require( - campaigns[_campaignId].status == CampaignStatus.Active, - "The campaign is not active" - ); - require( - msg.value >= campaigns[_campaignId].minFunding, - "The minimum funding requirement is not met" - ); - - // Increase the campaign's raised amount by the value sent with the transaction. - campaigns[_campaignId].raisedAmount += msg.value; - } -} diff --git a/src/contracts/NFTMarketplaceContract.sol b/src/contracts/NFTMarketplaceContract.sol deleted file mode 100644 index dc6780f..0000000 --- a/src/contracts/NFTMarketplaceContract.sol +++ /dev/null @@ -1,250 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.4; // set version to match with waht we have in our hardhat configuration - -// Using ERC721 standard -// Functionality we can use -import "@openzeppelin/contracts/utils/Counters.sol"; -import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; -import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "hardhat/console.sol"; - -// public means available from the client application -// view means it's not doing any transaction work - -// Creating our contract ->Inherited from ERC721URIStorage -contract NFTMarketplace is ERC721URIStorage { - // allows us to use the coutner utility. - using Counters for Counters.Counter; - // when the first token is minted it'll get a value of zero, the second one is one - // and then using counters this we'll increment token ids - Counters.Counter private _tokenIds; - Counters.Counter private _itemsSold; - - // fee to list an nft on the marketplace - // charge a listing fee. - uint256 listingPrice = 0.025 ether; - - // declaring the owner of the contract - // owner earns a commision on every item sold - address payable owner; - - // keeping up with all the items that have been created - // pass in the integer which is the item id and it returns a market item. - // to fetch a market item, we only need the item id - mapping(uint256 => MarketItem) private idToMarketItem; - - struct MarketItem { - uint256 tokenId; - address payable seller; - address payable owner; - uint256 price; - bool sold; - } - - // have an event for when a market item is created. - // this event matches the MarketItem - event MarketItemCreated( - uint256 indexed tokenId, - address seller, - address owner, - uint256 price, - bool sold - ); - - // set the owner as the msg.sender - // the owner of the contract is the one deploying it - constructor() ERC721("Metaverse Tokens", "METT") { - owner = payable(msg.sender); - } - - /* Updates the listing price of the contract */ - function updateListingPrice(uint _listingPrice) public payable { - require( - owner == msg.sender, - "Only marketplace owner can update listing price." - ); - listingPrice = _listingPrice; - } - - /* Returns the listing price of the contract */ - // when we deploy the contract, on the frontend we don't know how much to list it for - // so we call the contract and get the listing price and make sure we're sending the right amount of payment - function getListingPrice() public view returns (uint256) { - return listingPrice; - } - - /* Mints a token and lists it in the marketplace */ - function createToken( - string memory tokenURI, - uint256 price - ) public payable returns (uint) { - _tokenIds.increment(); - // create a variable that get's the current value of the tokenIds (0, 1, 2...) - uint256 newTokenId = _tokenIds.current(); - // mint the token with - _mint(msg.sender, newTokenId); - _setTokenURI(newTokenId, tokenURI); - createMarketItem(newTokenId, price); - // we've just minted the token and made it sellable - // now we can return the id to the client side so we can work with it - return newTokenId; - } - - function createMarketItem(uint256 tokenId, uint256 price) private { - // require a certain CONDITION, in this case price greater than 0 - require(price > 0, "Price must be at least 1 wei"); - // require that the users sending in the transaction is sending in the correct amount - require( - msg.value == listingPrice, - "Price must be equal to listing price" - ); - - // create the mapping for the market items - // payable(address(0)) is the owner. - // currently there's no owner as the seller is putting it to market so it's an empty address - // last value is boolean for sold, its false because we just put it so it's not sold yet - // this is creating the first market item - idToMarketItem[tokenId] = MarketItem( - tokenId, - payable(msg.sender), - payable(address(this)), - price, - false - ); - - // we now want to transfer the ownership of the nft to the contract -> next buyer - // method available on IERC721 - _transfer(msg.sender, address(this), tokenId); - emit MarketItemCreated( - tokenId, - msg.sender, - address(this), - price, - false - ); - } - - /* allows someone to resell a token they have purchased */ - function resellToken(uint256 tokenId, uint256 price) public payable { - require( - idToMarketItem[tokenId].owner == msg.sender, - "Only item owner can perform this operation" - ); - require( - msg.value == listingPrice, - "Price must be equal to listing price" - ); - idToMarketItem[tokenId].sold = false; - idToMarketItem[tokenId].price = price; - idToMarketItem[tokenId].seller = payable(msg.sender); - idToMarketItem[tokenId].owner = payable(address(this)); - _itemsSold.decrement(); - - _transfer(msg.sender, address(this), tokenId); - } - - /* Creates the sale of a marketplace item */ - /* Transfers ownership of the item, as well as funds between parties */ - function createMarketSale(uint256 tokenId) public payable { - uint price = idToMarketItem[tokenId].price; - require( - msg.value == price, - "Please submit the asking price in order to complete the purchase" - ); - idToMarketItem[tokenId].owner = payable(msg.sender); - idToMarketItem[tokenId].sold = true; - idToMarketItem[tokenId].seller = payable(address(0)); - _itemsSold.increment(); - - // next, we want to transfer the NFT ownership from the seller to the buyer - _transfer(address(this), msg.sender, tokenId); - payable(owner).transfer(listingPrice); - payable(idToMarketItem[tokenId].seller).transfer(msg.value); - } - - /* Returns all unsold market items */ - function fetchMarketItems() public view returns (MarketItem[] memory) { - uint itemCount = _tokenIds.current(); - uint unsoldItemCount = _tokenIds.current() - _itemsSold.current(); - uint currentIndex = 0; - - // looping over the number of items created and incremnet htat number if we have an empty address - - // empty array called items - // the type of the element in the array is marketitem, and the unsolditemcount is the lenght - MarketItem[] memory items = new MarketItem[](unsoldItemCount); - for (uint i = 0; i < itemCount; i++) { - // check to see if the item is unsold -> checking if the owner is an empty address -> then it's unsold - // above, where we were creating a new market item, we were setting the address to be an empty address - // the address get's populated if the item is sold - if (idToMarketItem[i + 1].owner == address(this)) { - // the id of the item that we're currently interracting with - uint currentId = i + 1; - // get the mapping of the idtomarketitem with the -> gives us the reference to the marketitem - MarketItem storage currentItem = idToMarketItem[currentId]; - // insert the market item to the items array - items[currentIndex] = currentItem; - // increment the current index - currentIndex += 1; - } - } - - return items; - } - - /* Returns only items that a user has purchased */ - function fetchMyNFTs() public view returns (MarketItem[] memory) { - uint totalItemCount = _tokenIds.current(); - uint itemCount = 0; - uint currentIndex = 0; - - // gives us the number of items that we own - for (uint i = 0; i < totalItemCount; i++) { - // check if nft is mine - if (idToMarketItem[i + 1].owner == msg.sender) { - itemCount += 1; - } - } - - MarketItem[] memory items = new MarketItem[](itemCount); - for (uint i = 0; i < totalItemCount; i++) { - // check if nft is mine - if (idToMarketItem[i + 1].owner == msg.sender) { - // get the id of the market item - uint currentId = i + 1; - // get the reference to the current market item - MarketItem storage currentItem = idToMarketItem[currentId]; - // insert into the array - items[currentIndex] = currentItem; - // increment the index - currentIndex += 1; - } - } - return items; - } - - /* Returns only items a user has listed */ - function fetchItemsListed() public view returns (MarketItem[] memory) { - uint totalItemCount = _tokenIds.current(); - uint itemCount = 0; - uint currentIndex = 0; - - for (uint i = 0; i < totalItemCount; i++) { - if (idToMarketItem[i + 1].seller == msg.sender) { - itemCount += 1; - } - } - - MarketItem[] memory items = new MarketItem[](itemCount); - for (uint i = 0; i < totalItemCount; i++) { - if (idToMarketItem[i + 1].seller == msg.sender) { - uint currentId = i + 1; - MarketItem storage currentItem = idToMarketItem[currentId]; - items[currentIndex] = currentItem; - currentIndex += 1; - } - } - - return items; - } -} diff --git a/src/contracts/abi/accountContractABI.json b/src/contracts/abi/accountContractABI.json new file mode 100644 index 0000000..d7f0792 --- /dev/null +++ b/src/contracts/abi/accountContractABI.json @@ -0,0 +1,134 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DividendPaid", + "type": "event" + }, + { + "inputs": [], + "name": "payDividend", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_campaignAddress", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [], + "name": "accountOwner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "crowdLaunchContractAddress", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paidDividends", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "startBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalDeposits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalWithdrawals", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/src/contracts/abi/crowdfundContractABI.json b/src/contracts/abi/crowdfundContractABI.json new file mode 100644 index 0000000..0b65685 --- /dev/null +++ b/src/contracts/abi/crowdfundContractABI.json @@ -0,0 +1,919 @@ +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_campaignFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nftListingPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_fromTokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_toTokenId", + "type": "uint256" + } + ], + "name": "BatchMetadataUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "creatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum CampaignStatus", + "name": "status", + "type": "uint8" + } + ], + "name": "CampaignCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "campaignAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "backerAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "CampaignFunded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimedAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalDividendEarned", + "type": "uint256" + } + ], + "name": "DividendClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DividendsPaid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "MetadataUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "NFTListedForSale", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "NFTPurchased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "userId", + "type": "uint256" + } + ], + "name": "userCreated", + "type": "event" + }, + { + "inputs": [], + "name": "_campaignFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_nextTokenId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_nftListingPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_platformAddress", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_userCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accountContract", + "outputs": [ + { + "internalType": "contract IAccountContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "buyListedNFT", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "campaigns", + "outputs": [ + { + "internalType": "enum CampaignStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "raisedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "targetDeadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minFunding", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "creatorAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "backersCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reportCount", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "depositAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimDividend", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_targetAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_targetDeadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minFunding", + "type": "uint256" + } + ], + "name": "createCampaign", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_campaignAddress", + "type": "address" + }, + { + "internalType": "string", + "name": "_tokenURI", + "type": "string" + } + ], + "name": "fundCampaign", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_campaignAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_userAddress", + "type": "address" + } + ], + "name": "isUserBacker", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_price", + "type": "uint256" + } + ], + "name": "listNFTForSale", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "registerUser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenIdToBacker", + "outputs": [ + { + "internalType": "enum BackerStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "reporter", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "backerId", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "backerAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "backedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dividendAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimedDividendRounds", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenIdToSaleListing", + "outputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "users", + "outputs": [ + { + "internalType": "enum UserStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "userId", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "totalInvestedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalDividendEarned", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "campaignsCreatedCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "campaignsBackedCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableBalance", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/src/contracts/campaignContract.sol b/src/contracts/campaignContract.sol new file mode 100644 index 0000000..3084826 --- /dev/null +++ b/src/contracts/campaignContract.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "./dividendContract.sol"; + +/** +* @notice Error code +* 1 - User already has a campaign +* 2 - Inactive or no min fund +*/ + +contract CampaignContract is DividendContract { + + constructor(uint256 _campaignFee, uint256 _nftListingPrice) DividendContract(_campaignFee, _nftListingPrice){} + + /** + * @notice Allows users to create a new crowdfunding campaign. + * @dev Function can only be called by a registered and non-banned user + * who has also paid the campaign fee. + * @param _targetAmount The funding target for the campaign. + * @param _targetDeadline The time duration (in seconds) until the campaign expires. + * @param _minFunding The minimum amount that must be raised for the campaign to be successful. + */ + function createCampaign( + uint256 _targetAmount, + uint256 _targetDeadline, + uint256 _minFunding + ) external requireCampaignFee requireRegisteredUser payable { + require(campaigns[msg.sender].status == CampaignStatus.NotStarted, "1"); + + _platformAddress.transfer(msg.value); + + Campaign storage newCampaign = campaigns[msg.sender]; + + // Initialize the campaign details + newCampaign.creatorAddress = payable(msg.sender); + newCampaign.targetAmount = _targetAmount; + newCampaign.targetDeadline = block.timestamp + _targetDeadline; + newCampaign.minFunding = _minFunding; + newCampaign.status = CampaignStatus.Active; + + emit CampaignCreated(msg.sender, newCampaign.status); + } + + /** + * @dev Funds a specific campaign and issues a token to the backer. + * @param _campaignAddress The address of the campaign to be funded. + * @param _tokenURI The URI for the minted token. + * + * Requirements: + * - Caller must be a registered user. + * - The campaign must be active. + * - The funding amount must meet or exceed the minimum funding requirement of the campaign. + * + * Emits a {CampaignFunded} event. + */ + function fundCampaign(address _campaignAddress, string calldata _tokenURI) external payable requireRegisteredUser { + Campaign storage campaign = campaigns[_campaignAddress]; + + require(campaign.status == CampaignStatus.Active && msg.value >= campaign.minFunding, "2"); + + // Mint a new token for the sender + _mint(msg.sender, ++_nextTokenId); + _setTokenURI(_nextTokenId, _tokenURI); + + // Create a new backer and add to the campaign + Backer memory newBacker = Backer(BackerStatus.Active, false, ++campaign.backersCount, payable(msg.sender), msg.value, 0, 0, 0); + campaign.backers.push(newBacker); + tokenIdToBacker[_nextTokenId] = newBacker; + + // Update the total raised amount for the campaign and the total invested amount for the user + campaign.raisedAmount += msg.value; + users[msg.sender].totalInvestedAmount += msg.value; + + // Emit a CampaignFunded event + emit CampaignFunded(_campaignAddress, msg.sender, msg.value); + + // Complete the campaign if the target amount has been reached + if (campaign.raisedAmount >= campaign.targetAmount) completeCampaign(_campaignAddress); + } +} \ No newline at end of file diff --git a/src/contracts/cccountContract.sol b/src/contracts/cccountContract.sol new file mode 100644 index 0000000..3d021dc --- /dev/null +++ b/src/contracts/cccountContract.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +/** +* @notice Error code +* 1 - not owner +* 2 - low funds +* 3 - transfer failed +*/ + +contract AccountContract { + address payable public accountOwner; + address payable public crowdLaunchContractAddress; + uint256 public startBalance; + uint256 public totalWithdrawals; + uint256 public totalDeposits; + uint256 public paidDividends; + + event DividendPaid(address indexed owner, uint256 amount); + + constructor(address _campaignAddress) payable { + accountOwner = payable(_campaignAddress); + crowdLaunchContractAddress = payable(msg.sender); + startBalance = msg.value; + totalDeposits += msg.value; + } + + modifier onlyAccountOwner() { + require(msg.sender == accountOwner, "1"); + _; + } + + receive() external payable { + totalDeposits += msg.value; + } + + function withdraw( uint256 _amount) external onlyAccountOwner { + require(_amount <= address(this).balance, "2"); + accountOwner.transfer(_amount); + totalWithdrawals += _amount; + } + + function payDividend() external onlyAccountOwner { + uint amountToPay = address(this).balance - startBalance; + + require(amountToPay > 0, "2"); + + (bool success, ) = crowdLaunchContractAddress.call{value: amountToPay}(""); + require(success, "3"); + + paidDividends += amountToPay; + + emit DividendPaid(accountOwner, amountToPay); + } +} \ No newline at end of file diff --git a/src/contracts/constants/contractInfo.ts b/src/contracts/constants/contractInfo.ts new file mode 100644 index 0000000..2cd45b1 --- /dev/null +++ b/src/contracts/constants/contractInfo.ts @@ -0,0 +1 @@ +export const crowdfundingContractAddress = ''; diff --git a/src/contracts/crowdfundContract.sol b/src/contracts/crowdfundContract.sol new file mode 100644 index 0000000..8fbb4ea --- /dev/null +++ b/src/contracts/crowdfundContract.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "./structs/globalStructs.sol"; +import "./enums/globalEnums.sol"; +import "./interfaces/IAccountContract.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +/** +* @notice Error code +* 1 - low create fee +* 2 - only platform +* 3 - only registered user +* 4 - not the campaign creator +* 5 = campaign not completed +*/ + +contract CrowdFundContract is ERC721URIStorage { + // Events + event CampaignCreated(address indexed creatorAddress,CampaignStatus status); + event userCreated(address indexed userAddress, uint256 userId); + event CampaignFunded(address indexed campaignAddress, address indexed backerAddress, uint256 amount); + event DividendClaimed(address indexed userAddress, uint256 claimedAmount, uint256 totalDividendEarned); + event DividendsPaid(uint256 indexed tokenId, uint256 amount); + event NFTListedForSale(uint256 indexed tokenId, uint256 price); + event NFTPurchased(uint256 indexed tokenId, address indexed newOwner, uint256 price); + + IAccountContract public accountContract; + + address payable public _platformAddress; + uint256 public _campaignFee; + uint256 public _nftListingPrice; + uint256 public _userCount = 0; + uint256 public _nextTokenId = 0; + + // Data structure with mapping + mapping(address => Campaign) public campaigns; + mapping(address => User) public users; + mapping(uint256 => Backer) public tokenIdToBacker; + mapping(uint256 => SaleListing) public tokenIdToSaleListing; + + + constructor(uint256 campaignFee, uint256 nftListingPrice) ERC721("CrowdShare", "CSHR") { + _platformAddress = payable(msg.sender); + _campaignFee = campaignFee; + _nftListingPrice = nftListingPrice; + } + + receive() external payable { + if (campaigns[msg.sender].status == CampaignStatus.Completed) { + campaigns[msg.sender].dividendAmount.push(msg.value); + } + } + + modifier requireCampaignFee() { + require(msg.value == _campaignFee, "1"); + _; + } + + modifier requireOnlyPlatform() { + require(msg.sender == _platformAddress, "2"); + _; + } + + modifier requireRegisteredUser() { + require(isUserRegistered(msg.sender), "3"); + _; + } + + function isUserRegistered(address _userAddress) view internal returns(bool) { + return users[_userAddress].status == UserStatus.Active; + } + + function _validateCampaign(address _campaignAddress) internal view { + require(campaigns[_campaignAddress].creatorAddress == _campaignAddress, "4"); + require(campaigns[_campaignAddress].status == CampaignStatus.Completed, "5"); + } + + function isUserBacker(address _campaignAddress, address _userAddress) public view returns (bool) { + bool isBacker = false; + + Campaign storage campaign = campaigns[_campaignAddress]; + + for (uint256 i = 0; i < campaign.backers.length; i++) { + if (campaign.backers[i].backerAddress == _userAddress) { + isBacker = true; + } + } + + return isBacker; + } + + function completeCampaign(address _campaignAddress) internal { + Campaign storage campaign = campaigns[_campaignAddress]; + campaign.depositAddress = payable(address(new AccountContract{value: campaign.raisedAmount}(_campaignAddress))); + campaign.status = CampaignStatus.Completed; + } +} \ No newline at end of file diff --git a/src/contracts/dividendContract.sol b/src/contracts/dividendContract.sol new file mode 100644 index 0000000..75511bf --- /dev/null +++ b/src/contracts/dividendContract.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "./userContract.sol"; +import "@openzeppelin/contracts/utils/math/SafeMath.sol"; + +/** +* @notice Error code +* 1 - no claimable balance +* 2 - Transfer failed +*/ + +contract DividendContract is UserContract { + using SafeMath for uint256; + + constructor(uint256 _campaignFee, uint256 _nftListingPrice) UserContract(_campaignFee, _nftListingPrice){} + + /** + * @notice Allows users to claim their dividends. + * @dev Function can only be called by a registered and non-banned user. + * It transfers the claimable balance to the user's account and updates the state. + */ + function claimDividend() external requireRegisteredUser { + // Fetch the user details from storage + User storage user = users[msg.sender]; + + // Ensure that the user has a claimable balance + require(user.claimableBalance > 0, "1"); + + // Attempt to transfer the claimable dividend balance to the user + (bool success, ) = user.userAddress.call{value: user.claimableBalance}(""); + require(success, "2"); + + // Update the total dividends earned by the user + user.totalDividendEarned += user.claimableBalance; + + // Emit an event to log the dividend claim + emit DividendClaimed(msg.sender, user.claimableBalance, user.totalDividendEarned); + + // Reset the user's claimable balance to zero + user.claimableBalance = 0; + } +} \ No newline at end of file diff --git a/src/contracts/enums/globalEnums.sol b/src/contracts/enums/globalEnums.sol new file mode 100644 index 0000000..2973010 --- /dev/null +++ b/src/contracts/enums/globalEnums.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +/** + * @dev Enum representing the various statuses a campaign can be in. + * NotStarted: The campaign has been initialized but not yet started. + * Active: The campaign is currently active and accepting contributions. + * Paused: The campaign has been temporarily paused. + * Expired: The campaign has reached its deadline without meeting its funding goal. + * Completed: The campaign has reached its deadline and met its funding goal. + * Cancelled: The campaign has been cancelled by the creator or due to reports. + */ +enum CampaignStatus { NotStarted, Active, Paused, Expired, Completed, Cancelled } + +/** + * @dev Enum representing the statuses a backer can be in. + * Active: The backer has made a contribution and is considered active in a campaign. + * Inactive: The backer has either been refunded or has withdrawn their funds. + */ +enum BackerStatus { Active, Inactive } + +/** + * @dev Enum representing the statuses a user can be in. + * Inactive: The user has not participated in any campaign yet. + * Active: The user is active and has participated in at least one campaign. + * Banned: The user has been banned due to fraudulent activities or other reasons. + */ +enum UserStatus { Inactive, Active, Banned } diff --git a/src/contracts/interfaces/IAccountContract.sol b/src/contracts/interfaces/IAccountContract.sol new file mode 100644 index 0000000..2f9c48c --- /dev/null +++ b/src/contracts/interfaces/IAccountContract.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "../AccountContract.sol"; + +interface IAccountContract { + function depositStartBalance() payable external; +} \ No newline at end of file diff --git a/src/contracts/interfaces/ICrowdfunding.sol b/src/contracts/interfaces/ICrowdfunding.sol new file mode 100644 index 0000000..0e05e9a --- /dev/null +++ b/src/contracts/interfaces/ICrowdfunding.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "../crowdfundContract.sol"; + +interface ICrowdFundingContract { + function payDividend(address _campaignAddress, uint256 _accountBalance, uint256 _startBalance) external payable; +} \ No newline at end of file diff --git a/src/contracts/marketplaceContract.sol b/src/contracts/marketplaceContract.sol new file mode 100644 index 0000000..42487ee --- /dev/null +++ b/src/contracts/marketplaceContract.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "./crowdfundContract.sol"; + +/** +* @notice Error code +* 1 - Check failed +*/ + +contract MarketplaceContract is CrowdFundContract { + + constructor(uint256 _campaignFee, uint256 _nftListingPrice) CrowdFundContract(_campaignFee, _nftListingPrice){} + + function listNFTForSale(uint256 _tokenId, uint256 _price) external payable { + require(msg.value == _nftListingPrice && _exists(_tokenId) && ownerOf(_tokenId) == msg.sender, "1"); + + tokenIdToSaleListing[_tokenId] = SaleListing({ tokenId: _tokenId, price: _price, isActive: true }); + + emit NFTListedForSale(_tokenId, _price); + } + + function buyListedNFT(uint256 _tokenId) external payable { + SaleListing memory saleListing = tokenIdToSaleListing[_tokenId]; + require(saleListing.isActive && msg.value == saleListing.price, "1"); + + address previousOwner = ownerOf(_tokenId); + _transfer(previousOwner, msg.sender, _tokenId); + + Backer storage backer = tokenIdToBacker[_tokenId]; + backer.backerAddress = payable(msg.sender); + + tokenIdToSaleListing[_tokenId].isActive = false; + + payable(previousOwner).transfer(msg.value); + + emit NFTPurchased(_tokenId, msg.sender, msg.value); + } +} + diff --git a/src/contracts/structs/globalStructs.sol b/src/contracts/structs/globalStructs.sol new file mode 100644 index 0000000..195c0d3 --- /dev/null +++ b/src/contracts/structs/globalStructs.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "../enums/globalEnums.sol"; + +/** + * @dev Represents a user in the system. + * @param status The current status of the user (e.g., active, banned). + * @param userId A unique identifier for the user. + * @param userAddress The address of the user. + * @param totalInvestedAmount Total amount the user has invested in campaigns. + * @param totalDividendEarned Total dividends the user has earned from successful campaigns. + * @param campaignsCreatedCount The number of campaigns this user has created. + * @param campaignsBackedCount The number of campaigns this user has backed. + * @param claimableBalance The amount of money the user can currently claim. + * @param campaignsCreated An array containing campaigns created by the user. + * @param campaignsBacked An array containing campaigns backed by the user. + */ +struct User { + UserStatus status; + uint256 userId; + address payable userAddress; + uint256 totalInvestedAmount; + uint256 totalDividendEarned; + uint256 campaignsCreatedCount; + uint256 campaignsBackedCount; + uint256 claimableBalance; + Campaign[] campaignsCreated; + Campaign[] campaignsBacked; +} + +/** + * @dev Represents a crowdfunding campaign. + * @param status The current status of the campaign (e.g., ongoing, completed). + * @param raisedAmount The amount raised so far in the campaign. + * @param targetAmount The funding goal for the campaign. + * @param targetDeadline The deadline by which the campaign needs to meet its funding goal. + * @param minFunding The minimum amount that must be raised for the campaign to be considered successful. + * @param creatorAddress The address of the user who created the campaign. + * @param backersCount The number of backers for this campaign. + * @param backers An array of Backer structs, representing the backers of the campaign. + * @param reportCount The number of reports made against this campaign. + * @param depositAddress The address where the raised funds are deposited. + */ +struct Campaign { + CampaignStatus status; + uint256 raisedAmount; + uint256 targetAmount; + uint256 targetDeadline; + uint256 minFunding; + address payable creatorAddress; + uint256 backersCount; + Backer[] backers; + uint256 reportCount; + address payable depositAddress; + uint256[] dividendAmount; +} + +/** + * @dev Represents a backer of a campaign. + * @param status The current status of the backer (e.g., refunded, active). + * @param reporter Whether the backer is also a reporter of the campaign. + * @param backerId A unique identifier for the backer. + * @param backerAddress The address of the backer. + * @param backedAmount The amount this backer has contributed to the campaign. + * @param dividendAmount The amount of dividends this backer has earned from the campaign. + * @param tokenId A unique token identifier associated with this backer's contribution. + */ +struct Backer { + BackerStatus status; + bool reporter; + uint256 backerId; + address payable backerAddress; + uint256 backedAmount; + uint256 dividendAmount; + uint256 tokenId; + + uint256 claimedDividendRounds; +} + +/** + * @dev Represents a token sale listing. + * @param tokenId The unique identifier for the token being sold. + * @param price The selling price for the token. + * @param isActive Whether the sale listing is currently active or not. + */ +struct SaleListing { + uint256 tokenId; + uint256 price; + bool isActive; +} \ No newline at end of file diff --git a/src/contracts/userContract.sol b/src/contracts/userContract.sol new file mode 100644 index 0000000..9e1d380 --- /dev/null +++ b/src/contracts/userContract.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2 <0.9.0; + +import "./marketplaceContract.sol"; + +/** +* @notice Error code +* 1 - already registered +*/ + +contract UserContract is MarketplaceContract { + + constructor(uint256 _campaignFee, uint256 _nftListingPrice) MarketplaceContract(_campaignFee, _nftListingPrice){} + + /** + * @notice Register a new user on the platform. + * @dev Registers a new user by creating a new User struct and setting its status to 'Active'. + * This function can only be called by an address that is not banned. + * + * Emits a {userCreated} event upon successful registration. + */ + + function registerUser() external { + // Ensure the address calling the function is not already registered + require(isUserRegistered(msg.sender) == false, "1"); + + // Increment the user count + _userCount += 1; + + // Create a new user in storage and set its properties + User storage newUser = users[msg.sender]; + newUser.status = UserStatus.Active; + newUser.userAddress = payable(msg.sender); + newUser.userId = _userCount; + + // Emit a userCreated event with the new user's address and ID + emit userCreated(newUser.userAddress, newUser.userId); + } +} \ No newline at end of file From bee9cf61e023fb4529fa75510d6d9899cbf827fd Mon Sep 17 00:00:00 2001 From: folathecoder Date: Sat, 26 Aug 2023 13:12:12 +0100 Subject: [PATCH 12/28] Adjusted hero section card order --- src/components/home/heroSection/projectCard/projectCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/home/heroSection/projectCard/projectCard.tsx b/src/components/home/heroSection/projectCard/projectCard.tsx index 0fdb306..3bd7d4c 100644 --- a/src/components/home/heroSection/projectCard/projectCard.tsx +++ b/src/components/home/heroSection/projectCard/projectCard.tsx @@ -19,7 +19,7 @@ const ProjectCard = () => { {fetchingProjects === 2 && - projects?.slice(0, 6).map((project, index) => { + projects?.slice(-6).map((project, index) => { return ( Date: Mon, 28 Aug 2023 15:47:42 +0100 Subject: [PATCH 13/28] Implemented Smart Contract Tests using CHAI --- .../abi/accountContractABI.json | 70 +- .../abi/crowdfundContractABI.json | 0 .../accountContract.sol | 0 .../campaignContract.sol | 0 .../constants/contractInfo.ts | 0 .../crowdfundContract.sol | 0 .../dividendContract.sol | 0 .../enums/globalEnums.sol | 0 .../interfaces/IAccountContract.sol | 2 +- .../interfaces/ICrowdfunding.sol | 0 .../marketplaceContract.sol | 0 .../structs/globalStructs.sol | 1 - contracts/tests/crowdfundTest.js | 257 ++++ {src/contracts => contracts}/userContract.sol | 0 hardhat.config.js | 8 + hardhat.config.ts | 8 - package.json | 8 +- tsconfig.json | 5 +- yarn.lock | 1244 ++++++++++++++++- 19 files changed, 1521 insertions(+), 82 deletions(-) rename {src/contracts => contracts}/abi/accountContractABI.json (100%) rename {src/contracts => contracts}/abi/crowdfundContractABI.json (100%) rename src/contracts/cccountContract.sol => contracts/accountContract.sol (100%) rename {src/contracts => contracts}/campaignContract.sol (100%) rename {src/contracts => contracts}/constants/contractInfo.ts (100%) rename {src/contracts => contracts}/crowdfundContract.sol (100%) rename {src/contracts => contracts}/dividendContract.sol (100%) rename {src/contracts => contracts}/enums/globalEnums.sol (100%) rename {src/contracts => contracts}/interfaces/IAccountContract.sol (82%) rename {src/contracts => contracts}/interfaces/ICrowdfunding.sol (100%) rename {src/contracts => contracts}/marketplaceContract.sol (100%) rename {src/contracts => contracts}/structs/globalStructs.sol (99%) create mode 100644 contracts/tests/crowdfundTest.js rename {src/contracts => contracts}/userContract.sol (100%) create mode 100644 hardhat.config.js delete mode 100644 hardhat.config.ts diff --git a/src/contracts/abi/accountContractABI.json b/contracts/abi/accountContractABI.json similarity index 100% rename from src/contracts/abi/accountContractABI.json rename to contracts/abi/accountContractABI.json index d7f0792..737a216 100644 --- a/src/contracts/abi/accountContractABI.json +++ b/contracts/abi/accountContractABI.json @@ -1,4 +1,15 @@ [ + { + "inputs": [ + { + "internalType": "address", + "name": "_campaignAddress", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ @@ -18,41 +29,6 @@ "name": "DividendPaid", "type": "event" }, - { - "inputs": [], - "name": "payDividend", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_campaignAddress", - "type": "address" - } - ], - "stateMutability": "payable", - "type": "constructor" - }, { "inputs": [], "name": "accountOwner", @@ -92,6 +68,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "payDividend", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "startBalance", @@ -130,5 +113,22 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" } ] \ No newline at end of file diff --git a/src/contracts/abi/crowdfundContractABI.json b/contracts/abi/crowdfundContractABI.json similarity index 100% rename from src/contracts/abi/crowdfundContractABI.json rename to contracts/abi/crowdfundContractABI.json diff --git a/src/contracts/cccountContract.sol b/contracts/accountContract.sol similarity index 100% rename from src/contracts/cccountContract.sol rename to contracts/accountContract.sol diff --git a/src/contracts/campaignContract.sol b/contracts/campaignContract.sol similarity index 100% rename from src/contracts/campaignContract.sol rename to contracts/campaignContract.sol diff --git a/src/contracts/constants/contractInfo.ts b/contracts/constants/contractInfo.ts similarity index 100% rename from src/contracts/constants/contractInfo.ts rename to contracts/constants/contractInfo.ts diff --git a/src/contracts/crowdfundContract.sol b/contracts/crowdfundContract.sol similarity index 100% rename from src/contracts/crowdfundContract.sol rename to contracts/crowdfundContract.sol diff --git a/src/contracts/dividendContract.sol b/contracts/dividendContract.sol similarity index 100% rename from src/contracts/dividendContract.sol rename to contracts/dividendContract.sol diff --git a/src/contracts/enums/globalEnums.sol b/contracts/enums/globalEnums.sol similarity index 100% rename from src/contracts/enums/globalEnums.sol rename to contracts/enums/globalEnums.sol diff --git a/src/contracts/interfaces/IAccountContract.sol b/contracts/interfaces/IAccountContract.sol similarity index 82% rename from src/contracts/interfaces/IAccountContract.sol rename to contracts/interfaces/IAccountContract.sol index 2f9c48c..86588bc 100644 --- a/src/contracts/interfaces/IAccountContract.sol +++ b/contracts/interfaces/IAccountContract.sol @@ -2,7 +2,7 @@ pragma solidity >=0.8.2 <0.9.0; -import "../AccountContract.sol"; +import "../accountContract.sol"; interface IAccountContract { function depositStartBalance() payable external; diff --git a/src/contracts/interfaces/ICrowdfunding.sol b/contracts/interfaces/ICrowdfunding.sol similarity index 100% rename from src/contracts/interfaces/ICrowdfunding.sol rename to contracts/interfaces/ICrowdfunding.sol diff --git a/src/contracts/marketplaceContract.sol b/contracts/marketplaceContract.sol similarity index 100% rename from src/contracts/marketplaceContract.sol rename to contracts/marketplaceContract.sol diff --git a/src/contracts/structs/globalStructs.sol b/contracts/structs/globalStructs.sol similarity index 99% rename from src/contracts/structs/globalStructs.sol rename to contracts/structs/globalStructs.sol index 195c0d3..3516653 100644 --- a/src/contracts/structs/globalStructs.sol +++ b/contracts/structs/globalStructs.sol @@ -75,7 +75,6 @@ struct Backer { uint256 backedAmount; uint256 dividendAmount; uint256 tokenId; - uint256 claimedDividendRounds; } diff --git a/contracts/tests/crowdfundTest.js b/contracts/tests/crowdfundTest.js new file mode 100644 index 0000000..11148d3 --- /dev/null +++ b/contracts/tests/crowdfundTest.js @@ -0,0 +1,257 @@ +// Import necessary modules +const { ethers } = require('hardhat'); +const { expect } = require('chai'); + +// Declare variables for storing user and contract information +let platform, user1, user2, user3, user4, contract, accountContractAddress; + +// Declare constants for the test +// Initialize fees and campaign parameters as Big Numbers for easy manipulation +const CAMPAIGN_FEE = ethers.utils.parseEther('1'); +const NFT_LISTING_FEE = ethers.utils.parseEther('1'); +const CAMPAIGN_TARGET_AMOUNT = ethers.utils.parseEther('2000'); +const CAMPAIGN_MIN_FUNDING = ethers.utils.parseEther('10'); +const WITHDRAWAL_AMOUNT = ethers.utils.parseEther('100'); +const DEPOSIT_AMOUNT = ethers.utils.parseEther('1'); +const CAMPAIGN_DEADLINE = 1000000; +const TOKEN_URI = 'https://token-uri.com/'; +const NFT_SALE_PRICE = ethers.utils.parseEther('100'); + +describe('CrowdfundContract Test', function () { + before(async function () { + // TODO: Test user accounts + [platform, user1, user2, user3, user4] = await ethers.getSigners(); + + // TODO: Contract deployment + const CrowdFundContract = await ethers.getContractFactory( + 'CampaignContract', + platform + ); + contract = await CrowdFundContract.deploy(CAMPAIGN_FEE, NFT_LISTING_FEE); + }); + + it('Check that a New User Can Successfully Register', async function () { + await contract.connect(user1).registerUser(); + const user = await contract.users(user1.address); + + expect(user.userAddress).to.equal(user1.address); + }); + + it('Check that an Already Registered User Cannot Re-Register', async function () { + const REVERT_REASON = '1'; // Error CODE: Already Registered + await expect(contract.connect(user1).registerUser()).to.be.revertedWith( + REVERT_REASON + ); + }); + + it('Check that Campaign Listing Fee Can Be Accurately Retrieved', async function () { + expect(await contract._campaignFee()).to.equal(CAMPAIGN_FEE); + }); + + it('Check that NFT Listing Fee Can Be Accurately Retrieved', async function () { + expect(await contract._nftListingPrice()).to.equal(NFT_LISTING_FEE); + }); + + it('Check if the Platform Address Is Correctly Returned', async function () { + expect(await contract._platformAddress()).to.equal(platform.address); + }); + + it('Check that the User Count Is Accurately Reported', async function () { + await contract.connect(user2).registerUser(); + await contract.connect(user3).registerUser(); + + expect(await contract._userCount()).to.equal(3); + }); + + it('Check that a Registered User Can Successfully Create a Campaign', async function () { + await contract + .connect(user1) + .createCampaign( + CAMPAIGN_TARGET_AMOUNT, + CAMPAIGN_DEADLINE, + CAMPAIGN_MIN_FUNDING, + { + value: CAMPAIGN_FEE, + } + ); + + const campaign = await contract.campaigns(user1.address); + + expect(campaign.creatorAddress).to.equal(user1.address); + }); + + it('Check that an Unregistered User Cannot Create a Campaign', async function () { + const REVERT_REASON = '3'; // Error CODE: Only registered user + + await expect( + contract + .connect(user4) + .createCampaign( + CAMPAIGN_TARGET_AMOUNT, + CAMPAIGN_DEADLINE, + CAMPAIGN_MIN_FUNDING, + { + value: CAMPAIGN_FEE, + } + ) + ).to.be.revertedWith(REVERT_REASON); + }); + + it('Check that Creating a Campaign with Insufficient Fee Is Reverted', async function () { + const REVERT_REASON = '1'; // Error CODE: Low campaign fee + + await expect( + contract + .connect(user1) + .createCampaign( + CAMPAIGN_TARGET_AMOUNT, + CAMPAIGN_DEADLINE, + CAMPAIGN_MIN_FUNDING, + { + value: CAMPAIGN_FEE, + } + ) + ).to.be.revertedWith(REVERT_REASON); + }); + + it('Check that a User Can Successfully Fund a Campaign', async function () { + const FUND_AMOUNT = ethers.utils.parseEther('1000'); + + await contract.connect(user2).fundCampaign(user1.address, TOKEN_URI, { + value: FUND_AMOUNT, + }); + + const fundedCampaign = await contract.campaigns(user1.address); + + expect(fundedCampaign.raisedAmount).to.equal(FUND_AMOUNT); + }); + + it('Check that Funding Below the Minimum Amount is Reverted', async function () { + const REVERT_REASON = '2'; // Error CODE: Inactive Campaign OR Minimum funding Amount not met + const FUND_AMOUNT = ethers.utils.parseEther('0.9'); + + await expect( + contract.connect(user3).fundCampaign(user1.address, TOKEN_URI, { + value: FUND_AMOUNT, + }) + ).to.be.revertedWith(REVERT_REASON); + }); + + it('Check that NFT is Minted Successfully after Funding a Campaign', async function () { + const backer = await contract.tokenIdToBacker(1); + + expect(backer.backerAddress).to.equal(user2.address); + }); + + it('Check that NFT Sale Listing without Paying Listing Fee is Reverted', async function () { + const REVERT_REASON = '1'; // Error CODE: Low NFT listing fee + + await expect( + contract.connect(user2).listNFTForSale(1, NFT_SALE_PRICE, { + value: 0, + }) + ).to.be.revertedWith(REVERT_REASON); + }); + + it('Check that NFT can be Listed for Sale by the Owner Successfully', async function () { + await contract.connect(user2).listNFTForSale(1, NFT_SALE_PRICE, { + value: NFT_LISTING_FEE, + }); + + const saleListing = await contract.tokenIdToSaleListing(1); + + expect(saleListing.isActive).to.equal(true); + }); + + it('Check that a Reversion Occurs When a User Buys NFT Without Paying The Sale Price', async function () { + const REVERT_REASON = '1'; // Error CODE: Insufficient sale price + + await expect( + contract.connect(user3).buyListedNFT(1, { + value: 0, + }) + ).to.be.revertedWith(REVERT_REASON); + }); + + it('Check that the Listed NFT Can be Bought Successfully by Another User (NFT Ownership Transfer)', async function () { + await contract.connect(user3).buyListedNFT(1, { + value: NFT_SALE_PRICE, + }); + + expect(await contract.ownerOf(1)).to.equal(user3.address); + }); + + it('Check that an Account Contract is Deployed After Campaign Meets Target Funding Amount', async function () { + const FUND_AMOUNT = ethers.utils.parseEther('1000'); + + await contract.connect(user4).registerUser(); + await contract.connect(user4).fundCampaign(user1.address, TOKEN_URI, { + value: FUND_AMOUNT, + }); + + const campaignData = await contract.campaigns(user1.address); + accountContractAddress = campaignData[8]; + + expect(accountContractAddress.toString()).to.have.lengthOf(42); + }); +}); + +describe('Account Wallet Test', function () { + let accountContract, balance; + + before(async function () { + const AccountContract = await ethers.getContractFactory('AccountContract'); + accountContract = await AccountContract.attach(accountContractAddress); + }); + + it('Check that the Account Contract is Funded with Target Amount', async function () { + balance = await ethers.provider.getBalance(accountContractAddress); + expect(balance).to.be.at.least(CAMPAIGN_TARGET_AMOUNT); + }); + + it('Check that the Campaign Creator is the Account Owner', async function () { + expect(await accountContract.accountOwner()).to.equal(user1.address); + }); + + it('Check that account owner can withdraw funds', async function () { + const startBalance = await accountContract.startBalance(); + await accountContract.connect(user1).withdraw(WITHDRAWAL_AMOUNT); + balance = await ethers.provider.getBalance(accountContractAddress); + + expect(Number(ethers.utils.formatEther(startBalance))).to.be.greaterThan( + Number(ethers.utils.formatEther(balance)) + ); + }); + + it('Check that the Total Withdrawals can be Fetched', async function () { + expect(await accountContract.totalWithdrawals()).to.equal( + WITHDRAWAL_AMOUNT + ); + }); + + it('Check that the Total Deposits can be Fetched', async function () { + const previousBalance = await ethers.provider.getBalance( + accountContractAddress + ); + + await user4.sendTransaction({ + to: accountContractAddress, + value: DEPOSIT_AMOUNT, + }); + + balance = await ethers.provider.getBalance(accountContractAddress); + const expectedNewBalance = previousBalance.add(DEPOSIT_AMOUNT); + + expect(balance.toString()).to.equal(expectedNewBalance.toString()); + }); + + it('Check that the Starting Balance can be Fetched', async function () { + const campaignData = await contract.campaigns(user1.address); + const amountRaised = campaignData[1]; + const startBalance = await accountContract.startBalance(); + + expect(Number(ethers.utils.formatEther(startBalance))).to.equal( + Number(ethers.utils.formatEther(amountRaised)) + ); + }); +}); diff --git a/src/contracts/userContract.sol b/contracts/userContract.sol similarity index 100% rename from src/contracts/userContract.sol rename to contracts/userContract.sol diff --git a/hardhat.config.js b/hardhat.config.js new file mode 100644 index 0000000..df9c7c6 --- /dev/null +++ b/hardhat.config.js @@ -0,0 +1,8 @@ +/** @type import('hardhat/config').HardhatUserConfig */ +require('@nomiclabs/hardhat-ethers'); +require('@nomiclabs/hardhat-waffle'); + +module.exports = { + solidity: '0.8.2', + plugins: [require('@nomiclabs/hardhat-waffle')], +}; diff --git a/hardhat.config.ts b/hardhat.config.ts deleted file mode 100644 index 58349b8..0000000 --- a/hardhat.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { HardhatUserConfig } from 'hardhat/config'; -import '@nomicfoundation/hardhat-toolbox'; - -const config: HardhatUserConfig = { - solidity: '0.8.4', -}; - -export default config; diff --git a/package.json b/package.json index c9a7ee2..c0ce2b9 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,15 @@ "@emotion/styled": "^11.11.0", "@mui/material": "^5.13.6", "@mui/styled-engine-sc": "^5.12.0", + "@nomiclabs/hardhat-ethers": "^2.2.3", + "@nomiclabs/hardhat-waffle": "^2.0.6", "@openzeppelin/contracts": "^4.9.3", "@rainbow-me/rainbowkit": "^1.0.8", "@rainbow-me/rainbowkit-siwe-next-auth": "^0.3.0", "@reduxjs/toolkit": "^1.9.5", + "@types/chai": "^4.3.5", "@types/draft-js": "^0.11.12", + "@types/mocha": "^10.0.1", "@types/node": "20.3.1", "@types/react": "18.2.13", "@types/react-dom": "18.2.6", @@ -34,6 +38,7 @@ "draft-js": "^0.11.7", "eslint": "8.43.0", "eslint-config-next": "13.4.7", + "ethereum-waffle": "^4.0.10", "ethers": "^5", "framer-motion": "^10.12.18", "graphql": "^16.7.1", @@ -72,6 +77,7 @@ "slate": "^0.94.1", "slate-react": "^0.97.2", "styled-components": "^6.0.1", + "ts-node": "^10.9.1", "tss-react": "^4.9.0", "typescript": "5.1.3", "use-clipboard-copy": "^0.2.0", @@ -84,6 +90,6 @@ "@types/lodash": "^4.14.195", "@types/react-share": "^4.0.0", "@types/styled-components": "^5.1.26", - "hardhat": "^2.16.1" + "hardhat": "^2.17.1" } } diff --git a/tsconfig.json b/tsconfig.json index 0f01194..5c9122f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,6 +24,7 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "src/components/global/form/configuration.js", "src/components/global/form/richTextField.js"], - "exclude": ["node_modules"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "src/components/global/form/configuration.js", "src/components/global/form/richTextField.js", "contracts/tests/crowdfundTest.js"], + "exclude": ["node_modules"], + "files": ["hardhat.config.js"] } diff --git a/yarn.lock b/yarn.lock index 33ef5b8..ec59bb4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1178,6 +1178,13 @@ stream-browserify "^3.0.0" util "^0.12.4" +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@editorjs/editorjs@^2.27.2": version "2.27.2" resolved "https://registry.yarnpkg.com/@editorjs/editorjs/-/editorjs-2.27.2.tgz#b27ff83bccc7c443fd62f05740acaa8b8f0cb785" @@ -1339,6 +1346,133 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== +"@ethereum-waffle/chai@4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" + integrity sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw== + dependencies: + "@ethereum-waffle/provider" "4.0.5" + debug "^4.3.4" + json-bigint "^1.0.0" + +"@ethereum-waffle/compiler@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz#069e2df24b879b8a7b78857bad6f8bf6ebc8a5b1" + integrity sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw== + dependencies: + "@resolver-engine/imports" "^0.3.3" + "@resolver-engine/imports-fs" "^0.3.3" + "@typechain/ethers-v5" "^10.0.0" + "@types/mkdirp" "^0.5.2" + "@types/node-fetch" "^2.6.1" + mkdirp "^0.5.1" + node-fetch "^2.6.7" + +"@ethereum-waffle/ens@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-4.0.3.tgz#4a46ac926414f3c83b4e8cc2562c8e2aee06377a" + integrity sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw== + +"@ethereum-waffle/mock-contract@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz#f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de" + integrity sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA== + +"@ethereum-waffle/provider@4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-4.0.5.tgz#8a65dbf0263f4162c9209608205dee1c960e716b" + integrity sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw== + dependencies: + "@ethereum-waffle/ens" "4.0.3" + "@ganache/ethereum-options" "0.1.4" + debug "^4.3.4" + ganache "7.4.3" + +"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" + integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== + dependencies: + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + ethereumjs-util "^7.1.5" + merkle-patricia-tree "^4.2.4" + +"@ethereumjs/blockchain@^5.5.0": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" + integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/common" "^2.6.4" + "@ethereumjs/ethash" "^1.1.0" + debug "^4.3.3" + ethereumjs-util "^7.1.5" + level-mem "^5.0.1" + lru-cache "^5.1.1" + semaphore-async-await "^1.5.1" + +"@ethereumjs/common@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" + integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.3" + +"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/ethash@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== + dependencies: + "@ethereumjs/block" "^3.5.0" + "@types/levelup" "^4.3.0" + buffer-xor "^2.0.1" + ethereumjs-util "^7.1.1" + miller-rabin "^4.0.0" + +"@ethereumjs/tx@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" + integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== + dependencies: + "@ethereumjs/common" "^2.6.0" + ethereumjs-util "^7.1.3" + +"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + +"@ethereumjs/vm@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" + integrity sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ== + dependencies: + "@ethereumjs/block" "^3.6.0" + "@ethereumjs/blockchain" "^5.5.0" + "@ethereumjs/common" "^2.6.0" + "@ethereumjs/tx" "^3.4.0" + async-eventemitter "^0.2.4" + core-js-pure "^3.0.1" + debug "^2.2.0" + ethereumjs-util "^7.1.3" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + merkle-patricia-tree "^4.2.2" + rustbn.js "~0.2.0" + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -1681,6 +1815,68 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ganache/ethereum-address@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz#0e6d66f4a24f64bf687cb3ff7358fb85b9d9005e" + integrity sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw== + dependencies: + "@ganache/utils" "0.1.4" + +"@ganache/ethereum-options@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz#6a559abb44225e2b8741a8f78a19a46714a71cd6" + integrity sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw== + dependencies: + "@ganache/ethereum-address" "0.1.4" + "@ganache/ethereum-utils" "0.1.4" + "@ganache/options" "0.1.4" + "@ganache/utils" "0.1.4" + bip39 "3.0.4" + seedrandom "3.0.5" + +"@ganache/ethereum-utils@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz#fae4b5b9e642e751ff1fa0cd7316c92996317257" + integrity sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg== + dependencies: + "@ethereumjs/common" "2.6.0" + "@ethereumjs/tx" "3.4.0" + "@ethereumjs/vm" "5.6.0" + "@ganache/ethereum-address" "0.1.4" + "@ganache/rlp" "0.1.4" + "@ganache/utils" "0.1.4" + emittery "0.10.0" + ethereumjs-abi "0.6.8" + ethereumjs-util "7.1.3" + +"@ganache/options@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/options/-/options-0.1.4.tgz#325b07e6de85094667aaaaf3d653e32404a04b78" + integrity sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw== + dependencies: + "@ganache/utils" "0.1.4" + bip39 "3.0.4" + seedrandom "3.0.5" + +"@ganache/rlp@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/rlp/-/rlp-0.1.4.tgz#f4043afda83e1a14a4f80607b103daf166a9b374" + integrity sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ== + dependencies: + "@ganache/utils" "0.1.4" + rlp "2.2.6" + +"@ganache/utils@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/utils/-/utils-0.1.4.tgz#25d60d7689e3dda6a8a7ad70e3646f07c2c39a1f" + integrity sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w== + dependencies: + emittery "0.10.0" + keccak "3.0.1" + seedrandom "3.0.5" + optionalDependencies: + "@trufflesuite/bigint-buffer" "1.1.9" + "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" @@ -1714,7 +1910,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.1.0": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== @@ -1729,6 +1925,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.19" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" @@ -2270,6 +2474,16 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" +"@nomiclabs/hardhat-ethers@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + +"@nomiclabs/hardhat-waffle@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" + integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== + "@openzeppelin/contracts@^4.9.3": version "4.9.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" @@ -2312,6 +2526,43 @@ redux-thunk "^2.4.2" reselect "^4.1.8" +"@resolver-engine/core@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" + integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== + dependencies: + debug "^3.1.0" + is-url "^1.2.4" + request "^2.85.0" + +"@resolver-engine/fs@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" + integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== + dependencies: + "@resolver-engine/core" "^0.3.3" + debug "^3.1.0" + +"@resolver-engine/imports-fs@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" + integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== + dependencies: + "@resolver-engine/fs" "^0.3.3" + "@resolver-engine/imports" "^0.3.3" + debug "^3.1.0" + +"@resolver-engine/imports@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" + integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== + dependencies: + "@resolver-engine/core" "^0.3.3" + debug "^3.1.0" + hosted-git-info "^2.6.0" + path-browserify "^1.0.0" + url "^0.11.0" + "@resvg/resvg-wasm@2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@resvg/resvg-wasm/-/resvg-wasm-2.4.1.tgz#88f7a08107bf5ea691b016e55e6db955c85d845c" @@ -2704,6 +2955,53 @@ "@testing-library/dom" "^9.0.0" "@types/react-dom" "^18.0.0" +"@trufflesuite/bigint-buffer@1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== + dependencies: + node-gyp-build "4.4.0" + +"@trufflesuite/bigint-buffer@1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz#e2604d76e1e4747b74376d68f1312f9944d0d75d" + integrity sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw== + dependencies: + node-gyp-build "4.3.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@typechain/ethers-v5@^10.0.0": + version "10.2.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@types/abstract-leveldown@*": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.2.tgz#45fed99f966749a6fc351131465026584e99456b" + integrity sha512-EVVYLp4D3zwP5/sS2S5x70t1w0BDrjbv0x0d0znngFKX/YExe+il/JAlHOEpo0cTdtY4Ohnllen32hPganG20w== + "@types/aria-query@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" @@ -2723,6 +3021,11 @@ dependencies: "@types/node" "*" +"@types/chai@^4.3.5": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== + "@types/connect@^3.4.33": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -2768,6 +3071,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/level-errors@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== + +"@types/levelup@^4.3.0": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== + dependencies: + "@types/abstract-leveldown" "*" + "@types/level-errors" "*" + "@types/node" "*" + "@types/lodash.clonedeep@^4.5.6": version "4.5.7" resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.7.tgz#0e119f582ed6f9e6b373c04a644651763214f197" @@ -2787,21 +3104,46 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.197.tgz#e95c5ddcc814ec3e84c891910a01e0c8a378c54b" integrity sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g== -"@types/lru-cache@^5.1.0": +"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + +"@types/mocha@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== + "@types/ms@*": version "0.7.31" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/node-fetch@^2.6.1": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" + integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node@*": version "20.5.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.0.tgz#7fc8636d5f1aaa3b21e6245e97d56b7f56702313" integrity sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/node@20.3.1": version "20.3.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" @@ -2829,6 +3171,11 @@ dependencies: "@types/node" "*" +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + "@types/prop-types@*", "@types/prop-types@^15.7.5": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -2914,6 +3261,11 @@ dependencies: "@types/node" "*" +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== + "@types/styled-components@^5.1.26": version "5.1.26" resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af" @@ -3505,12 +3857,51 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: module-error "^1.0.1" queue-microtask "^1.2.3" +abstract-leveldown@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== + dependencies: + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +abstract-leveldown@~6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -3567,7 +3958,7 @@ ajv-keywords@^3.1.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3641,6 +4032,11 @@ apg-js@^4.1.1: resolved "https://registry.yarnpkg.com/apg-js/-/apg-js-4.2.0.tgz#c26e7271640e67d3d4738b93bae8ee53773b0635" integrity sha512-4WI3AYN9DmJWK3+3r/DtVMI+RO45R0u/b7tJWb5EM2c8nIzojx8Oq5LpMalou3sQnmS9qzw7cKmHBrAjdlseWw== +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -3667,6 +4063,16 @@ aria-query@^5.1.3: dependencies: dequal "^2.0.3" +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -3750,6 +4156,18 @@ asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -3760,6 +4178,13 @@ ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +async-eventemitter@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + async-mutex@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" @@ -3767,6 +4192,13 @@ async-mutex@^0.2.6: dependencies: tslib "^2.0.0" +async@^2.4.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -3782,6 +4214,16 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + axe-core@^4.6.2: version "4.7.2" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" @@ -3880,6 +4322,13 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" @@ -3907,6 +4356,11 @@ bigint-crypto-utils@^3.0.23: resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== +bignumber.js@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -3924,6 +4378,16 @@ bindings@^1.3.0: dependencies: file-uri-to-path "1.0.0" +bip39@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -3938,12 +4402,12 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -3993,7 +4457,7 @@ broadcast-channel@^3.4.1: rimraf "3.0.2" unload "2.2.0" -brorand@^1.1.0: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== @@ -4061,6 +4525,13 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== +buffer-xor@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== + dependencies: + safe-buffer "^5.1.1" + buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" @@ -4069,7 +4540,7 @@ buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@^5.5.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4077,6 +4548,13 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +bufferutil@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== + dependencies: + node-gyp-build "^4.3.0" + bufferutil@^4.0.1: version "4.0.7" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" @@ -4153,7 +4631,12 @@ case@^1.6.3: resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== -catering@^2.1.0, catering@^2.1.1: +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== @@ -4359,7 +4842,7 @@ color@^4.2.3: color-convert "^2.0.1" color-string "^1.9.0" -combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -4371,6 +4854,26 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" @@ -4386,6 +4889,11 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + compute-scroll-into-view@^1.0.20: version "1.0.20" resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43" @@ -4425,6 +4933,11 @@ core-js-compat@^3.31.0: dependencies: browserslist "^4.21.9" +core-js-pure@^3.0.1: + version "3.32.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.1.tgz#5775b88f9062885f67b6d7edce59984e89d276f3" + integrity sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ== + core-js@^2.4.0: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" @@ -4435,6 +4948,11 @@ core-js@^3.6.4: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.0.tgz#7643d353d899747ab1f8b03d2803b0312a0fb3b6" integrity sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + cosmiconfig@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -4492,6 +5010,11 @@ create-react-class@^15.5.1: loose-envify "^1.3.1" object-assign "^4.1.1" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-fetch@^3.0.4, cross-fetch@^3.1.4, cross-fetch@^3.1.5: version "3.1.8" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" @@ -4598,21 +5121,28 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^2.1.3: +debug@^2.1.3, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -4684,7 +5214,7 @@ deep-equal@^2.0.5: which-collection "^1.0.1" which-typed-array "^1.1.9" -deep-extend@^0.6.0: +deep-extend@^0.6.0, deep-extend@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== @@ -4704,6 +5234,14 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +deferred-leveldown@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== + dependencies: + abstract-leveldown "~6.2.1" + inherits "^2.0.3" + define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -4769,6 +5307,11 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dijkstrajs@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" @@ -4862,6 +5405,14 @@ duplexify@^4.1.2: readable-stream "^3.1.1" stream-shift "^1.0.0" +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + electron-to-chromium@^1.4.477: version "1.4.490" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz#d99286f6e915667fa18ea4554def1aa60eb4d5f1" @@ -4880,6 +5431,11 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== + emoji-regex@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.2.1.tgz#a41c330d957191efd3d9dfe6e1e8e1e9ab048b3f" @@ -4905,6 +5461,16 @@ encode-utf8@^1.0.3: resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== +encoding-down@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== + dependencies: + abstract-leveldown "^6.2.1" + inherits "^2.0.3" + level-codec "^9.0.0" + level-errors "^2.0.0" + end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -4938,6 +5504,13 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +errno@~0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5355,7 +5928,19 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereumjs-abi@^0.6.8: +ethereum-waffle@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz#f1ef1564c0155236f1a66c6eae362a5d67c9f64c" + integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== + dependencies: + "@ethereum-waffle/chai" "4.0.10" + "@ethereum-waffle/compiler" "4.0.3" + "@ethereum-waffle/mock-contract" "4.0.4" + "@ethereum-waffle/provider" "4.0.5" + solc "0.8.15" + typechain "^8.0.0" + +ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== @@ -5363,6 +5948,17 @@ ethereumjs-abi@^0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.0" +ethereumjs-util@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" @@ -5376,6 +5972,17 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" +ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethers@^5, ethers@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" @@ -5448,7 +6055,7 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -extend@^3.0.2: +extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -5458,6 +6065,16 @@ extracted-loader@1.0.4: resolved "https://registry.yarnpkg.com/extracted-loader/-/extracted-loader-1.0.4.tgz#e1a3f1791813c14091a1959e261e23e95dd90115" integrity sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q== +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -5589,6 +6206,13 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -5647,6 +6271,20 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -5656,6 +6294,15 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -5691,7 +6338,7 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^7.0.1: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -5730,7 +6377,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: +functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== @@ -5740,6 +6387,23 @@ functions-have-names@^1.2.2, functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +ganache@7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.4.3.tgz#e995f1250697264efbb34d4241c374a2b0271415" + integrity sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA== + dependencies: + "@trufflesuite/bigint-buffer" "1.1.10" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + emittery "0.10.0" + keccak "3.0.2" + leveldown "6.1.0" + secp256k1 "4.0.3" + optionalDependencies: + bufferutil "4.0.5" + utf-8-validate "5.0.7" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -5785,6 +6449,13 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" @@ -5906,7 +6577,20 @@ graphql@^16.7.1: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.0.tgz#374478b7f27b2dc6153c8f42c1b80157f79d79d4" integrity sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg== -hardhat@^2.16.1: +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +hardhat@^2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.1.tgz#4b6c8c8f624fd23d9f40185a4af24815d05a486a" integrity sha512-1PxRkfjhEzXs/wDxI5YgzYBxNmvzifBTjYzuopwel+vXpAhCudplusJthN5eig0FTs4qbi828DBIITEDh8x9LA== @@ -6071,6 +6755,11 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react- dependencies: react-is "^16.7.0" +hosted-git-info@^2.6.0: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + html-dom-parser@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-4.0.0.tgz#dc382fbbc9306f8c9b5aae4e3f2822e113a48709" @@ -6115,6 +6804,15 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -6169,6 +6867,16 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immediate@~3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== + immer@^9.0.21, immer@^9.0.6: version "9.0.21" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" @@ -6232,7 +6940,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6468,7 +7176,7 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: dependencies: which-typed-array "^1.1.11" -is-typedarray@1.0.0, is-typedarray@^1.0.0: +is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -6478,6 +7186,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -6518,6 +7231,11 @@ isomorphic-ws@^4.0.1: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + jayson@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" @@ -6551,7 +7269,7 @@ js-sdsl@^4.1.4: resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== -js-sha3@0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -6586,6 +7304,11 @@ jsbarcode@^3.8.0: resolved "https://registry.yarnpkg.com/jsbarcode/-/jsbarcode-3.11.5.tgz#390b3efd0271f35b9d68c7b8af6e972445969014" integrity sha512-zv3KsH51zD00I/LrFzFSM6dst7rDn0vIMzaiZFL7qusTjPZiPtxg3zxetp0RR7obmjTw4f6NyGgbdkBCgZUIrA== +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -6596,6 +7319,13 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -6624,12 +7354,17 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -6672,6 +7407,16 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -6682,6 +7427,23 @@ jsonparse@^1.2.0: object.assign "^4.1.4" object.values "^1.1.6" +keccak@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +keccak@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" @@ -6715,11 +7477,74 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" +level-codec@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== + dependencies: + buffer "^5.6.0" + +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== + dependencies: + catering "^2.1.0" + +level-concat-iterator@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + +level-errors@^2.0.0, level-errors@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" + +level-mem@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== + dependencies: + level-packager "^5.0.3" + memdown "^5.0.0" + +level-packager@^5.0.3: + version "5.1.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== + dependencies: + encoding-down "^6.3.0" + levelup "^4.3.2" + +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== + level-supports@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== +level-supports@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + dependencies: + xtend "^4.0.2" + level-transcoder@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" @@ -6728,6 +7553,15 @@ level-transcoder@^1.0.1: buffer "^6.0.3" module-error "^1.0.1" +level-ws@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== + dependencies: + inherits "^2.0.3" + readable-stream "^3.1.0" + xtend "^4.0.1" + level@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" @@ -6736,6 +7570,26 @@ level@^8.0.0: browser-level "^1.0.1" classic-level "^1.2.0" +leveldown@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== + dependencies: + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + +levelup@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== + dependencies: + deferred-leveldown "~5.3.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -6838,7 +7692,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.11, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6889,6 +7743,11 @@ lru_map@^0.3.3: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== + lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" @@ -6902,6 +7761,11 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + marked@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.2.tgz#3efdb27b1fd0ecec4f5aba362bddcd18120e5ba9" @@ -6941,6 +7805,18 @@ media-query-parser@^2.0.2: dependencies: "@babel/runtime" "^7.12.5" +memdown@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== + dependencies: + abstract-leveldown "~6.2.1" + functional-red-black-tree "~1.0.1" + immediate "~3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.2.0" + memory-level@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" @@ -6960,6 +7836,18 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== + dependencies: + "@types/levelup" "^4.3.0" + ethereumjs-util "^7.1.4" + level-mem "^5.0.1" + level-ws "^2.0.0" + readable-stream "^3.6.0" + semaphore-async-await "^1.5.1" + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -6973,12 +7861,20 @@ microseconds@0.2.0: resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -7033,6 +7929,18 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -7150,6 +8058,11 @@ napi-macros@^2.2.2: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7236,6 +8149,23 @@ node-fetch@^2.6.12: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +node-gyp-build@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.6.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" @@ -7251,6 +8181,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + oauth@^0.9.15: version "0.9.15" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" @@ -7500,6 +8435,11 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -7535,7 +8475,7 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.17: +pbkdf2@^3.0.17, pbkdf2@^3.0.9: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -7755,6 +8695,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -7800,6 +8745,16 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -7808,7 +8763,12 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== @@ -7838,13 +8798,18 @@ qrcode@1.5.3, qrcode@^1.5.1: pngjs "^5.0.0" yargs "^15.3.1" -qs@^6.10.3: +qs@^6.10.3, qs@^6.11.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + query-string@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" @@ -7916,7 +8881,7 @@ raf@^3.1.0: dependencies: performance-now "^2.1.0" -randombytes@^2.1.0: +randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -8197,7 +9162,7 @@ react@18.2.0: dependencies: loose-envify "^1.1.0" -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -8218,6 +9183,11 @@ real-require@^0.1.0: resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + redux-thunk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" @@ -8292,6 +9262,32 @@ remove-accents@0.4.2: resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== +request@^2.85.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -8384,7 +9380,14 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.3: +rlp@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + dependencies: + bn.js "^4.11.1" + +rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -8476,7 +9479,7 @@ safe-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -8530,7 +9533,7 @@ scrypt-js@3.0.1, scrypt-js@^3.0.0: resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -secp256k1@^4.0.1: +secp256k1@4.0.3, secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== @@ -8539,6 +9542,16 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" +seedrandom@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== + semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" @@ -8711,6 +9724,19 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" +solc@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.15.tgz#d274dca4d5a8b7d3c9295d4cbdc9291ee1c52152" + integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + sonic-boom@^2.2.1: version "2.8.0" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" @@ -8771,6 +9797,21 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stack-generator@^2.0.5: version "2.0.10" resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" @@ -8855,6 +9896,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -9050,6 +10096,16 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -9170,16 +10226,58 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + ts-easing@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.14.2: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -9238,6 +10336,11 @@ tweetnacl-util@^0.15.1: resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" @@ -9270,6 +10373,22 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +typechain@^8.0.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.1.tgz#dccbc839b94877997536c356380eff7325395cfb" + integrity sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" @@ -9326,6 +10445,16 @@ typescript@^4.1.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + ua-parser-js@^0.7.18: version "0.7.35" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307" @@ -9419,6 +10548,14 @@ uri-js@^4.2.2, uri-js@^4.4.1: dependencies: punycode "^2.1.0" +url@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" + integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== + dependencies: + punycode "^1.4.1" + qs "^6.11.0" + use-callback-ref@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" @@ -9446,6 +10583,13 @@ use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0, use-sync-external resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +utf-8-validate@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== + dependencies: + node-gyp-build "^4.3.0" + utf-8-validate@^5.0.2: version "5.0.10" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" @@ -9469,11 +10613,21 @@ util@^0.12.4: is-typed-array "^1.1.3" which-typed-array "^1.1.2" +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + valid-url@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" @@ -9487,6 +10641,15 @@ valtio@1.11.0: proxy-compare "2.5.1" use-sync-external-store "1.2.0" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + viem@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/viem/-/viem-1.6.0.tgz#8befa678c3ac79b9558dfd1708130b2ecb1994f4" @@ -9611,6 +10774,14 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + workerpool@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" @@ -9659,7 +10830,7 @@ ws@^8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -xtend@^4.0.1: +xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -9747,6 +10918,11 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 8fa70479c1765c92722f228dfc26a31bf3e8818e Mon Sep 17 00:00:00 2001 From: folathecoder Date: Tue, 5 Sep 2023 13:54:01 +0100 Subject: [PATCH 14/28] Create custom hook to get user wallet balance from Sepolia Chain Wallet --- contracts/structs/globalStructs.sol | 1 - contracts/tests/crowdfundTest.js | 2 +- src/wallet/useGetWalletBalance.tsx | 36 +++++++++++++++++++++++++++++ src/wallet/walletConfig.ts | 4 ++-- 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 src/wallet/useGetWalletBalance.tsx diff --git a/contracts/structs/globalStructs.sol b/contracts/structs/globalStructs.sol index 3516653..43094cf 100644 --- a/contracts/structs/globalStructs.sol +++ b/contracts/structs/globalStructs.sol @@ -52,7 +52,6 @@ struct Campaign { address payable creatorAddress; uint256 backersCount; Backer[] backers; - uint256 reportCount; address payable depositAddress; uint256[] dividendAmount; } diff --git a/contracts/tests/crowdfundTest.js b/contracts/tests/crowdfundTest.js index 11148d3..fcd9482 100644 --- a/contracts/tests/crowdfundTest.js +++ b/contracts/tests/crowdfundTest.js @@ -190,7 +190,7 @@ describe('CrowdfundContract Test', function () { }); const campaignData = await contract.campaigns(user1.address); - accountContractAddress = campaignData[8]; + accountContractAddress = campaignData[7]; expect(accountContractAddress.toString()).to.have.lengthOf(42); }); diff --git a/src/wallet/useGetWalletBalance.tsx b/src/wallet/useGetWalletBalance.tsx new file mode 100644 index 0000000..3afba43 --- /dev/null +++ b/src/wallet/useGetWalletBalance.tsx @@ -0,0 +1,36 @@ +import { useBalance } from 'wagmi'; + +interface DataType { + decimals: number; + formatted: string; + symbol: string; + value: bigint; +} + +interface ReturnType { + data?: DataType; + isLoading: boolean; + isFetching: boolean; + isSuccess: boolean; + isError: boolean; + isFetched: boolean; +} + +interface PropType { + userWalletAddress?: `0x${string}`; +} + +// Get Wallet Balance from User's Wallet using Wagmi Library + +const useGetWalletBalance = ({ userWalletAddress }: PropType): ReturnType => { + const { data, isError, isLoading, isSuccess, isFetching, isFetched } = + useBalance({ + address: userWalletAddress, + watch: true, + chainId: 11155111, + }); + + return { data, isError, isLoading, isSuccess, isFetching, isFetched }; +}; + +export default useGetWalletBalance; diff --git a/src/wallet/walletConfig.ts b/src/wallet/walletConfig.ts index d9f755f..2a3931f 100644 --- a/src/wallet/walletConfig.ts +++ b/src/wallet/walletConfig.ts @@ -7,7 +7,7 @@ import { import { alchemyProvider } from 'wagmi/providers/alchemy'; import { publicProvider } from 'wagmi/providers/public'; import { configureChains, createConfig, WagmiConfig } from 'wagmi'; -import { mainnet } from 'wagmi/chains'; +import { sepolia } from 'wagmi/chains'; import { SessionProvider } from 'next-auth/react'; import { RainbowKitSiweNextAuthProvider, @@ -15,7 +15,7 @@ import { } from '@rainbow-me/rainbowkit-siwe-next-auth'; const { chains, publicClient } = configureChains( - [mainnet], + [sepolia], [ alchemyProvider({ apiKey: `${process.env.NEXT_PUBLIC_ALCHEMY_API_KEY}` }), publicProvider(), From bd2bdbef335836edef2384efb2d2062109c7db49 Mon Sep 17 00:00:00 2001 From: folathecoder Date: Tue, 5 Sep 2023 14:41:56 +0100 Subject: [PATCH 15/28] Rendered the user wallet balance to the profile --- .../profile/children/ProfileMetrics.tsx | 17 +++++++--- .../profile/context/ProfileContext.tsx | 34 ++++++++++++++++++- src/wallet/useGetWalletBalance.tsx | 1 + 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/components/profile/children/ProfileMetrics.tsx b/src/components/profile/children/ProfileMetrics.tsx index bdde875..4e7aaca 100644 --- a/src/components/profile/children/ProfileMetrics.tsx +++ b/src/components/profile/children/ProfileMetrics.tsx @@ -1,4 +1,5 @@ -import React from 'react'; +import React, { useContext } from 'react'; +import { ProfileContext, ProfileReturnTypes } from '../context/ProfileContext'; import { MetricsContainer, MetricsCard, @@ -7,27 +8,33 @@ import { Button } from '@/components/global'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; const ProfileMetrics = () => { + const { profileMetrics } = useContext(ProfileContext) as ProfileReturnTypes; + + const { walletBalance } = profileMetrics; + return (

    Total Investment

    -

    0.00 {CURRENCY_SYMBOL}

    +

    0.0 {CURRENCY_SYMBOL}

    Wallet Balance

    -

    0.00 {CURRENCY_SYMBOL}

    +

    + {walletBalance} {CURRENCY_SYMBOL} +

    Total Dividend

    - 0.00 {CURRENCY_SYMBOL} + 0.0 {CURRENCY_SYMBOL} +0.0%

    Claimable Dividend

    -

    0.00 {CURRENCY_SYMBOL}

    +

    0.0 {CURRENCY_SYMBOL}

    diff --git a/src/components/profile/context/ProfileContext.tsx b/src/components/profile/context/ProfileContext.tsx index 9f16066..c455598 100644 --- a/src/components/profile/context/ProfileContext.tsx +++ b/src/components/profile/context/ProfileContext.tsx @@ -1,8 +1,10 @@ -import React, { useState, ReactElement } from 'react'; +import React, { useState, ReactElement, useEffect } from 'react'; +const { utils } = require('ethers'); import useGetUserByAddress from '@/hooks/RequestHooks/GET/useGetUserByAddress'; import { FetchingStatus } from '@/types/fetchingTypes'; import { UserProfileType } from '@/types/projectTypes'; import usePostAuth from '@/hooks/RequestHooks/POST/usePostAuth'; +import useGetWalletBalance from '@/wallet/useGetWalletBalance'; type Props = { children: JSX.Element; @@ -14,6 +16,14 @@ export interface ProfileReturnTypes { user: UserProfileType | null; fetchingStatus: FetchingStatus; error: string | null; + profileMetrics: ProfileMetricsType; +} + +interface ProfileMetricsType { + totalInvestment: number; + walletBalance: string; + totalDividend: number; + claimableDividend: number; } export const ProfileContext = React.createContext( @@ -25,8 +35,29 @@ export const ProfileProvider = ({ children }: Props): ReactElement => { const { user, error, fetchingStatus } = useGetUserByAddress({ jwtToken: userData?.token, }); + const { data: walletMetrics, isFetched } = useGetWalletBalance({ + userWalletAddress: userData?.walletAddress as `0x${string}`, + }); const [toggleSettings, setToggleSettings] = useState(false); + const [profileMetrics, setProfileMetrics] = useState({ + totalInvestment: 0, + walletBalance: '0.0', + totalDividend: 0, + claimableDividend: 0, + }); + + // Fetch and set the wallet balance state + useEffect(() => { + if (isFetched) { + setProfileMetrics((prevState) => ({ + ...prevState, + walletBalance: utils.formatEther(walletMetrics?.value ?? BigInt(0)), + })); + } + }, [isFetched, walletMetrics?.value]); + + // console.log(profileMetrics); return ( { user, error, fetchingStatus, + profileMetrics, }} > {children} diff --git a/src/wallet/useGetWalletBalance.tsx b/src/wallet/useGetWalletBalance.tsx index 3afba43..5cc7409 100644 --- a/src/wallet/useGetWalletBalance.tsx +++ b/src/wallet/useGetWalletBalance.tsx @@ -28,6 +28,7 @@ const useGetWalletBalance = ({ userWalletAddress }: PropType): ReturnType => { address: userWalletAddress, watch: true, chainId: 11155111, + formatUnits: 'ether', }); return { data, isError, isLoading, isSuccess, isFetching, isFetched }; From b865323b31d4b8f39fa3a3d285b1e10cca53eb1f Mon Sep 17 00:00:00 2001 From: folathecoder Date: Wed, 6 Sep 2023 17:41:52 +0100 Subject: [PATCH 16/28] Created Register user custom hook --- .env | 4 + contracts/abi/crowdfundContractABI.json | 5 - contracts/scripts/deploy.js | 20 ++++ hardhat.config.js | 20 +++- package.json | 4 +- .../profile/context/ProfileContext.tsx | 1 - src/helpers/checkAddressIsValid.ts | 6 ++ src/hooks/ContractHooks/useRegisterUser.tsx | 91 +++++++++++++++++++ src/hooks/RequestHooks/PATCH/usePatchUser.tsx | 1 + src/hooks/RequestHooks/POST/usePostAuth.tsx | 3 +- yarn.lock | 5 + 11 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 contracts/scripts/deploy.js create mode 100644 src/helpers/checkAddressIsValid.ts create mode 100644 src/hooks/ContractHooks/useRegisterUser.tsx diff --git a/.env b/.env index 3d55265..d42146c 100644 --- a/.env +++ b/.env @@ -5,3 +5,7 @@ NEXT_PUBLIC_BACKEND_URL=https://crowdlaunch-backend.fly.dev NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=ddfjqustf NEXT_PUBLIC_CLOUDINARY_API_KEY=928737954645779 NEXT_PUBLIC_ALCHEMY_API_KEY=9xeTvkkpEiR-PXbo-NmV12O3BkNWixrk +NEXT_PUBLIC_ETHERSCAN_API_KEY=CAM2IJY36H53V5MQGP4U6NGNYYH3ZUGBU2 +NEXT_PUBLIC_SEPOLIA_PRIVATE_KEY=7bba322ef8f78463c19f6db542c5831ce83d80e02766c0b1dd8504a7e65a8b83 +NEXT_PUBLIC_INFURA_API_KEY=8c2f0978d3394f98b1e3160bba2844ab +NEXT_PUBLIC_CONTRACT_ADDRESS=0xf265c5A02212c36f515206419dE3164eEf2cF0b6 \ No newline at end of file diff --git a/contracts/abi/crowdfundContractABI.json b/contracts/abi/crowdfundContractABI.json index 0b65685..87efd52 100644 --- a/contracts/abi/crowdfundContractABI.json +++ b/contracts/abi/crowdfundContractABI.json @@ -446,11 +446,6 @@ "name": "backersCount", "type": "uint256" }, - { - "internalType": "uint256", - "name": "reportCount", - "type": "uint256" - }, { "internalType": "address payable", "name": "depositAddress", diff --git a/contracts/scripts/deploy.js b/contracts/scripts/deploy.js new file mode 100644 index 0000000..eb5c0cc --- /dev/null +++ b/contracts/scripts/deploy.js @@ -0,0 +1,20 @@ +const CAMPAIGN_FEE = ethers.utils.parseEther('0.00001'); +const NFT_LISTING_FEE = ethers.utils.parseEther('0.00001'); + +async function main() { + const [deployer] = await ethers.getSigners(); + + console.log('Deploying contracts with the account:', deployer.address); + + const ContractFactory = await ethers.getContractFactory('CampaignContract'); + const contract = await ContractFactory.deploy(CAMPAIGN_FEE, NFT_LISTING_FEE); + + console.log('contract address:', contract.address); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/hardhat.config.js b/hardhat.config.js index df9c7c6..99b5712 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -1,8 +1,26 @@ -/** @type import('hardhat/config').HardhatUserConfig */ +// /** @type import('hardhat/config').HardhatUserConfig */ require('@nomiclabs/hardhat-ethers'); require('@nomiclabs/hardhat-waffle'); +require('dotenv').config(); + +const { + NEXT_PUBLIC_ETHERSCAN_API_KEY, + NEXT_PUBLIC_SEPOLIA_PRIVATE_KEY, + NEXT_PUBLIC_INFURA_API_KEY, +} = process.env; module.exports = { solidity: '0.8.2', + defaultNetwork: 'sepolia', plugins: [require('@nomiclabs/hardhat-waffle')], + etherscan: { + apikey: `${NEXT_PUBLIC_ETHERSCAN_API_KEY}`, + }, + networks: { + hardhat: {}, + sepolia: { + url: `https://sepolia.infura.io/v3/${NEXT_PUBLIC_INFURA_API_KEY}`, + accounts: [`${NEXT_PUBLIC_SEPOLIA_PRIVATE_KEY}`], + }, + }, }; diff --git a/package.json b/package.json index c0ce2b9..fadadbd 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "deploy": "npx hardhat run contracts/scripts/deploy.js --network sepolia" }, "dependencies": { "@cloudinary/react": "^1.11.2", @@ -35,6 +36,7 @@ "axios": "^1.4.0", "chai": "^4.3.7", "cloudinary-react": "^1.8.1", + "dotenv": "^16.3.1", "draft-js": "^0.11.7", "eslint": "8.43.0", "eslint-config-next": "13.4.7", diff --git a/src/components/profile/context/ProfileContext.tsx b/src/components/profile/context/ProfileContext.tsx index c455598..7893487 100644 --- a/src/components/profile/context/ProfileContext.tsx +++ b/src/components/profile/context/ProfileContext.tsx @@ -57,7 +57,6 @@ export const ProfileProvider = ({ children }: Props): ReactElement => { } }, [isFetched, walletMetrics?.value]); - // console.log(profileMetrics); return ( { + return ( + address !== ('0x0000000000000000000000000000000000000000' as `0x${string}`) + ); +}; diff --git a/src/hooks/ContractHooks/useRegisterUser.tsx b/src/hooks/ContractHooks/useRegisterUser.tsx new file mode 100644 index 0000000..33765a1 --- /dev/null +++ b/src/hooks/ContractHooks/useRegisterUser.tsx @@ -0,0 +1,91 @@ +import { useEffect, useState } from 'react'; +import { + usePrepareContractWrite, + useContractWrite, + useContractRead, + useWaitForTransaction, +} from 'wagmi'; +import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; +import useWallet from '@/wallet/useWallet'; +import { checkAddressIsValid } from 'src/helpers/checkAddressIsValid'; + +interface ReturnType { + handleRegisterUser: () => void; + isRegisterSuccess: boolean; + isRegisterLoading: boolean; + isRegisterIdle: boolean; + isRegisterError: boolean; + isReadingUserError: boolean; + isReadingUserLoading: boolean; +} + +const useRegisterUser = (): ReturnType => { + const { wallet } = useWallet(); + const [isUserRegistered, setIsUserRegistered] = useState(false); + + // Prepare contract write configuration for registerUser function + const { config: registerUserConfig } = usePrepareContractWrite({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: 'registerUser', + chainId: 11155111, + account: wallet.walletAddress as `0x${string}`, + }); + + // Write user data to the contract + const { write: registerUserOnContract, data: registerUserData } = + useContractWrite(registerUserConfig); + + // Wait for the registerUser function transaction to complete + const { + isSuccess: isRegisterSuccess, + isLoading: isRegisterLoading, + isError: isRegisterError, + isIdle: isRegisterIdle, + } = useWaitForTransaction({ + hash: registerUserData?.hash, + }); + + // Read user data from the contract + const { + data: userData, + isError: isReadingUserError, + isLoading: isReadingUserLoading, + } = useContractRead({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: 'users', + chainId: 11155111, + account: wallet.walletAddress as `0x${string}`, + args: [wallet.walletAddress as `0x${string}`], + }); + + // Convert userData to an array of strings + const readData = userData as Array; + + // Check if user is already registered on the contract and save the status + useEffect(() => { + if (readData) { + setIsUserRegistered(checkAddressIsValid(readData[2] as `0x${string}`)); + } + }, [readData]); + + // Function to register a user on the blockchain via the contract + const handleRegisterUser = async () => { + if (!isUserRegistered) { + registerUserOnContract?.(); + } + }; + + return { + handleRegisterUser, + isRegisterSuccess, + isRegisterLoading, + isRegisterIdle, + isRegisterError, + isReadingUserError, + isReadingUserLoading, + }; +}; + +export default useRegisterUser; diff --git a/src/hooks/RequestHooks/PATCH/usePatchUser.tsx b/src/hooks/RequestHooks/PATCH/usePatchUser.tsx index 26f0bc4..63cc287 100644 --- a/src/hooks/RequestHooks/PATCH/usePatchUser.tsx +++ b/src/hooks/RequestHooks/PATCH/usePatchUser.tsx @@ -3,6 +3,7 @@ import { useState } from 'react'; import { FetchingStatus } from '@/types/fetchingTypes'; import { UserUpdateType } from '@/types/projectTypes'; + interface UserReturnType { fetchingStatus: FetchingStatus; error: any; diff --git a/src/hooks/RequestHooks/POST/usePostAuth.tsx b/src/hooks/RequestHooks/POST/usePostAuth.tsx index 5657af6..b065cab 100644 --- a/src/hooks/RequestHooks/POST/usePostAuth.tsx +++ b/src/hooks/RequestHooks/POST/usePostAuth.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from 'react'; import { FetchingStatus } from '@/types/fetchingTypes'; import useWallet from '@/wallet/useWallet'; -import { useDispatch, useSelector } from 'react-redux'; +import { useDispatch } from 'react-redux'; import { setToggleSettings } from '@/redux/slices/profileSettingSlice'; export interface AuthType { @@ -24,6 +24,7 @@ const usePostAuth = (): AuthReturnType => { const dispatch = useDispatch(); const { wallet } = useWallet(); + const [userData, setUserData] = useState(null); const [error, setError] = useState(null); const [fetchingStatus, setFetchingStatus] = useState( diff --git a/yarn.lock b/yarn.lock index ec59bb4..bbf59e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5386,6 +5386,11 @@ domutils@^3.1.0: domelementtype "^2.3.0" domhandler "^5.0.3" +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + draft-js@^0.11.7: version "0.11.7" resolved "https://registry.yarnpkg.com/draft-js/-/draft-js-0.11.7.tgz#be293aaa255c46d8a6647f3860aa4c178484a206" From e8e7c3428f4380c47ee2430b7233084236b2e8d1 Mon Sep 17 00:00:00 2001 From: folathecoder Date: Thu, 7 Sep 2023 00:45:54 +0100 Subject: [PATCH 17/28] Implemented create campaign hook --- contracts/scripts/deploy.js | 2 + package.json | 2 + src/components/global/button/button.tsx | 12 ++ src/components/global/index.ts | 2 + .../global/loader/transactionLoader.tsx | 18 ++ .../profile/children/ProfileMetrics.tsx | 2 +- .../FormBodyTabs/ProjectCreatorTab.tsx | 113 ++++++++-- src/data/appInfo.ts | 4 +- src/helpers/formatters.ts | 22 ++ src/helpers/weiConverter.ts | 6 + src/hooks/ContractHooks/useCreateCampaign.tsx | 78 +++++++ src/hooks/ContractHooks/useRegisterUser.tsx | 4 +- src/styles/global.css | 194 ++++++++++++++++++ yarn.lock | 48 ++++- 14 files changed, 488 insertions(+), 19 deletions(-) create mode 100644 src/components/global/loader/transactionLoader.tsx create mode 100644 src/helpers/weiConverter.ts create mode 100644 src/hooks/ContractHooks/useCreateCampaign.tsx diff --git a/contracts/scripts/deploy.js b/contracts/scripts/deploy.js index eb5c0cc..efac0e1 100644 --- a/contracts/scripts/deploy.js +++ b/contracts/scripts/deploy.js @@ -1,3 +1,5 @@ +const { ethers } = require('hardhat'); + const CAMPAIGN_FEE = ethers.utils.parseEther('0.00001'); const NFT_LISTING_FEE = ethers.utils.parseEther('0.00001'); diff --git a/package.json b/package.json index fadadbd..b324e32 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "eslint-config-next": "13.4.7", "ethereum-waffle": "^4.0.10", "ethers": "^5", + "file-loader": "^6.2.0", "framer-motion": "^10.12.18", "graphql": "^16.7.1", "graphql-request": "^6.1.0", @@ -82,6 +83,7 @@ "ts-node": "^10.9.1", "tss-react": "^4.9.0", "typescript": "5.1.3", + "url-loader": "^4.1.1", "use-clipboard-copy": "^0.2.0", "viem": "^1.6.4", "wagmi": "^1.3.10" diff --git a/src/components/global/button/button.tsx b/src/components/global/button/button.tsx index 5483d18..0b14638 100644 --- a/src/components/global/button/button.tsx +++ b/src/components/global/button/button.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { useRouter } from 'next/router'; import styled from 'styled-components'; import { QUERIES } from '@/styles/mediaQueries'; +import { TransactionLoader } from '@/components/global'; export const ButtonContainer = styled.button` display: inline-flex; @@ -30,6 +31,10 @@ export const ButtonContainer = styled.button` outline: none; } + span { + margin-left: 8px; + } + @media ${QUERIES.mobile} { height: 40px; padding: 11px 12.703px 12px 17px; @@ -41,6 +46,7 @@ interface ButtonTypes { buttonType: 'link' | 'action'; buttonLink?: string; buttonFunction?: () => void; + showLoader?: boolean; } const Button = ({ @@ -48,6 +54,7 @@ const Button = ({ buttonType, buttonLink, buttonFunction, + showLoader, }: ButtonTypes) => { const router = useRouter(); @@ -62,6 +69,11 @@ const Button = ({ return ( {buttonTitle} + {showLoader && ( + + + + )} ); }; diff --git a/src/components/global/index.ts b/src/components/global/index.ts index 0bddf19..77ab431 100644 --- a/src/components/global/index.ts +++ b/src/components/global/index.ts @@ -13,6 +13,7 @@ import CustomSkeleton from '@/components/global/customSkeleton/customSkeleton'; import LottieImage from '@/components/global/lottieImage/lottieImage'; import CroppedImage from '@/components/global/images/croppedImage'; import BarcodeGenerator from '@/components/global/barcode/barcode'; +import TransactionLoader from '@/components/global/loader/transactionLoader'; export { Header, @@ -30,4 +31,5 @@ export { LottieImage, CroppedImage, BarcodeGenerator, + TransactionLoader, }; diff --git a/src/components/global/loader/transactionLoader.tsx b/src/components/global/loader/transactionLoader.tsx new file mode 100644 index 0000000..a6ccd52 --- /dev/null +++ b/src/components/global/loader/transactionLoader.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +const TransactionLoader = () => { + return ( +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + ); +}; + +export default TransactionLoader; diff --git a/src/components/profile/children/ProfileMetrics.tsx b/src/components/profile/children/ProfileMetrics.tsx index 4e7aaca..de20136 100644 --- a/src/components/profile/children/ProfileMetrics.tsx +++ b/src/components/profile/children/ProfileMetrics.tsx @@ -22,7 +22,7 @@ const ProfileMetrics = () => {

    Wallet Balance

    - {walletBalance} {CURRENCY_SYMBOL} + {Number(walletBalance).toFixed(3)} {CURRENCY_SYMBOL}

    diff --git a/src/components/project/ProjectCreation/Children/FormBodyTabs/ProjectCreatorTab.tsx b/src/components/project/ProjectCreation/Children/FormBodyTabs/ProjectCreatorTab.tsx index c4fc664..3ce2117 100644 --- a/src/components/project/ProjectCreation/Children/FormBodyTabs/ProjectCreatorTab.tsx +++ b/src/components/project/ProjectCreation/Children/FormBodyTabs/ProjectCreatorTab.tsx @@ -16,6 +16,10 @@ import { Notification } from '@/components/global'; import { initialProjectFormData } from '@/components/project/ProjectCreation/ProjectCreationContext'; import Confetti from 'react-confetti'; import useWindowSize from 'react-use/lib/useWindowSize'; +import useRegisterUser from '@/hooks/ContractHooks/useRegisterUser'; +import Tooltip from '@mui/material/Tooltip'; +import useCreateCampaign from '@/hooks/ContractHooks/useCreateCampaign'; +import { CAMPAIGN_FEE } from '@/data/appInfo'; const ProjectCreatorTab = () => { const router = useRouter(); @@ -26,11 +30,14 @@ const ProjectCreatorTab = () => { const [notificationMessage, setNotificationMessage] = useState(''); const [showNotification, setShowNotification] = useState(false); const [projectCreated, setProjectCreated] = useState(false); + const [showFundButton, setShowFundButton] = useState(false); const { projectFormData, setProjectFormData, setActiveTab } = useContext( ProjectCreactionContext ) as ProjectCreactionContextReturnTypes; + const { main } = projectFormData; + const { createProject, projectCreationStatus, @@ -38,6 +45,25 @@ const ProjectCreatorTab = () => { projectData, } = usePostProject({ data: projectFormData }); + const { + handleRegisterUser, + isRegisterSuccess, + isRegisterLoading, + isRegisterError, + isUserRegistered, + } = useRegisterUser(); + + const { + createCampaign, + isCreationSuccess, + isCreationLoading, + isCreationError, + } = useCreateCampaign({ + targetAmount: main.targetAmount, + minInvestment: main.minInvestment, + endDate: main.noOfDaysLeft, + }); + const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; @@ -53,6 +79,31 @@ const ProjectCreatorTab = () => { // Get current date in format YYYY-MM-DD const currentDate = new Date().toISOString().split('T')[0]; + useEffect(() => { + if (isUserRegistered) { + setShowFundButton(isUserRegistered); + } + }, [isUserRegistered]); + + useEffect(() => { + if (isRegisterSuccess) { + setShowFundButton(isRegisterSuccess); + setShowNotification(true); + setNotificationMessage( + 'Congratulations! You have successfully registered an account on the blockchain. You can now create a campaign.' + ); + } + }, [isRegisterSuccess]); + + useEffect(() => { + if (isRegisterError) { + setShowNotification(true); + setNotificationMessage( + 'An error has occurred while registering your account. Check that you have enough gas to complete the transaction.' + ); + } + }, [isRegisterError]); + useEffect(() => { if (projectCreationStatus === 2) { setRequestCompletionCount(1); @@ -117,6 +168,25 @@ const ProjectCreatorTab = () => { setActiveTab(0); }; + useEffect(() => { + if (isCreationSuccess) { + handleProjectCreation(); + setShowNotification(true); + setNotificationMessage( + 'Congratulations, your campaign has been created on the blockchain. We are preparing your campaign for funding.' + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isCreationSuccess]); + + useEffect(() => { + if (isCreationError) { + setNotificationMessage( + 'Project creation was not successful: Ensure you have enough funds for a campaign fee and gas.' + ); + } + }, [isCreationError]); + return ( @@ -127,8 +197,8 @@ const ProjectCreatorTab = () => {

    - For every project initiation on our platform, a nominal service - fee of 0.1 ETH, or its equivalent, will be applied. + {`For every project initiation on our platform, a nominal service + fee of ${CAMPAIGN_FEE} ETH, or its equivalent, will be applied.`}

    @@ -174,22 +244,41 @@ const ProjectCreatorTab = () => { buttonType="action" buttonFunction={() => setActiveTab(7)} /> -
    { fontSize: '14px', }} > - Share Price: 0 ETH + Share Price: {nftValue === '' ? 0 : nftValue} {CURRENCY_SYMBOL}

    diff --git a/src/components/project/Children/FundProject/FundProject.tsx b/src/components/project/Children/FundProject/FundProject.tsx index cab8500..02801c2 100644 --- a/src/components/project/Children/FundProject/FundProject.tsx +++ b/src/components/project/Children/FundProject/FundProject.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useState } from 'react'; +import React, { useContext, useState, useEffect } from 'react'; import { ProjectDetailContext, ProjectDetailContextReturnTypes, @@ -9,11 +9,13 @@ import { ProgressWrapper, FundItem, } from './FundProjectStyles'; -import { ProgressBar } from '@/components/global'; -import { secondsToDays } from '@/helpers/formatters'; +import { ProgressBar, TransactionLoader, Timer } from '@/components/global'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; import useWallet from '@/wallet/useWallet'; import { Notification } from '@/components/global'; +import useRegisterUser from '@/hooks/ContractHooks/useRegisterUser'; +import useGetCampaign from '@/hooks/ContractHooks/useGetCmapaign'; +import { weiConverter, weiToEther } from '@/helpers/weiConverter'; export const fundings: FundProjectTypes = { target: { @@ -60,14 +62,48 @@ const FundProject = ({ }: FundProjectTypes) => { const { wallet } = useWallet(); const { userData } = useContext(AppContext) as AppContextReturnTypes; - const [fundAmount, setFundAmount] = useState(''); + const { fundAmount, setFundAmount, generateNftImage, project } = useContext( + ProjectDetailContext + ) as ProjectDetailContextReturnTypes; + const [notificationMessage, setNotificationMessage] = useState(''); const [showNotification, setShowNotification] = useState(false); + const [showFundButton, setShowFundButton] = useState(false); + // Get the project data from the backend const { project: data } = useContext( ProjectDetailContext ) as ProjectDetailContextReturnTypes; + // Handle user registeration on the smart contract before user funds a campaign + const { + handleRegisterUser, + isRegisterSuccess, + isRegisterLoading, + isUserRegistered, + } = useRegisterUser(); + + // Get updated campaign funding data from the smart contract + const { campaign } = useGetCampaign({ + projectAddress: project?.project.projectWalletAddress as `0x${string}`, + }); + + useEffect(() => { + if (isUserRegistered) { + setShowFundButton(isUserRegistered); + } + }, [isUserRegistered]); + + useEffect(() => { + if (isRegisterSuccess) { + setShowFundButton(isRegisterSuccess); + setShowNotification(true); + setNotificationMessage( + 'Congratulations! You have successfully registered an account on the blockchain. You can now fund the campaign.' + ); + } + }, [isRegisterSuccess]); + const handleInputChange = (e: React.ChangeEvent) => { const { value } = e.target; setFundAmount(Number(value)); @@ -77,9 +113,11 @@ const FundProject = ({ if ( fundAmount !== 0 && fundAmount !== '' && - wallet.walletStatus.isConnected + wallet.walletStatus.isConnected && + campaign?.campaignStatus === 1 ) { - // Fund project logic + // Generate NFT URL + generateNftImage(); } else { setShowNotification(true); fundErrorMessage(); @@ -105,29 +143,29 @@ const FundProject = ({ return ( - {data?.project && ( + {campaign && ( )}

    - {data?.project.targetAmount + {Number(campaign?.targetAmount) ? ` - ${data?.project.targetAmount.toLocaleString()} ${CURRENCY_SYMBOL}` + ${Number(campaign?.targetAmount).toFixed(3)} ${CURRENCY_SYMBOL}` : '--'}

    {target.title}

    - {data?.project.amountRaised + {Number(campaign?.raisedAmount) ? ` - ${data?.project.amountRaised.toLocaleString()} ${CURRENCY_SYMBOL}` - : data?.project.amountRaised === 0 + ${Number(campaign?.raisedAmount).toFixed(3)} ${CURRENCY_SYMBOL}` + : Number(campaign?.raisedAmount) === 0 ? `0 ${CURRENCY_SYMBOL}` : '--'}

    @@ -135,17 +173,17 @@ const FundProject = ({

    - {data?.project.minInvestment - ? `${data?.project.minInvestment.toLocaleString()} ${CURRENCY_SYMBOL}` + {Number(campaign?.minFunding) + ? `${Number(campaign?.minFunding).toFixed(3)} ${CURRENCY_SYMBOL}` : '--'}

    {investment.title}

    - {data?.project.noOfInvestors - ? `${data?.project.noOfInvestors.toLocaleString()}` - : data?.project.noOfInvestors === 0 + {campaign?.backersCount + ? `${campaign?.backersCount}` + : campaign?.backersCount === 0 ? '0' : '--'}

    @@ -153,28 +191,54 @@ const FundProject = ({

    - {data?.project.noOfDaysLeft - ? `${secondsToDays(data?.project.noOfDaysLeft).toLocaleString()}` - : '--'} + {data?.project.createdAt && campaign?.targetDeadline ? ( + + ) : ( + '--' + )}

    {deadline.title}

    {userData?.token && wallet.walletAddress && - wallet.walletStatus.isConnected && ( + wallet.walletStatus.isConnected && + campaign?.campaignStatus === 1 && ( )} - + {showFundButton ? ( + + ) : ( + + )}
    { - const { project, updateCount } = useContext( + const { project, updateCount, fundAmount } = useContext( ProjectDetailContext ) as ProjectDetailContextReturnTypes; @@ -55,13 +57,25 @@ const MainProject: React.FC = () => { setActiveContent(active); }; + // Get updated campaign funding data from the smart contract + const { campaign } = useGetCampaign({ + projectAddress: project?.project.projectWalletAddress as `0x${string}`, + }); + + const isWalletAvailable = campaign?.depositAddress + ? checkAddressIsValid(campaign.depositAddress) + : false; + return (
      - {internalLinkData.map((data, index) => { + {(isWalletAvailable + ? internalLinkData + : internalLinkData.slice(0, 2) + ).map((data, index) => { const isActive = activeContent === index; return ( { color2: project?.project.customColour.bgColour2 || '', }, }} + projectURL={`${APP_URL}/project/${project?.project.projectId}`} + nftValue={fundAmount} /> {project?.project.projectName && ( diff --git a/src/components/project/Children/MiniChildren/Campaign/Campaign.tsx b/src/components/project/Children/MiniChildren/Campaign/Campaign.tsx index 32b0776..b1bc538 100644 --- a/src/components/project/Children/MiniChildren/Campaign/Campaign.tsx +++ b/src/components/project/Children/MiniChildren/Campaign/Campaign.tsx @@ -64,7 +64,6 @@ const Campaign = (props: Props) => {
    - {contents[activeContent]} ); diff --git a/src/components/project/ProjectCreation/Children/FormBodyTabs/NFTCreatorTab.tsx b/src/components/project/ProjectCreation/Children/FormBodyTabs/NFTCreatorTab.tsx index 1261cd8..8b78a58 100644 --- a/src/components/project/ProjectCreation/Children/FormBodyTabs/NFTCreatorTab.tsx +++ b/src/components/project/ProjectCreation/Children/FormBodyTabs/NFTCreatorTab.tsx @@ -1,12 +1,5 @@ import Image from 'next/image'; -import React, { - useState, - useCallback, - useRef, - ChangeEvent, - useContext, - useEffect, -} from 'react'; +import React, { useCallback, useRef, ChangeEvent, useContext } from 'react'; import { ProjectCreactionContext, ProjectCreactionContextReturnTypes, diff --git a/src/contexts/ProjectDetailContext.tsx b/src/contexts/ProjectDetailContext.tsx index f8bcb41..84461ba 100644 --- a/src/contexts/ProjectDetailContext.tsx +++ b/src/contexts/ProjectDetailContext.tsx @@ -1,4 +1,15 @@ -import React, { ReactElement, ReactNode, useState, useEffect } from 'react'; +import React, { + ReactElement, + ReactNode, + useState, + useEffect, + Ref, + useCallback, + useRef, + ChangeEvent, + useContext, +} from 'react'; +import { toPng } from 'html-to-image'; import useGetProjectById from '@/hooks/RequestHooks/GET/useGetProjectById'; import { ProjectDetailType } from '@/types/projectTypes'; import { FetchingStatus } from '@/types/fetchingTypes'; @@ -15,6 +26,11 @@ export interface ProjectDetailContextReturnTypes { projectId: string; updateCount: number; setUpdateCount: React.Dispatch>; + fundAmount: number | ''; + setFundAmount: React.Dispatch>; + rawNftImageUrl: string; + nftImageRef: React.RefObject; + generateNftImage: () => void; } interface PropTypes { @@ -40,7 +56,11 @@ const ProjectDetailProvider = ({ const [isProjectCreator, setIsProjectCreator] = useState(false); const [updateCount, setUpdateCount] = useState(0); + const [fundAmount, setFundAmount] = useState(''); + const [rawNftImageUrl, setRawNftImageUrl] = useState(''); + // Check if the project creator is the active view for the project + // Make creator functionalities accessible to the user if, a creator useEffect(() => { setIsProjectCreator( user?.user.userId === project?.project.userId && @@ -52,6 +72,29 @@ const ProjectDetailProvider = ({ wallet.walletStatus.isConnected, ]); + const nftImageRef = useRef(null); + + // Callback used to generate NFT image template URl for IPFS + const generateNftImage = useCallback(() => { + if (nftImageRef.current === null) { + return; + } + + toPng(nftImageRef.current, { cacheBust: true }) + .then((dataUrl) => { + const link = document.createElement('a'); + link.href = dataUrl; + link.download = `nft-template.png`; + link.click(); + setRawNftImageUrl(dataUrl); + }) + .catch((err) => { + console.log(err); + }); + }, [nftImageRef]); + + console.log(rawNftImageUrl); + return ( {children} diff --git a/src/helpers/weiConverter.ts b/src/helpers/weiConverter.ts index 76d4fed..4496dd4 100644 --- a/src/helpers/weiConverter.ts +++ b/src/helpers/weiConverter.ts @@ -1,6 +1,13 @@ +import { utils } from 'ethers'; + // Convert Ether value to Wei export const weiConverter = (etherValue: number): bigint => { // Convert Ether to Wei using the conversion factor const weiValue: bigint = BigInt(Math.floor(etherValue * 1e18)); return weiValue; }; + +export function weiToEther(wei: bigint): string { + const ether = utils.formatEther(wei); + return ether; +} diff --git a/src/hooks/ContractHooks/useGetCmapaign.tsx b/src/hooks/ContractHooks/useGetCmapaign.tsx new file mode 100644 index 0000000..94eb3a5 --- /dev/null +++ b/src/hooks/ContractHooks/useGetCmapaign.tsx @@ -0,0 +1,72 @@ +import { useEffect, useState } from 'react'; +import { useContractRead } from 'wagmi'; +import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; +import { weiToEther } from '@/helpers/weiConverter'; + +interface ReturnType { + campaign: CampaignDataType | null; + isCampaignDataError: boolean; + isCampaignDataLoading: boolean; +} + +interface PropType { + projectAddress: `0x${string}`; +} + +interface CampaignStatus { + NotStarted: number; // 0 + Active: number; // 1 + Paused: number; // 2 + Expired: number; // 3 + Completed: number; // 4 + Cancelled: number; // 5 +} + +interface CampaignDataType { + campaignStatus: number; + raisedAmount: string; + targetAmount: string; + targetDeadline: number; + minFunding: string; + creatorAddress: `0x${string}`; + backersCount: number; + depositAddress: `0x${string}`; +} + +const useGetCampaign = ({ projectAddress }: PropType): ReturnType => { + const [campaign, setCampaign] = useState(null); + + // Read campaign data from the contract + const { + data: campaignData, + isError: isCampaignDataError, + isLoading: isCampaignDataLoading, + } = useContractRead({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: 'campaigns', + chainId: 11155111, + args: [projectAddress as `0x${string}`], + }); + + const campaignReadData = campaignData as Array; + + // Destruct the array into a readable object + useEffect(() => { + if (campaignReadData) + setCampaign({ + campaignStatus: campaignReadData[0], + raisedAmount: weiToEther(campaignReadData[1]), + targetAmount: weiToEther(campaignReadData[2]), + minFunding: weiToEther(campaignReadData[3]), + targetDeadline: Number(campaignReadData[4]), + creatorAddress: campaignReadData[5], + backersCount: Number(campaignReadData[6]), + depositAddress: campaignReadData[7], + }); + }, [campaignReadData]); + + return { campaign, isCampaignDataError, isCampaignDataLoading }; +}; + +export default useGetCampaign; diff --git a/src/styles/global.css b/src/styles/global.css index 7a60d67..90a8b49 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,3 +1,7 @@ +.accent-color { + color: #c2177e !important; +} + .gradient-link { font-size: 15px; font-family: Inter; From 02430b33791dbdbdbc8416ce11245f421cf87c93 Mon Sep 17 00:00:00 2001 From: folathecoder Date: Fri, 8 Sep 2023 16:36:50 +0100 Subject: [PATCH 19/28] Created custom nftupload hook --- package.json | 1 + .../global/nft/NFTImageTemplate.tsx | 11 +- .../Children/FundProject/FundProject.tsx | 3 +- .../Children/MainProject/MainProject.tsx | 2 +- src/contexts/ProjectDetailContext.tsx | 4 +- src/helpers/formatters.ts | 18 + ...{useGetCmapaign.tsx => useGetCampaign.tsx} | 0 src/hooks/ContractHooks/useGetTokenId.tsx | 28 + src/hooks/useUploadToIpfs.tsx | 38 + yarn.lock | 663 +++++++++++++++++- 10 files changed, 755 insertions(+), 13 deletions(-) rename src/hooks/ContractHooks/{useGetCmapaign.tsx => useGetCampaign.tsx} (100%) create mode 100644 src/hooks/ContractHooks/useGetTokenId.tsx create mode 100644 src/hooks/useUploadToIpfs.tsx diff --git a/package.json b/package.json index b324e32..b8b873f 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "graphql-request": "^6.1.0", "html-react-parser": "^4.2.0", "html-to-image": "^1.11.11", + "ipfs-http-client": "^60.0.1", "lodash": "^4.17.21", "lodash.debounce": "^4.0.8", "moment": "^2.29.4", diff --git a/src/components/global/nft/NFTImageTemplate.tsx b/src/components/global/nft/NFTImageTemplate.tsx index d4d4960..c86a520 100644 --- a/src/components/global/nft/NFTImageTemplate.tsx +++ b/src/components/global/nft/NFTImageTemplate.tsx @@ -1,5 +1,5 @@ import React, { useContext } from 'react'; -import { toPng } from 'html-to-image'; +import useGetTokenId from '@/hooks/ContractHooks/useGetTokenId'; import { NftStylesType } from '@/components/project/ProjectCreation/Children/FormBodyTabs/NFTCreatorTab'; import { BarcodeGenerator } from '@/components/global'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; @@ -7,6 +7,7 @@ import { ProjectDetailContext, ProjectDetailContextReturnTypes, } from '@/contexts/ProjectDetailContext'; +import { formatNumberWithDashes } from '@/helpers/formatters'; interface NFTImageTypes { nftStyle: NftStylesType; @@ -21,9 +22,13 @@ const NFTImageTemplate = ({ projectURL, nftValue, }: NFTImageTypes) => { - const { rawNftImageUrl, nftImageRef } = useContext( + const { nftImageRef } = useContext( ProjectDetailContext ) as ProjectDetailContextReturnTypes; + + // Get the next available NFT token ID from the smart contract + const { nextTokenId } = useGetTokenId(); + return (
    - 000-0000-000-0000 + {formatNumberWithDashes(nextTokenId)}

    { return secondsDifference; }; + +export const formatNumberWithDashes = (num: number): string => { + // Convert the number to a string and pad it with zeros to a length of 4 + const paddedNum = num.toString().padStart(4, '0'); + + // Split the number into parts: "0000" "0000" "000" "0001" + const parts = [ + paddedNum.slice(0, 4), + paddedNum.slice(4, 8), + paddedNum.slice(8, 11), + paddedNum.slice(11), + ].filter((part) => part !== ''); // Remove empty parts + + // Join the parts with dashes + const formattedNumber = parts.join('-'); + + return formattedNumber; +}; diff --git a/src/hooks/ContractHooks/useGetCmapaign.tsx b/src/hooks/ContractHooks/useGetCampaign.tsx similarity index 100% rename from src/hooks/ContractHooks/useGetCmapaign.tsx rename to src/hooks/ContractHooks/useGetCampaign.tsx diff --git a/src/hooks/ContractHooks/useGetTokenId.tsx b/src/hooks/ContractHooks/useGetTokenId.tsx new file mode 100644 index 0000000..40bd17e --- /dev/null +++ b/src/hooks/ContractHooks/useGetTokenId.tsx @@ -0,0 +1,28 @@ +import { useContractRead } from 'wagmi'; +import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; + +interface ReturnType { + nextTokenId: number; + isTokenIdError: boolean; + isTokenIdLoading: boolean; +} + +const useGetTokenId = (): ReturnType => { + // Read token id data from the contract + const { + data: tokenIdData, + isError: isTokenIdError, + isLoading: isTokenIdLoading, + } = useContractRead({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: '_nextTokenId', + chainId: 11155111, + }); + + const nextTokenId = Number(tokenIdData) + 1; + + return { nextTokenId, isTokenIdError, isTokenIdLoading }; +}; + +export default useGetTokenId; diff --git a/src/hooks/useUploadToIpfs.tsx b/src/hooks/useUploadToIpfs.tsx new file mode 100644 index 0000000..f448ccc --- /dev/null +++ b/src/hooks/useUploadToIpfs.tsx @@ -0,0 +1,38 @@ +import { useState } from 'react'; +import { create as ipfsHttpClient } from 'ipfs-http-client'; + +// Replace with your IPFS HTTP API endpoint +const ipfsOptions = { + url: 'https://ipfs.infura.io:5001/api/v0', +}; + +const client = ipfsHttpClient(ipfsOptions); + +interface UploadToIpfsResult { + ipfsUrl: string | null; + uploading: boolean; + uploadFileToIpfs: (file: File) => Promise; +} + +const useUploadToIpfs = (): UploadToIpfsResult => { + const [ipfsUrl, setIpfsUrl] = useState(null); + const [uploading, setUploading] = useState(false); + + const uploadFileToIpfs = async (file: File): Promise => { + try { + setUploading(true); + + const added = await client.add({ content: file }); + const url = `https://ipfs.infura.io/ipfs/${added.path}`; + setIpfsUrl(url); + } catch (err) { + console.log(err || 'An error occurred while uploading to IPFS'); + } finally { + setUploading(false); + } + }; + + return { ipfsUrl, uploading, uploadFileToIpfs }; +}; + +export default useUploadToIpfs; diff --git a/yarn.lock b/yarn.lock index ed41db1..0311e30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1071,6 +1071,18 @@ resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== +"@chainsafe/is-ip@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chainsafe/is-ip/-/is-ip-2.0.2.tgz#7311e7403f11d8c5cfa48111f56fcecaac37c9f6" + integrity sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA== + +"@chainsafe/netmask@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@chainsafe/netmask/-/netmask-2.0.0.tgz#0d4a75f47919f65011da4327a3845c9661f1038a" + integrity sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + "@chainsafe/persistent-merkle-tree@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" @@ -1901,6 +1913,29 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@ipld/dag-cbor@^9.0.0": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-9.0.4.tgz#5e1bc63aeabf882a750be88bb6879017c5c41930" + integrity sha512-HBNVngk/47pKNLTAelN6ORWgKkjJtQj96Xb+jIBtRShJGCsXgghj1TzTynTTIp1dZxwPe5rVIL6yjZmvdyP2Wg== + dependencies: + cborg "^2.0.1" + multiformats "^12.0.1" + +"@ipld/dag-json@^10.0.0": + version "10.1.3" + resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-10.1.3.tgz#c1fb614277cb4163b5d5e50db153fb608ca6780f" + integrity sha512-c0PJE+cDnsYfyuWMdTTwkzMvxjthEwWD+0u6ApQfXrs+GTcxeYh+Hefd0xE9L4fb2Trr1DGA1a/iia4PAS3Mpg== + dependencies: + cborg "^2.0.1" + multiformats "^12.0.1" + +"@ipld/dag-pb@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-4.0.5.tgz#47b7edbad39df660c2eb0f6d2c83986063dea51b" + integrity sha512-El2Jhmv6bWuakhvnw1dl6xOhqLeVhlY8DIAJ06NtZRAoDcOzeGzvOtPzMCszVgCT0EQz+LOctyfgQ5Oszba19A== + dependencies: + multiformats "^12.0.1" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -1951,6 +1986,90 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/connect-kit-loader/-/connect-kit-loader-1.1.2.tgz#d550e3c1f046e4c796f32a75324b03606b7e226a" integrity sha512-mscwGroSJQrCTjtNGBu+18FQbZYA4+q6Tyx6K7CXHl6AwgZKbWfZYdgP2F+fyZcRUdGRsMX8QtvU61VcGGtO1A== +"@libp2p/interface-connection@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-4.0.0.tgz#fcc830ca891820fac89a4c6bd4fcc2df4874f49b" + integrity sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + "@multiformats/multiaddr" "^12.0.0" + it-stream-types "^1.0.4" + uint8arraylist "^2.1.2" + +"@libp2p/interface-keychain@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@libp2p/interface-keychain/-/interface-keychain-2.0.5.tgz#6ce104f38cf07ad72c9dfbe471a689f4ea4b4687" + integrity sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + multiformats "^11.0.0" + +"@libp2p/interface-peer-id@^2.0.0", "@libp2p/interface-peer-id@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-2.0.2.tgz#6302e70b6fc17c451bc3daa11447d059357bcc32" + integrity sha512-9pZp9zhTDoVwzRmp0Wtxw0Yfa//Yc0GqBCJi3EznBDE6HGIAVvppR91wSh2knt/0eYg0AQj7Y35VSesUTzMCUg== + dependencies: + multiformats "^11.0.0" + +"@libp2p/interface-peer-info@^1.0.2": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-info/-/interface-peer-info-1.0.10.tgz#566026de95a0817b9e853c982b313541b7960c0b" + integrity sha512-HQlo8NwQjMyamCHJrnILEZz+YwEOXCB2sIIw3slIrhVUYeYlTaia1R6d9umaAeLHa255Zmdm4qGH8rJLRqhCcg== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@multiformats/multiaddr" "^12.0.0" + +"@libp2p/interface-pubsub@^3.0.0": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@libp2p/interface-pubsub/-/interface-pubsub-3.0.7.tgz#cc1c7c47c883daddd2b84d83d719b3826943be3b" + integrity sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA== + dependencies: + "@libp2p/interface-connection" "^4.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.0.0" + it-pushable "^3.0.0" + uint8arraylist "^2.1.2" + +"@libp2p/interface@^0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@libp2p/interface/-/interface-0.1.2.tgz#4ea5a4fa8bbd46c3fe4c945ff6b8c6d5d41f10b0" + integrity sha512-Q5t27434Mvn+R6AUJlRH+q/jSXarDpP+KXVkyGY7S1fKPI2berqoFPqT61bRRBYsCH2OPZiKBB53VUzxL9uEvg== + dependencies: + "@multiformats/multiaddr" "^12.1.5" + abortable-iterator "^5.0.1" + it-pushable "^3.2.0" + it-stream-types "^2.0.1" + multiformats "^12.0.1" + p-defer "^4.0.0" + uint8arraylist "^2.4.3" + +"@libp2p/interfaces@^3.0.0", "@libp2p/interfaces@^3.2.0": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@libp2p/interfaces/-/interfaces-3.3.2.tgz#5d8079be845b0960939b5b18880e785a4714465a" + integrity sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g== + +"@libp2p/logger@^2.0.5": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-2.1.1.tgz#e12e6c320ea64252af954bcec996895098d1cd36" + integrity sha512-2UbzDPctg3cPupF6jrv6abQnAUTrbLybNOj0rmmrdGm1cN2HJ1o/hBu0sXuq4KF9P1h/eVRn1HIRbVIEKnEJrA== + dependencies: + "@libp2p/interface-peer-id" "^2.0.2" + "@multiformats/multiaddr" "^12.1.3" + debug "^4.3.4" + interface-datastore "^8.2.0" + multiformats "^11.0.2" + +"@libp2p/peer-id@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@libp2p/peer-id/-/peer-id-2.0.4.tgz#d50d2ae4663ef79f6e31ce4eaf25e1f44e1667ab" + integrity sha512-gcOsN8Fbhj6izIK+ejiWsqiqKeJ2yWPapi/m55VjOvDa52/ptQzZszxQP8jUk93u36de92ATFXDfZR/Bi6eeUQ== + dependencies: + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interfaces" "^3.2.0" + multiformats "^11.0.0" + uint8arrays "^4.0.2" + "@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz#64df34e2f12e68e78ac57e571d25ec07fa460ca9" @@ -2152,6 +2271,38 @@ prop-types "^15.8.1" react-is "^18.2.0" +"@multiformats/multiaddr-to-uri@^9.0.1": + version "9.0.7" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.7.tgz#44881352b1d9d98b53451982cd433f0f45ad7e24" + integrity sha512-i3ldtPMN6XJt+MCi34hOl0wGuGEHfWWMw6lmNag5BpckPwPTf9XGOOFMmh7ed/uO3Vjah/g173iOe61HTQVoBA== + dependencies: + "@multiformats/multiaddr" "^12.0.0" + +"@multiformats/multiaddr@^11.1.5": + version "11.6.1" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-11.6.1.tgz#ec46984a298e715e27a398434c087856db5f3185" + integrity sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + dns-over-http-resolver "^2.1.0" + err-code "^3.0.1" + multiformats "^11.0.0" + uint8arrays "^4.0.2" + varint "^6.0.0" + +"@multiformats/multiaddr@^12.0.0", "@multiformats/multiaddr@^12.1.3", "@multiformats/multiaddr@^12.1.5": + version "12.1.7" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-12.1.7.tgz#eb71733be20dd9f0ac0ff4c3ffe4bae422726beb" + integrity sha512-MZRj+uUrtF2WqgByrsPolrdyPDSFstw7Fe0ewabWgWl27fcOmfDOSrEt2aUVkSzapXbyCG7JQh0QvimmTF4aMA== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + "@chainsafe/netmask" "^2.0.0" + "@libp2p/interface" "^0.1.1" + dns-over-http-resolver "^2.1.0" + multiformats "^12.0.1" + uint8-varint "^2.0.1" + uint8arrays "^4.0.2" + "@next/env@13.4.7": version "13.4.7" resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.7.tgz#ca12d341edb128ca70384635bd2794125ffb1c01" @@ -2499,6 +2650,59 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@rainbow-me/rainbowkit-siwe-next-auth@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit-siwe-next-auth/-/rainbowkit-siwe-next-auth-0.3.0.tgz#780c267877c5c54f80316593745c8be40369222c" @@ -3114,6 +3318,11 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/minimatch@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + "@types/mkdirp@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" @@ -3154,6 +3363,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== +"@types/node@>=13.7.0": + version "20.5.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" + integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== + "@types/node@^12.12.54": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" @@ -3164,6 +3378,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.54.tgz#fc304bd66419030141fa997dc5a9e0e374029ae8" integrity sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw== +"@types/node@^18.0.0": + version "18.17.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.14.tgz#a621ad26e7eb076d6846dd3d39557ddf9d89f04b" + integrity sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -3849,6 +4068,14 @@ abitype@0.9.3: resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.3.tgz#294d25288ee683d72baf4e1fed757034e3c8c277" integrity sha512-dz4qCQLurx97FQhnb/EIYTk/ldQ+oafEDUqC0VVIeQS1Q48/YWt/9YNfMmp9SLFqN41ktxny3c8aYxHjmFIB/w== +abortable-iterator@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/abortable-iterator/-/abortable-iterator-5.0.1.tgz#5d93eba6fa8287a973a9ea090c64ca08b3777780" + integrity sha512-hlZ5Z8UwqrKsJcelVPEqDduZowJPBQJ9ZhBC2FXpja3lXy8X6MoI5uMzIgmrA8+3jcVnp8TF/tx+IBBqYJNUrg== + dependencies: + get-iterator "^2.0.0" + it-stream-types "^2.0.1" + abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" @@ -4024,6 +4251,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +any-signal@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6" + integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -4407,6 +4639,13 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== +blob-to-it@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-2.0.4.tgz#4faef3f507c27ce1c005cabb4eab9e913d9414ed" + integrity sha512-1z2a98yY7v855TreA3HzwJs/j7ecMzes6U1ty8fJ93S1XbiETsup+h5DA/XBMwK3tBu+CWx4WJjR3b8S13TKeQ== + dependencies: + browser-readablestream-to-it "^2.0.0" + bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -4477,6 +4716,16 @@ browser-level@^1.0.1: module-error "^1.0.2" run-parallel-limit "^1.1.0" +browser-readablestream-to-it@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" + integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== + +browser-readablestream-to-it@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.4.tgz#667b427a233fdc16618dca4e0ad73d1b9aea3fc5" + integrity sha512-EOjEEA+tJInvKg/Pml6QYxVY6gD8lka/ceLmkUbEeuWlzZx/a5k5ugupVFUUKSfI/88+v0VFs7JSFi5iYpp3IA== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -4537,7 +4786,7 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: +buffer@6.0.3, buffer@^6.0.1, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -4646,6 +4895,11 @@ catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== +cborg@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-2.0.5.tgz#b5393c8b1843d5c1a61f2b79b4c9f752052a4d44" + integrity sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w== + chai@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -5121,6 +5375,14 @@ cxs@^6.2.0: resolved "https://registry.yarnpkg.com/cxs/-/cxs-6.2.0.tgz#f11ca3bdaef154b93bdadca5df70f2cb3e37ca24" integrity sha512-RGatb1BUwVMBzV8DRo9Kapc55bdGfAxMcukVk+ZzE3Ts8xaTve0GVz730kBDxjhEBU2LK+RPuAcjZb00Q3O24w== +dag-jose@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dag-jose/-/dag-jose-4.0.0.tgz#4e65f62af58dd5203b2b094eb52142ffe0cdec1d" + integrity sha512-tw595L3UYoOUT9dSJPbBEG/qpRpw24kRZxa5SLRnlnr+g5L7O8oEs1d3W5TiVA1oJZbthVsf0Vi3zFN66qcEBA== + dependencies: + "@ipld/dag-cbor" "^9.0.0" + multiformats "^11.0.0" + damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" @@ -5334,6 +5596,16 @@ direction@^1.0.3: resolved "https://registry.yarnpkg.com/direction/-/direction-1.0.4.tgz#2b86fb686967e987088caf8b89059370d4837442" integrity sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ== +dns-over-http-resolver@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-2.1.2.tgz#fb478af244dd4fed5e0f798a3e6426d92730378c" + integrity sha512-Bjbf6aZjr3HMnwGslZnoW3MJVqgbTsh39EZWpikx2yLl9xEjw4eZhlOHCFhkOu89zoWaS4rqe2Go53TXW4Byiw== + dependencies: + debug "^4.3.1" + native-fetch "^4.0.2" + receptacle "^1.3.2" + undici "^5.12.0" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -5423,6 +5695,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +electron-fetch@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" + integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== + dependencies: + encoding "^0.1.13" + electron-to-chromium@^1.4.477: version "1.4.490" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz#d99286f6e915667fa18ea4554def1aa60eb4d5f1" @@ -5481,6 +5760,13 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -5514,6 +5800,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + errno@~0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -6100,6 +6391,11 @@ fast-diff@1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== +fast-fifo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-fifo@^1.1.0, fast-fifo@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b" @@ -6447,6 +6743,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + +get-iterator@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-2.0.1.tgz#a904829f61bace789e0d64bd1a504c511a015c3f" + integrity sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg== + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -6858,6 +7164,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -6981,6 +7294,34 @@ inline-style-prefixer@^6.0.0: css-in-js-utils "^3.1.0" fast-loops "^1.1.3" +interface-datastore@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-7.0.4.tgz#f09ae4e2896f57f876d5d742a59e982fb3f42891" + integrity sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw== + dependencies: + interface-store "^3.0.0" + nanoid "^4.0.0" + uint8arrays "^4.0.2" + +interface-datastore@^8.2.0: + version "8.2.5" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-8.2.5.tgz#d6959a7a89b22652791397b94a5a3367a1533742" + integrity sha512-kvLGJMz3RPoJF/g5DbEvfWWempIiSBLVMf63b0PBsziVcSkj0ofzHYI86v8vqpGedkQ81DtPCUKyvX9W7zWvrQ== + dependencies: + interface-store "^5.0.0" + nanoid "^4.0.0" + uint8arrays "^4.0.2" + +interface-store@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-3.0.4.tgz#670d95ef45f3b7061d154c3cbfaf39a538167ad7" + integrity sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ== + +interface-store@^5.0.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-5.1.4.tgz#4e9e759964f76750640872db02cc90b04c4c8cf9" + integrity sha512-SI2co5IAxAybBc9egRM2bXvHOa1RPh5SQQkO6di6t/aX92RbtzP4t8raB0l3GTzQmJADaBbzz8Tfa1QLgfMdGQ== + internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -7004,6 +7345,103 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ipfs-core-types@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.14.1.tgz#c69f4dd873324e975ef43c391c0692b96863b13c" + integrity sha512-4ujF8NlM9bYi2I6AIqPP9wfGGX0x/gRCkMoFdOQfxxrFg6HcAdfS+0/irK8mp4e7znOHWReOHeWqCGw+dAPwsw== + dependencies: + "@ipld/dag-pb" "^4.0.0" + "@libp2p/interface-keychain" "^2.0.0" + "@libp2p/interface-peer-id" "^2.0.0" + "@libp2p/interface-peer-info" "^1.0.2" + "@libp2p/interface-pubsub" "^3.0.0" + "@multiformats/multiaddr" "^11.1.5" + "@types/node" "^18.0.0" + interface-datastore "^7.0.0" + ipfs-unixfs "^9.0.0" + multiformats "^11.0.0" + +ipfs-core-utils@^0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.18.1.tgz#d5fae11bfdb511749c6f905b0d0da3174eb50909" + integrity sha512-P7jTpdfvlyBG3JR4o+Th3QJADlmXmwMxbkjszXry6VAjfSfLIIqXsdeYPoVRkV69GFEeQozuz2k/jR+U8cUH/Q== + dependencies: + "@libp2p/logger" "^2.0.5" + "@multiformats/multiaddr" "^11.1.5" + "@multiformats/multiaddr-to-uri" "^9.0.1" + any-signal "^3.0.0" + blob-to-it "^2.0.0" + browser-readablestream-to-it "^2.0.0" + err-code "^3.0.1" + ipfs-core-types "^0.14.1" + ipfs-unixfs "^9.0.0" + ipfs-utils "^9.0.13" + it-all "^2.0.0" + it-map "^2.0.0" + it-peekable "^2.0.0" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + multiformats "^11.0.0" + nanoid "^4.0.0" + parse-duration "^1.0.0" + timeout-abort-controller "^3.0.0" + uint8arrays "^4.0.2" + +ipfs-http-client@^60.0.1: + version "60.0.1" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-60.0.1.tgz#d2e9ab430aad43a92a6e44008e534afba4fd22b9" + integrity sha512-amwM5TNuf077J+/q27jPHfatC05vJuIbX6ZnlYLjc2QsjOCKsORNBqV3brNw7l+fPrijV1yrwEDLG3JEnKsfMw== + dependencies: + "@ipld/dag-cbor" "^9.0.0" + "@ipld/dag-json" "^10.0.0" + "@ipld/dag-pb" "^4.0.0" + "@libp2p/logger" "^2.0.5" + "@libp2p/peer-id" "^2.0.0" + "@multiformats/multiaddr" "^11.1.5" + any-signal "^3.0.0" + dag-jose "^4.0.0" + err-code "^3.0.1" + ipfs-core-types "^0.14.1" + ipfs-core-utils "^0.18.1" + ipfs-utils "^9.0.13" + it-first "^2.0.0" + it-last "^2.0.0" + merge-options "^3.0.4" + multiformats "^11.0.0" + parse-duration "^1.0.0" + stream-to-it "^0.2.2" + uint8arrays "^4.0.2" + +ipfs-unixfs@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-9.0.1.tgz#d06e688e07ef4ce08d610337ba2fe8c143c386e7" + integrity sha512-jh2CbXyxID+v3jLml9CqMwjdSS9ZRnsGfQGGPOfem0/hT/L48xUeTPvh7qLFWkZcIMhZtG+fnS1teei8x5uGBg== + dependencies: + err-code "^3.0.1" + protobufjs "^7.0.0" + +ipfs-utils@^9.0.13: + version "9.0.14" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.14.tgz#24f5fda1f4567685eb32bca2543d518f95fd8704" + integrity sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg== + dependencies: + any-signal "^3.0.0" + browser-readablestream-to-it "^1.0.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" + is-electron "^2.2.0" + iso-url "^1.1.5" + it-all "^1.0.4" + it-glob "^1.0.1" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-fetch "^3.0.0" + node-fetch "^2.6.8" + react-native-fetch-api "^3.0.0" + stream-to-it "^0.2.2" + is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -7082,6 +7520,11 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== +is-electron@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -7239,6 +7682,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +iso-url@^1.1.5: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== + isomorphic-ws@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" @@ -7254,6 +7702,73 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +it-all@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-2.0.1.tgz#45d530ecf6e13fb81d7ba583cdfd55ffdb376b05" + integrity sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA== + +it-first@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-2.0.1.tgz#75d66b254c385ae3a1906def060a69006a437cef" + integrity sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw== + +it-glob@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-1.0.2.tgz#bab9b04d6aaac42884502f3a0bfee84c7a29e15e" + integrity sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q== + dependencies: + "@types/minimatch" "^3.0.4" + minimatch "^3.0.4" + +it-last@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-2.0.1.tgz#a6f3253459cb77e917aeada3b2c4ae9f3e66c64b" + integrity sha512-uVMedYW0wa2Cx0TAmcOCLbfuLLII7+vyURmhKa8Zovpd+aBTMsmINtsta2n364wJ5qsEDBH+akY1sUtAkaYBlg== + +it-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-2.0.1.tgz#d5251fd6b222d6ee39293d406a3f8fce54fb9220" + integrity sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ== + +it-peekable@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-2.0.1.tgz#1e118610473aa511efc70f3bb7a7066178728dd3" + integrity sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA== + +it-pushable@^3.0.0, it-pushable@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.2.1.tgz#72d7ccf7e7c0ccecf8cbaf74064f7be56e775c59" + integrity sha512-sLFz2Q0oyDCJpTciZog7ipP4vSftfPy3e6JnH6YyztRa1XqkpGQaafK3Jw/JlfEBtCXfnX9uVfcpu3xpSAqCVQ== + dependencies: + p-defer "^4.0.0" + +it-stream-types@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-1.0.5.tgz#9c72e6adefdea9dac69d0a28fbea783deebd508d" + integrity sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA== + +it-stream-types@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-2.0.1.tgz#69cb4d7e79e707b8257a8997e02751ccb6c3af32" + integrity sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg== + +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== + dependencies: + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + jayson@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" @@ -7732,6 +8247,11 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -7858,6 +8378,13 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -8039,6 +8566,16 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiformats@^11.0.0, multiformats@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60" + integrity sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg== + +multiformats@^12.0.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-12.1.1.tgz#bebd4e121ccdb7e9b2f2db407f839fc9e963a3b7" + integrity sha512-GBSToTmri2vJYs8wqcZQ8kB21dCaeTOzHTIAlr8J06C1eL6UbzqURXFZ5Fl0EYm9GAFz1IlYY8SxGOs9G9NJRg== + multiformats@^9.4.2: version "9.9.0" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" @@ -8070,11 +8607,16 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -nanoid@^3.3.4, nanoid@^3.3.6: +nanoid@^3.1.20, nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e" + integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw== + napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" @@ -8090,6 +8632,16 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + +native-fetch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-4.0.2.tgz#75c8a44c5f3bb021713e5e24f2846750883e49af" + integrity sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -8176,7 +8728,7 @@ node-fetch@^2.6.12: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.7: +node-fetch@^2.6.7, node-fetch@^2.6.8: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -8360,6 +8912,24 @@ outdent@^0.8.0: resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0" integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-defer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.0.tgz#8082770aeeb10eb6b408abe91866738741ddd5d2" + integrity sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ== + +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -8444,6 +9014,11 @@ parse-css-color@^0.2.1: color-name "^1.1.4" hex-rgb "^4.1.0" +parse-duration@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.0.tgz#5192084c5d8f2a3fd676d04a451dbd2e05a1819c" + integrity sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ== + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -8762,6 +9337,24 @@ prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +protobufjs@^7.0.0: + version "7.2.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" + integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-compare@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.5.1.tgz#17818e33d1653fbac8c2ec31406bce8a2966f600" @@ -9033,6 +9626,13 @@ react-motion@^0.5.2: prop-types "^15.5.8" raf "^3.1.0" +react-native-fetch-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5" + integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA== + dependencies: + p-defer "^3.0.0" + react-parallax-tilt@^1.7.161: version "1.7.161" resolved "https://registry.yarnpkg.com/react-parallax-tilt/-/react-parallax-tilt-1.7.161.tgz#efebb1f2f9b4b77e921de1c929edd8af6f2dbe12" @@ -9210,6 +9810,13 @@ real-require@^0.1.0: resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + reduce-flatten@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" @@ -9380,6 +9987,11 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +retimer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df" + integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -9506,7 +10118,7 @@ safe-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9909,6 +10521,13 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-to-it@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" + integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== + dependencies: + get-iterator "^1.0.2" + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -10218,6 +10837,13 @@ throttle-debounce@^3.0.1: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +timeout-abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz#dd57ffca041652c03769904f8d95afd93fb95595" + integrity sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA== + dependencies: + retimer "^3.0.0" + tiny-inflate@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" @@ -10496,6 +11122,21 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307" integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== +uint8-varint@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.1.tgz#e8f73c24974b384f6f0e1cd73c884c5a19e32f53" + integrity sha512-euvmpuulJstK5+xNuI4S1KfnxJnbI5QP52RXIR3GZ3/ZMkOsEK2AgCtFpNvEQLXMxMx2o0qcyevK1fJwOZJagQ== + dependencies: + uint8arraylist "^2.0.0" + uint8arrays "^4.0.2" + +uint8arraylist@^2.0.0, uint8arraylist@^2.1.2, uint8arraylist@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.4.3.tgz#1148aa979b407d382e4eb8d9c8f2b4bf3f5910d5" + integrity sha512-oEVZr4/GrH87K0kjNce6z8pSCzLEPqHNLNR5sj8cJOySrTP8Vb/pMIbZKLJGhQKxm1TiZ31atNrpn820Pyqpow== + dependencies: + uint8arrays "^4.0.2" + uint8arrays@^3.0.0, uint8arrays@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" @@ -10503,6 +11144,13 @@ uint8arrays@^3.0.0, uint8arrays@^3.1.0: dependencies: multiformats "^9.4.2" +uint8arrays@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-4.0.6.tgz#bae68b536c2e87147045b95d73d29e503e45ecab" + integrity sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw== + dependencies: + multiformats "^12.0.1" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -10513,7 +11161,7 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici@^5.14.0: +undici@^5.12.0, undici@^5.14.0: version "5.23.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== @@ -10686,6 +11334,11 @@ valtio@1.11.0: proxy-compare "2.5.1" use-sync-external-store "1.2.0" +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" From 1789c74d2a2322b70911956f2bcc87d549458a5b Mon Sep 17 00:00:00 2001 From: folathecoder Date: Sat, 9 Sep 2023 23:41:59 +0100 Subject: [PATCH 20/28] Rendered nft image --- .env | 4 +- next.config.js | 5 + package.json | 3 + .../global/progressBar/progressBar.tsx | 2 +- .../marketplace/children/nftCard/nftCard.tsx | 31 +- .../Children/FundProject/FundProject.tsx | 104 +- src/contexts/ProjectDetailContext.tsx | 71 +- src/helpers/ipfsImageReader.ts | 28 + src/hooks/ContractHooks/useCreateCampaign.tsx | 2 - src/hooks/ContractHooks/useFundCampaign.tsx | 72 + src/hooks/ContractHooks/useGetCampaign.tsx | 1 + src/hooks/RequestHooks/POST/usePostNft.tsx | 67 + .../RequestHooks/POST/usePostPortfolio.tsx | 61 + src/hooks/useNftMetadataCreator.tsx | 76 + src/hooks/useReadTokenURI.tsx | 52 + src/hooks/useUploadToIpfs.tsx | 38 +- src/types/nftTypes.ts | 9 + src/types/projectTypes.ts | 7 + yarn.lock | 1870 ++++++++++++++++- 19 files changed, 2423 insertions(+), 80 deletions(-) create mode 100644 src/helpers/ipfsImageReader.ts create mode 100644 src/hooks/ContractHooks/useFundCampaign.tsx create mode 100644 src/hooks/RequestHooks/POST/usePostNft.tsx create mode 100644 src/hooks/RequestHooks/POST/usePostPortfolio.tsx create mode 100644 src/hooks/useNftMetadataCreator.tsx create mode 100644 src/hooks/useReadTokenURI.tsx diff --git a/.env b/.env index d42146c..33f0149 100644 --- a/.env +++ b/.env @@ -8,4 +8,6 @@ NEXT_PUBLIC_ALCHEMY_API_KEY=9xeTvkkpEiR-PXbo-NmV12O3BkNWixrk NEXT_PUBLIC_ETHERSCAN_API_KEY=CAM2IJY36H53V5MQGP4U6NGNYYH3ZUGBU2 NEXT_PUBLIC_SEPOLIA_PRIVATE_KEY=7bba322ef8f78463c19f6db542c5831ce83d80e02766c0b1dd8504a7e65a8b83 NEXT_PUBLIC_INFURA_API_KEY=8c2f0978d3394f98b1e3160bba2844ab -NEXT_PUBLIC_CONTRACT_ADDRESS=0xf265c5A02212c36f515206419dE3164eEf2cF0b6 \ No newline at end of file +NEXT_PUBLIC_CONTRACT_ADDRESS=0xf265c5A02212c36f515206419dE3164eEf2cF0b6 +NEXT_PUBLIC_IPFS_API_KEY=2V90hTdp8C9BmLgSpq2LPWn2skX +NEXT_PUBLIC_IPFS_SECRET_KEY=65c68d12c92db6731cacbf80e522c8a0 \ No newline at end of file diff --git a/next.config.js b/next.config.js index 7a86fac..df8bc46 100644 --- a/next.config.js +++ b/next.config.js @@ -5,6 +5,11 @@ const nextConfig = { 'api.minimalavatars.com', 'media.graphassets.com', 'res.cloudinary.com', + 'crowdlaunch.infura-ipfs.io', + 'https://crowdlaunch.infura-ipfs.io/ipfs/QmW6rSCkA8sFAhryq2cC46xF2fcNfYyZpfzh3DQMK3b4jw', + 'bafybeidtkspvxntvrbah2gr6z3fw2i5glpdgrqgqnmmaq2qx3xidaqfaky.ipfs.dweb.link', + 'ipfsexplorer.online', + 'https://ipfsexplorer.online/view/QmW6rSCkA8sFAhryq2cC46xF2fcNfYyZpfzh3DQMK3b4jw', ], }, }; diff --git a/package.json b/package.json index b8b873f..4b973c8 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@rainbow-me/rainbowkit": "^1.0.8", "@rainbow-me/rainbowkit-siwe-next-auth": "^0.3.0", "@reduxjs/toolkit": "^1.9.5", + "@thirdweb-dev/react": "^3.14.40", "@types/chai": "^4.3.5", "@types/draft-js": "^0.11.12", "@types/mocha": "^10.0.1", @@ -48,6 +49,7 @@ "graphql-request": "^6.1.0", "html-react-parser": "^4.2.0", "html-to-image": "^1.11.11", + "image-to-base64": "^2.2.0", "ipfs-http-client": "^60.0.1", "lodash": "^4.17.21", "lodash.debounce": "^4.0.8", @@ -67,6 +69,7 @@ "react-hook-form": "^7.45.1", "react-icons": "^4.10.1", "react-image-crop": "^10.1.5", + "react-ipfs-image": "^0.7.1", "react-lottie": "^1.2.3", "react-parallax-tilt": "^1.7.161", "react-query": "^3.39.3", diff --git a/src/components/global/progressBar/progressBar.tsx b/src/components/global/progressBar/progressBar.tsx index 70eb5c0..7d9e707 100644 --- a/src/components/global/progressBar/progressBar.tsx +++ b/src/components/global/progressBar/progressBar.tsx @@ -11,7 +11,7 @@ const ProgressBar: React.FC = ({ value, max }) => { return ( - + 100 ? 100 : width}%` }} /> ); }; diff --git a/src/components/marketplace/children/nftCard/nftCard.tsx b/src/components/marketplace/children/nftCard/nftCard.tsx index 0e296cd..3f6ae5a 100644 --- a/src/components/marketplace/children/nftCard/nftCard.tsx +++ b/src/components/marketplace/children/nftCard/nftCard.tsx @@ -1,4 +1,5 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; +import { IpfsImage } from 'react-ipfs-image'; import Image from 'next/image'; import Link from 'next/link'; import { @@ -9,7 +10,7 @@ import { NFTCreator, } from './nftCardStyles'; import useGetNftById from '@/hooks/RequestHooks/GET/useGetNftById'; -import { CroppedImage } from '@/components/global'; +import { renderIPFSImage } from '@/helpers/ipfsImageReader'; interface PropType { nftId: string; @@ -19,6 +20,30 @@ const NFTCard = ({ nftId }: PropType) => { const { nft, fetchingStatus } = useGetNftById({ nftId }); const { nft: data } = nft || {}; + const [imageData, setImageData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + function fetchAndReadContent(linkUrl: string) { + fetch(linkUrl) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.text(); + }) + .then((content) => { + setImageData(content); + }) + .catch((error) => { + console.error('Error fetching and reading content:', error); + }); + } + + useEffect(() => { + if (data?.nftImage) fetchAndReadContent(data?.nftImage); + }, [data?.nftImage]); + return ( <> {fetchingStatus === 2 && data && ( @@ -26,7 +51,7 @@ const NFTCard = ({ nftId }: PropType) => { {data.nftName} { const { wallet } = useWallet(); const { userData } = useContext(AppContext) as AppContextReturnTypes; - const { fundAmount, setFundAmount, generateNftImage, project } = useContext( - ProjectDetailContext - ) as ProjectDetailContextReturnTypes; + const { fundAmount, setFundAmount, generateNftImage, project, tokenURI } = + useContext(ProjectDetailContext) as ProjectDetailContextReturnTypes; const [notificationMessage, setNotificationMessage] = useState(''); const [showNotification, setShowNotification] = useState(false); const [showFundButton, setShowFundButton] = useState(false); + const [fundingLoading, setFundingLoading] = useState(false); + const [hasStartedFunding, setHasStartedFunding] = useState(false); // Get the project data from the backend const { project: data } = useContext( @@ -89,6 +93,28 @@ const FundProject = ({ projectAddress: project?.project.projectWalletAddress as `0x${string}`, }); + // Fund a campaign on the blockchain + const { + fundCampaign, + isFundingSuccess, + isFundingLoading, + isFundingError, + isFundingIdle, + } = useFundCampaign({ + campaignAddress: project?.project.projectWalletAddress as `0x${string}`, + fundAmount: Number(fundAmount), + tokenURI: tokenURI || '', + }); + + // Create a new NFT + const { nftData, fetchError, fetchStatus, createNFT } = usePostNft({ + tokenURI: tokenURI || '', + projectCategoryId: project?.category.categoryId || '', + }); + + // Add Project to Portfolio + const { addProjectToPortfolio } = usePostPortfolio(); + useEffect(() => { if (isUserRegistered) { setShowFundButton(isUserRegistered); @@ -110,21 +136,41 @@ const FundProject = ({ setFundAmount(Number(value)); }; - const handleFundProject = () => { + // Function to generate NFT Metadata and fund a project + const handleFundProject = async () => { if ( + project?.project.minInvestment && fundAmount !== 0 && fundAmount !== '' && wallet.walletStatus.isConnected && - campaign?.campaignStatus === 1 + campaign?.campaignStatus === 1 && + fundAmount >= project?.project.minInvestment ) { - // Generate NFT URL - generateNftImage(); + setFundingLoading(true); + await generateNftImage(); } else { + setFundingLoading(false); setShowNotification(true); fundErrorMessage(); } }; + // Initiate the funding process then the tokenURI is avaiable + useEffect(() => { + if (tokenURI && !hasStartedFunding) { + console.log('Yeasss 1'); + const startFunding = async () => { + await fundCampaign(); + setHasStartedFunding(true); // Mark as started + + console.log('Yeasss 2'); + }; + + startFunding(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tokenURI, hasStartedFunding]); + const fundErrorMessage = () => { if (fundAmount === 0) { setNotificationMessage('Please, enter a fund amount above zero (0).'); @@ -139,8 +185,50 @@ const FundProject = ({ 'Please connect your wallet to fund this project.' ); } + if ( + project?.project.minInvestment && + Number(fundAmount) < project?.project.minInvestment + ) { + setNotificationMessage( + `The minimum funding amount is ${ + project?.project.minInvestment || 0 + } ETH. Please enter an amount greater or equal to this amount.` + ); + } }; + // Show campaign funding success message + useEffect(() => { + if (isFundingSuccess) { + setFundingLoading(false); + + // Create NFT + createNFT(); + + //Add Project to User Portfolio + addProjectToPortfolio(project?.project.projectId || '', fundAmount || 0); + + setShowNotification(true); + setNotificationMessage( + `Congratuations, you have successfully funded ${project?.project.projectName} with ${fundAmount} ETH. Your newly minted share NFT has been added to your collection.` + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + fundAmount, + isFundingSuccess, + project?.project.projectId, + project?.project.projectName, + ]); + + useEffect(() => { + if (isFundingError) { + setFundingLoading(false); + } + }, [isFundingError]); + + console.log(tokenURI, isFundingSuccess, isFundingError); + return ( @@ -224,7 +312,7 @@ const FundProject = ({ {campaign?.campaignStatus === 1 ? 'Fund Project' : 'Funding Closed'} - {isRegisterLoading && ( + {fundingLoading && ( diff --git a/src/contexts/ProjectDetailContext.tsx b/src/contexts/ProjectDetailContext.tsx index 7ad2766..cb277fa 100644 --- a/src/contexts/ProjectDetailContext.tsx +++ b/src/contexts/ProjectDetailContext.tsx @@ -13,6 +13,9 @@ import { FetchingStatus } from '@/types/fetchingTypes'; import usePostAuth from '@/hooks/RequestHooks/POST/usePostAuth'; import useGetUserByAddress from '@/hooks/RequestHooks/GET/useGetUserByAddress'; import useWallet from '@/wallet/useWallet'; +import useUploadToIpfs from '@/hooks/useUploadToIpfs'; +import useNftMetadataCreator from '@/hooks/useNftMetadataCreator'; +import useGetTokenId from '@/hooks/ContractHooks/useGetTokenId'; export interface ProjectDetailContextReturnTypes { project: ProjectDetailType | null; @@ -28,6 +31,7 @@ export interface ProjectDetailContextReturnTypes { rawNftImageUrl: string; nftImageRef: React.RefObject; generateNftImage: () => void; + tokenURI: string | null; } interface PropTypes { @@ -47,7 +51,6 @@ const ProjectDetailProvider = ({ const { user } = useGetUserByAddress({ jwtToken: userData?.token, }); - const { project, fetchingStatus, error, refetch } = useGetProjectById({ projectId: projectId, }); @@ -56,6 +59,19 @@ const ProjectDetailProvider = ({ const [updateCount, setUpdateCount] = useState(0); const [fundAmount, setFundAmount] = useState(''); const [rawNftImageUrl, setRawNftImageUrl] = useState(''); + const [ipfsUrl, setIpfsUrl] = useState(null); + const [tokenURI, setTokenURI] = useState(null); + + const { nextTokenId } = useGetTokenId(); + const { uploading, uploadFileToIpfs } = useUploadToIpfs(); + const { generateMetaData } = useNftMetadataCreator({ + companyName: project?.project.projectName, + industry: project?.category.categoryName, + totalShare: project?.project.targetAmount, + sharePrice: fundAmount, + shareId: nextTokenId, + nftImage: ipfsUrl, + }); // Check if the project creator is the active view for the project // Make creator functionalities accessible to the user if, a creator @@ -72,26 +88,50 @@ const ProjectDetailProvider = ({ const nftImageRef = useRef(null); - // Callback used to generate NFT image template URl for IPFS - const generateNftImage = useCallback(() => { + // Callback used to generate NFT image template URL for IPFS + const generateNftImage = useCallback(async () => { if (nftImageRef.current === null) { return; } - toPng(nftImageRef.current, { cacheBust: true }) - .then((dataUrl) => { - const link = document.createElement('a'); - link.href = dataUrl; - link.download = `nft-template.png`; - link.click(); - setRawNftImageUrl(dataUrl); - }) - .catch((err) => { - console.log(err); - }); + try { + const dataUrl = await toPng(nftImageRef.current, { cacheBust: true }); + + const link = document.createElement('a'); + link.href = dataUrl; + link.download = `nft-template.png`; + link.click(); + setRawNftImageUrl(dataUrl); + + // Upload to IPFS + const url = await uploadFileToIpfs(dataUrl); + setIpfsUrl(url); + } catch (err) { + console.error(err); + } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [nftImageRef]); - console.log(rawNftImageUrl); + // Callback user to generate tokenURI will all required metadata in JSON + const generateTokenUri = useCallback(async () => { + if (ipfsUrl) + try { + const metaData = JSON.stringify(generateMetaData(), null, 2); + const url = await uploadFileToIpfs(metaData); + setTokenURI(url); + } catch (err) { + console.error(err); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ipfsUrl]); + + // Initiates the token URI generation when the ipfsUrl is available + useEffect(() => { + if (ipfsUrl) { + generateTokenUri(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ipfsUrl]); return ( {children} diff --git a/src/helpers/ipfsImageReader.ts b/src/helpers/ipfsImageReader.ts new file mode 100644 index 0000000..4e0ebfd --- /dev/null +++ b/src/helpers/ipfsImageReader.ts @@ -0,0 +1,28 @@ +import { create } from 'ipfs-http-client'; + +export async function renderIPFSImage(): Promise { + const ipfs = create({ + url: 'https://crowdlaunch.infura-ipfs.io/api/v0', // Full URL including the API path + }); // Use an IPFS gateway or your own IPFS node + + try { + const cid = 'QmW6rSCkA8sFAhryq2cC46xF2fcNfYyZpfzh3DQMK3b4jw'; + + // Fetch the image content from IPFS + const chunks: Uint8Array[] = []; + for await (const chunk of ipfs.cat(`/ipfs/${cid}`)) { + chunks.push(chunk); + } + + // Concatenate the chunks into a single Uint8Array + const concatenatedBuffer = Buffer.concat(chunks); + + // Convert the concatenated buffer to base64 + const base64Image = concatenatedBuffer.toString('base64'); + + return `data:image/png;base64,${base64Image}`; + } catch (error) { + console.error(error); + return ''; + } +} diff --git a/src/hooks/ContractHooks/useCreateCampaign.tsx b/src/hooks/ContractHooks/useCreateCampaign.tsx index 30eca98..8175c0d 100644 --- a/src/hooks/ContractHooks/useCreateCampaign.tsx +++ b/src/hooks/ContractHooks/useCreateCampaign.tsx @@ -1,10 +1,8 @@ -import { useEffect, useState } from 'react'; import useWallet from '@/wallet/useWallet'; import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; import { usePrepareContractWrite, useContractWrite, - useContractRead, useWaitForTransaction, } from 'wagmi'; import { weiConverter } from '@/helpers/weiConverter'; diff --git a/src/hooks/ContractHooks/useFundCampaign.tsx b/src/hooks/ContractHooks/useFundCampaign.tsx new file mode 100644 index 0000000..b1c476e --- /dev/null +++ b/src/hooks/ContractHooks/useFundCampaign.tsx @@ -0,0 +1,72 @@ +import useWallet from '@/wallet/useWallet'; +import { + usePrepareContractWrite, + useContractWrite, + useWaitForTransaction, +} from 'wagmi'; +import { weiConverter } from '@/helpers/weiConverter'; +import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; + +interface ReturnType { + fundCampaign: () => void; + isFundingSuccess: boolean; + isFundingLoading: boolean; + isFundingError: boolean; + isFundingIdle: boolean; +} + +interface PropType { + campaignAddress: `0x${string}`; + fundAmount: number; + tokenURI: string; +} + +const useFundCampaign = ({ + campaignAddress, + fundAmount, + tokenURI, +}: PropType): ReturnType => { + const { wallet } = useWallet(); + + // Prepare contract write configuration for fundCampaign function + const { config: fundCampaignConfig } = usePrepareContractWrite({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: 'fundCampaign', + chainId: 11155111, + account: wallet.walletAddress as `0x${string}`, + args: [campaignAddress, tokenURI], + value: weiConverter(fundAmount), + }); + + // Write camapaign fund data to the contract + const { write: writeCampaignFund, data: campaignFundData } = + useContractWrite(fundCampaignConfig); + + // Wait for the campaign fund function transaction to complete + const { + isSuccess: isFundingSuccess, + isLoading: isFundingLoading, + isError: isFundingError, + isIdle: isFundingIdle, + } = useWaitForTransaction({ + hash: campaignFundData?.hash, + }); + + // Function to fund campaign + const fundCampaign = async () => { + await writeCampaignFund?.(); + }; + + console.log('campaign funding data', campaignFundData, isFundingError); + + return { + fundCampaign, + isFundingSuccess, + isFundingLoading, + isFundingError, + isFundingIdle, + }; +}; + +export default useFundCampaign; diff --git a/src/hooks/ContractHooks/useGetCampaign.tsx b/src/hooks/ContractHooks/useGetCampaign.tsx index 94eb3a5..00a04d5 100644 --- a/src/hooks/ContractHooks/useGetCampaign.tsx +++ b/src/hooks/ContractHooks/useGetCampaign.tsx @@ -47,6 +47,7 @@ const useGetCampaign = ({ projectAddress }: PropType): ReturnType => { functionName: 'campaigns', chainId: 11155111, args: [projectAddress as `0x${string}`], + watch: true, }); const campaignReadData = campaignData as Array; diff --git a/src/hooks/RequestHooks/POST/usePostNft.tsx b/src/hooks/RequestHooks/POST/usePostNft.tsx new file mode 100644 index 0000000..0376186 --- /dev/null +++ b/src/hooks/RequestHooks/POST/usePostNft.tsx @@ -0,0 +1,67 @@ +import { useState } from 'react'; +import useReadTokenURI from '@/hooks/useReadTokenURI'; +import { FetchingStatus } from '@/types/fetchingTypes'; +import usePostAuth from './usePostAuth'; +import { NFTPostData } from '@/types/nftTypes'; + +interface ReturnType { + nftData: NFTPostData | null; + fetchError: string | null; + fetchStatus: FetchingStatus; + createNFT: () => Promise; +} + +interface PropType { + tokenURI: string; + projectCategoryId: string; +} + +const usePostNft = ({ tokenURI, projectCategoryId }: PropType): ReturnType => { + const { data, loading: loadingURI } = useReadTokenURI({ tokenURI: tokenURI }); + const { userData } = usePostAuth(); + const { token } = userData || {}; + + const [nftData, setNftData] = useState(null); + const [fetchError, setFetchError] = useState(null); + const [fetchStatus, setFetchStatus] = useState( + FetchingStatus.Default + ); + + const createNFT = async () => { + if (data && !loadingURI) { + setFetchStatus(FetchingStatus.Loading); + + fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL}/api/user/Nft`, { + method: 'POST', + headers: { + accept: '*/*', + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + nftName: data.name, + nftDescription: data.description, + price: 0, + nftImage: data.image, + nftWalletAddress: tokenURI, + categoryId: projectCategoryId, + }), + }) + .then((response) => response.json()) + .then((data) => { + setNftData(data); + setFetchStatus(FetchingStatus.Fetched); + }) + .catch((err) => { + setFetchError(err.message); + setFetchStatus(FetchingStatus.Error); + }); + } + }; + + console.log('nft data', nftData, fetchError, fetchStatus, data); + + return { nftData, fetchError, fetchStatus, createNFT }; +}; + +export default usePostNft; diff --git a/src/hooks/RequestHooks/POST/usePostPortfolio.tsx b/src/hooks/RequestHooks/POST/usePostPortfolio.tsx new file mode 100644 index 0000000..bde1dfa --- /dev/null +++ b/src/hooks/RequestHooks/POST/usePostPortfolio.tsx @@ -0,0 +1,61 @@ +import { useState } from 'react'; +import usePostAuth from './usePostAuth'; +import { FetchingStatus } from '@/types/fetchingTypes'; +import { PortfolioType } from '@/types/projectTypes'; + +interface ReturnType { + addProjectToPortfolio: ( + projectId: string, + amountInvested: number + ) => Promise; +} + +const usePostPortfolio = (): ReturnType => { + const { userData } = usePostAuth(); + const { token } = userData || {}; + + const [portfolioData, setPortfolioData] = useState( + null + ); + const [fetchError, setFetchError] = useState(null); + const [fetchStatus, setFetchStatus] = useState( + FetchingStatus.Default + ); + + const addProjectToPortfolio = async ( + projectId: string, + amountInvested: number + ) => { + setFetchStatus(FetchingStatus.Loading); + + fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL}/api/portfolios/Portfolio`, { + method: 'POST', + headers: { + accept: '*/*', + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + projectId: projectId, + status: 0, + amountInvested: amountInvested, + investmentDate: new Date(), + }), + }) + .then((response) => response.json()) + .then((data) => { + setPortfolioData(data); + setFetchStatus(FetchingStatus.Fetched); + }) + .catch((err) => { + setFetchError(err.message); + setFetchStatus(FetchingStatus.Error); + }); + }; + + console.log('portfolio', portfolioData, fetchError, fetchStatus); + + return { addProjectToPortfolio }; +}; + +export default usePostPortfolio; diff --git a/src/hooks/useNftMetadataCreator.tsx b/src/hooks/useNftMetadataCreator.tsx new file mode 100644 index 0000000..230e66c --- /dev/null +++ b/src/hooks/useNftMetadataCreator.tsx @@ -0,0 +1,76 @@ +const currentDate = new Date(); + +interface ReturnType { + generateMetaData: () => MetadataType; +} + +export interface MetadataType { + name: string; + description: string; + image: string; + attributes: { + trait_type: string; + value: string | number | Date; + }[]; +} + +interface PropType { + companyName?: string; + industry?: string; + totalShare?: number; + sharePrice: number | ''; + shareId: string | number; + nftImage: string | null; +} + +const useNftMetadataCreator = ({ + companyName, + industry, + totalShare, + sharePrice, + shareId, + nftImage, +}: PropType): ReturnType => { + //Function that dynamically generates NFT metadata + const generateMetaData = (): MetadataType => { + return { + name: `${companyName} Share #${shareId}`, + description: `"This NFT represents shares in ${companyName}, a renowned and innovative ${industry} company with a history of pioneering advancements in ${industry}-specific technology/innovations. As a shareholder, you'll have a stake in the company's future, allowing you to participate in important decisions, receive dividends, and benefit from the potential growth of your investment. Join us in shaping the future of the ${industry} sector with your ownership stake in ${companyName}."`, + image: nftImage || '', + attributes: [ + { + trait_type: 'Company', + value: companyName || '', + }, + { + trait_type: 'Industry', + value: industry || '', + }, + { + trait_type: 'Total Shares', + value: totalShare || '', + }, + { + trait_type: 'Ownership Percentage', + value: sharePrice && totalShare ? (sharePrice * totalShare) / 100 : 0, + }, + { + trait_type: 'Share Price', + value: sharePrice, + }, + { + trait_type: 'Share Class', + value: 'Profit Share', + }, + { + trait_type: 'Date Issued', + value: currentDate, + }, + ], + }; + }; + + return { generateMetaData }; +}; + +export default useNftMetadataCreator; diff --git a/src/hooks/useReadTokenURI.tsx b/src/hooks/useReadTokenURI.tsx new file mode 100644 index 0000000..dcb1a18 --- /dev/null +++ b/src/hooks/useReadTokenURI.tsx @@ -0,0 +1,52 @@ +import { useEffect, useState } from 'react'; +import { MetadataType } from '@/hooks/useNftMetadataCreator'; + +interface ReturnType { + data: MetadataType | null; + loading: boolean; + error: string | null; +} + +interface PropType { + tokenURI: string; +} + +const useReadTokenURI = ({ tokenURI }: PropType): ReturnType => { + const [data, setData] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchData = async () => { + try { + setLoading(true); + + // Fetch data from the tokenURI + const response = await fetch(tokenURI); + + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + // Parse the JSON data + const jsonData: MetadataType = await response.json(); + + // Set the data + setData(jsonData); + setLoading(false); + setError(null); + } catch (err) { + setError(err as any); + setLoading(false); + } + }; + + if (tokenURI) { + fetchData(); + } + }, [tokenURI]); + + return { data, loading, error }; +}; + +export default useReadTokenURI; diff --git a/src/hooks/useUploadToIpfs.tsx b/src/hooks/useUploadToIpfs.tsx index f448ccc..7ed9310 100644 --- a/src/hooks/useUploadToIpfs.tsx +++ b/src/hooks/useUploadToIpfs.tsx @@ -1,38 +1,50 @@ import { useState } from 'react'; -import { create as ipfsHttpClient } from 'ipfs-http-client'; - -// Replace with your IPFS HTTP API endpoint -const ipfsOptions = { - url: 'https://ipfs.infura.io:5001/api/v0', +import { create as ipfsHttpClient, Options } from 'ipfs-http-client'; + +//IPFS project information +const authorization = + 'Basic ' + + Buffer.from( + process.env.NEXT_PUBLIC_IPFS_API_KEY + + ':' + + process.env.NEXT_PUBLIC_IPFS_SECRET_KEY + ).toString('base64'); + +// Define your options +const options: Options = { + url: 'https://ipfs.infura.io:5001/', + headers: { + authorization, + }, }; -const client = ipfsHttpClient(ipfsOptions); +// Create an IPFS client with the provided options +const client = ipfsHttpClient(options); interface UploadToIpfsResult { - ipfsUrl: string | null; uploading: boolean; - uploadFileToIpfs: (file: File) => Promise; + uploadFileToIpfs: (file: string) => Promise; } const useUploadToIpfs = (): UploadToIpfsResult => { - const [ipfsUrl, setIpfsUrl] = useState(null); const [uploading, setUploading] = useState(false); - const uploadFileToIpfs = async (file: File): Promise => { + const uploadFileToIpfs = async (file: string): Promise => { try { setUploading(true); const added = await client.add({ content: file }); - const url = `https://ipfs.infura.io/ipfs/${added.path}`; - setIpfsUrl(url); + const url = `https://crowdlaunch.infura-ipfs.io/ipfs/${added.path}`; + return url; } catch (err) { console.log(err || 'An error occurred while uploading to IPFS'); + return null; } finally { setUploading(false); } }; - return { ipfsUrl, uploading, uploadFileToIpfs }; + return { uploading, uploadFileToIpfs }; }; export default useUploadToIpfs; diff --git a/src/types/nftTypes.ts b/src/types/nftTypes.ts index 628f209..70679f6 100644 --- a/src/types/nftTypes.ts +++ b/src/types/nftTypes.ts @@ -7,3 +7,12 @@ export interface NFTCardTypes { NFTCreatorName: string; NFTCreatorImage: StaticImageData; } + +export interface NFTPostData { + nftName: string; + nftDescription: string; + price: number; + nftImage: string; + nftWalletAddress: string; + categoryId: string; +} diff --git a/src/types/projectTypes.ts b/src/types/projectTypes.ts index 12ffdca..5947c53 100644 --- a/src/types/projectTypes.ts +++ b/src/types/projectTypes.ts @@ -218,3 +218,10 @@ export interface UserType { discordUrl: string; }; } + +export interface PortfolioType { + projectId: string; + status: number; + amountInvested: number; + investmentDate: string; +} diff --git a/yarn.lock b/yarn.lock index 0311e30..136d4e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,39 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@account-abstraction/contracts@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@account-abstraction/contracts/-/contracts-0.5.0.tgz#a089aee7b4c446251fbbce7df315bbf8f659e37f" + integrity sha512-CKyS9Zh5rcYUM+4B6TlaB9+THHzJ+6TY3tWF5QofqvFpqGNvIhF8ddy6wyCmqZw6TB74/yYv7cYD/RarVudfDg== + +"@account-abstraction/sdk@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@account-abstraction/sdk/-/sdk-0.5.0.tgz#fb306ecb1dba82e10a0277ab716890acf1d2d1ed" + integrity sha512-KuEG9UVl2kEhamevFmPJfqY5AQH4fRLnFhfWAdoqwxIZIuSyA8wfyzM9WKnDPSCaiApLvSzckjRwbs4dVoOp2Q== + dependencies: + "@account-abstraction/contracts" "^0.5.0" + "@account-abstraction/utils" "^0.5.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@types/debug" "^4.1.7" + debug "^4.3.4" + ethers "^5.7.0" + +"@account-abstraction/utils@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@account-abstraction/utils/-/utils-0.5.0.tgz#aa7925741048b1657a71d7f98ccaf3c187f99b4a" + integrity sha512-dgXguTn5WgFMmr3wQMdLGEoIMDcIJgzAv74YlHeb2D3Nyy1pByPArSb3eLOOcgxCJSJeqTscpO9P57uhNkkC4A== + dependencies: + "@account-abstraction/contracts" "^0.5.0" + "@ethersproject/abi" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@openzeppelin/contracts" "^4.7.3" + debug "^4.3.4" + ethers "^5.7.0" + "@adraffy/ens-normalize@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" @@ -1032,6 +1065,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.13.10": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" + integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" @@ -1066,6 +1106,26 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" +"@blocto/sdk@^0.5.4": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@blocto/sdk/-/sdk-0.5.5.tgz#807b9eaeee924c3eb0c5517c6b32891025f1f6b0" + integrity sha512-u7bbAYmYDCf0QWvXleVOTeGFRbo8evT3uacsLJ6dv01HspmLDKZWjFyu7i3ARebJTpenHvwM78XHV7KTvBqTRg== + dependencies: + bs58 "^5.0.0" + buffer "^6.0.3" + eip1193-provider "^1.0.1" + js-sha3 "^0.8.0" + +"@chainlink/contracts@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@chainlink/contracts/-/contracts-0.6.1.tgz#8842b57e755793cbdbcbc45277fb5d179c993e19" + integrity sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ== + dependencies: + "@eth-optimism/contracts" "^0.5.21" + "@openzeppelin/contracts" "~4.3.3" + "@openzeppelin/contracts-upgradeable" "^4.7.3" + "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" + "@chainsafe/as-sha256@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" @@ -1167,7 +1227,7 @@ dependencies: "@cloudinary/transformation-builder-sdk" "^1.5.1" -"@coinbase/wallet-sdk@^3.6.6": +"@coinbase/wallet-sdk@^3.6.6", "@coinbase/wallet-sdk@^3.7.1": version "3.7.1" resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.7.1.tgz#44b3b7a925ff5cc974e4cbf7a44199ffdcf03541" integrity sha512-LjyoDCB+7p0waQXfK+fUgcAs3Ezk6S6e+LYaoFjpJ6c9VTop3NyZF40Pi7df4z7QJohCwzuIDjz0Rhtig6Y7Pg== @@ -1358,6 +1418,37 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== +"@eth-optimism/contracts@^0.5.21": + version "0.5.40" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" + integrity sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== + dependencies: + "@eth-optimism/core-utils" "0.12.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + +"@eth-optimism/core-utils@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz#6337e4599a34de23f8eceb20378de2a2de82b0ea" + integrity sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bufio "^1.0.7" + chai "^4.3.4" + "@ethereum-waffle/chai@4.0.10": version "4.0.10" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" @@ -1432,7 +1523,7 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.3" -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": +"@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": version "2.6.5" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== @@ -1451,6 +1542,11 @@ ethereumjs-util "^7.1.1" miller-rabin "^4.0.0" +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + "@ethereumjs/tx@3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" @@ -1467,6 +1563,15 @@ "@ethereumjs/common" "^2.6.4" ethereumjs-util "^7.1.5" +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + "@ethereumjs/vm@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" @@ -1573,7 +1678,7 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -1676,7 +1781,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -1739,7 +1844,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0": +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -1760,7 +1865,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -1827,6 +1932,33 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@floating-ui/core@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17" + integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ== + dependencies: + "@floating-ui/utils" "^0.1.1" + +"@floating-ui/dom@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.1.tgz#88b70defd002fe851f17b4a25efb2d3c04d7a8d7" + integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw== + dependencies: + "@floating-ui/core" "^1.4.1" + "@floating-ui/utils" "^0.1.1" + +"@floating-ui/react-dom@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/utils@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.1.tgz#1a5b1959a528e374e8037c4396c3e825d6cf4a83" + integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw== + "@ganache/ethereum-address@0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz#0e6d66f4a24f64bf687cb3ff7358fb85b9d9005e" @@ -1889,6 +2021,14 @@ optionalDependencies: "@trufflesuite/bigint-buffer" "1.1.9" +"@google/model-viewer@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@google/model-viewer/-/model-viewer-2.1.1.tgz#37c51143740c07c592d5cccbc8cfaa8be8b7ef82" + integrity sha512-5umyLoD5vMxlSVQwtmUXeNCNWs9dzmWykGm1qrHe/pCYrj/1lyJIgJRw+IxoMNodGqtcHEtfDhdNjRDM9yo/TA== + dependencies: + lit "^2.2.3" + three "^0.146.0" + "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" @@ -1976,6 +2116,31 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@json-rpc-tools/provider@^1.5.5": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/provider/-/provider-1.7.6.tgz#8a17c34c493fa892632e278fd9331104e8491ec6" + integrity sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA== + dependencies: + "@json-rpc-tools/utils" "^1.7.6" + axios "^0.21.0" + safe-json-utils "^1.1.1" + ws "^7.4.0" + +"@json-rpc-tools/types@^1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.7.6.tgz#5abd5fde01364a130c46093b501715bcce5bdc0e" + integrity sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ== + dependencies: + keyvaluestorage-interface "^1.0.0" + +"@json-rpc-tools/utils@^1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@json-rpc-tools/utils/-/utils-1.7.6.tgz#67f04987dbaa2e7adb6adff1575367b75a9a9ba1" + integrity sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw== + dependencies: + "@json-rpc-tools/types" "^1.7.6" + "@pedrouid/environment" "^1.0.1" + "@juggle/resize-observer@^3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -2082,6 +2247,37 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" +"@magic-ext/connect@^6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@magic-ext/connect/-/connect-6.7.2.tgz#9b479d2a3b0740e63915c7c7af461af5f3bfbf2a" + integrity sha512-b56mYYzgeXmRzZ8DgsUV6hFKFidaoRJvibUgcRwSuGElDdQxuhkz6FUyTLLS0zGbGdg4lfa7F1J/II1NrxA+lQ== + +"@magic-ext/oauth@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@magic-ext/oauth/-/oauth-7.6.2.tgz#fb779d76e2cdf39f452d14bb0efe81c81e327479" + integrity sha512-yqQBdtkMouD+owAJkPlevLbal/iCREH/D3PmDW9a7Dsfjy2xs557oIpGkLSZexTIHd3Cxga9hWNpdqFukUfzYg== + dependencies: + "@magic-sdk/types" "^11.6.2" + +"@magic-sdk/commons@^9.6.2": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@magic-sdk/commons/-/commons-9.6.2.tgz#db03f98efb771481f4045a3877b6285600f0e96e" + integrity sha512-PgYznuO9GV5wiKgzP3bEQJTnAbvfHmAPTBmwbP/ESag3FrOyXxuk7PIWpeGmnFa/i6SSQUsmKp8sr/BN0dU5vg== + +"@magic-sdk/provider@^13.6.2": + version "13.6.2" + resolved "https://registry.yarnpkg.com/@magic-sdk/provider/-/provider-13.6.2.tgz#ae0772205952f65b32466396c81bfd695d23554f" + integrity sha512-ecrTyL4NaploZ/cX1b+NGiWYMSAWVseE7xa7tvmkejZgQCrcJQd8UXb3LPVPmF7kQPKGutJSdkeGJCDKwsGKIA== + dependencies: + "@magic-sdk/types" "^11.6.2" + eventemitter3 "^4.0.4" + web3-core "1.5.2" + +"@magic-sdk/types@^11.6.2": + version "11.6.2" + resolved "https://registry.yarnpkg.com/@magic-sdk/types/-/types-11.6.2.tgz#1fb6205b516c3f0c5787e82aecd0e667d2de1cd2" + integrity sha512-+Emd+9HeeVi2E0bktJ33YleA/ozEuKYCBfmSbGRxlntdyUvaojeC+WPf2jN1WH8FjUEiljAjrEJTTZyRGCL8SQ== + "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -2271,6 +2467,11 @@ prop-types "^15.8.1" react-is "^18.2.0" +"@multiformats/base-x@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" + integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== + "@multiformats/multiaddr-to-uri@^9.0.1": version "9.0.7" resolved "https://registry.yarnpkg.com/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.7.tgz#44881352b1d9d98b53451982cd433f0f45ad7e24" @@ -2365,7 +2566,7 @@ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== -"@noble/curves@1.1.0", "@noble/curves@^1.0.0": +"@noble/curves@1.1.0", "@noble/curves@^1.0.0", "@noble/curves@~1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== @@ -2394,6 +2595,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== +"@noble/hashes@~1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -2635,16 +2841,62 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== -"@openzeppelin/contracts@^4.9.3": +"@openzeppelin/contracts-upgradeable@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" + integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== + +"@openzeppelin/contracts-upgradeable@^4.4.2", "@openzeppelin/contracts-upgradeable@^4.7.3": + version "4.9.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz#ff17a80fb945f5102571f8efecb5ce5915cc4811" + integrity sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A== + +"@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" + integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== + +"@openzeppelin/contracts@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" + integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== + +"@openzeppelin/contracts@^4.7.3", "@openzeppelin/contracts@^4.9.3": version "4.9.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== +"@openzeppelin/contracts@~4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" + integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== + "@panva/hkdf@^1.0.2": version "1.1.1" resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d" integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== +"@paperxyz/embedded-wallet-service-sdk@^1.1.3": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@paperxyz/embedded-wallet-service-sdk/-/embedded-wallet-service-sdk-1.2.0.tgz#e6b2eace2040e4a54d501bc16e04b1ec2eb2708e" + integrity sha512-LkxYXWUfYuzlj8G2efHqk5iGIaP7uxJxA/XHhZR+QVAh2LCzkq9+5XYEv/qzMo/FxHWYzlXkYbYUnRG2WWNOlw== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@paperxyz/sdk-common-utilities" "*" + +"@paperxyz/sdk-common-utilities@*": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@paperxyz/sdk-common-utilities/-/sdk-common-utilities-0.1.0.tgz#a948ef20d080b63e8bc0caa3ef337177a782f370" + integrity sha512-+zE2wp9gI5kjI6yHdrigeqLRDueAFz70v6hUKOT98Nyy4yL8YUR3OvXFAnAyZLXrr0v1uLlDYQdBz0fI2StmGg== + +"@pedrouid/environment@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@pedrouid/environment/-/environment-1.0.1.tgz#858f0f8a057340e0b250398b75ead77d6f4342ec" + integrity sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug== + "@popperjs/core@^2.11.8": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" @@ -2703,6 +2955,343 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@radix-ui/colors@^0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-0.1.9.tgz#aad732ecc4ce1018adcb3aedd3ce3c573c2256cc" + integrity sha512-Vxq944ErPJsdVepjEUhOLO9ApUVOocA63knc+V2TkJ09D/AVOjiMIgkca/7VoYgODcla0qbSIBjje0SMfZMbAw== + +"@radix-ui/primitive@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" + integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-arrow@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" + integrity sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-collection@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz#9595a66e09026187524a36c6e7e9c7d286469159" + integrity sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-compose-refs@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" + integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" + integrity sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dialog@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.4.tgz#06bce6c16bb93eb36d7a8589e665a20f4c1c52c1" + integrity sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-direction@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" + integrity sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dismissable-layer@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz#883a48f5f938fa679427aa17fcba70c5494c6978" + integrity sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-escape-keydown" "1.0.3" + +"@radix-ui/react-dropdown-menu@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.5.tgz#19bf4de8ffa348b4eb6a86842f14eff93d741170" + integrity sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-menu" "2.0.5" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-focus-guards@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" + integrity sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-scope@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz#9c2e8d4ed1189a1d419ee61edd5c1828726472f9" + integrity sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-icons@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-icons/-/react-icons-1.3.0.tgz#c61af8f323d87682c5ca76b856d60c2312dbcb69" + integrity sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw== + +"@radix-ui/react-id@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" + integrity sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-menu@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.0.5.tgz#a7d78b0808c4d38269240bf5d5c7ffea3e225e16" + integrity sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popover@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.6.tgz#19bb81e7450482c625b8cd05bf4dcd1d2cd91a8b" + integrity sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popper@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" + integrity sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-rect" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-portal@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" + integrity sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-presence@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" + integrity sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-primitive@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" + integrity sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-roving-focus@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974" + integrity sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-slot@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" + integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + +"@radix-ui/react-tabs@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz#993608eec55a5d1deddd446fa9978d2bc1053da2" + integrity sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-tooltip@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz#87a7786cd9f2b4de957ac645afae1575339c58b0" + integrity sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + +"@radix-ui/react-use-callback-ref@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" + integrity sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-controllable-state@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz#ecd2ced34e6330caf89a82854aa2f77e07440286" + integrity sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-escape-keydown@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" + integrity sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-layout-effect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" + integrity sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" + integrity sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-use-size@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" + integrity sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-visually-hidden@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" + integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" + integrity sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@rainbow-me/rainbowkit-siwe-next-auth@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit-siwe-next-auth/-/rainbowkit-siwe-next-auth-0.3.0.tgz#780c267877c5c54f80316593745c8be40369222c" @@ -2720,6 +3309,11 @@ qrcode "1.5.0" react-remove-scroll "2.5.4" +"@react-icons/all-files@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@react-icons/all-files/-/all-files-4.1.0.tgz#477284873a0821928224b6fc84c62d2534d6650b" + integrity sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ== + "@reduxjs/toolkit@^1.9.5": version "1.9.5" resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.5.tgz#d3987849c24189ca483baa7aa59386c8e52077c4" @@ -2801,6 +3395,66 @@ "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" viem "^1.0.0" +"@safe-global/safe-core-sdk-types@^1.9.1", "@safe-global/safe-core-sdk-types@^1.9.2": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-1.10.1.tgz#94331b982671d2f2b8cc23114c58baf63d460c81" + integrity sha512-BKvuYTLOlY16Rq6qCXglmnL6KxInDuXMFqZMaCzwDKiEh+uoHu3xCumG5tVtWOkCgBF4XEZXMqwZUiLcon7IsA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@safe-global/safe-deployments" "^1.20.2" + web3-core "^1.8.1" + web3-utils "^1.8.1" + +"@safe-global/safe-core-sdk-utils@^1.7.4": + version "1.7.4" + resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-utils/-/safe-core-sdk-utils-1.7.4.tgz#810d36cf9629129a28eb1b9c6e690b163834b572" + integrity sha512-ITocwSWlFUA1K9VMP/eJiMfgbP/I9qDxAaFz7ukj5N5NZD3ihVQZkmqML6hjse5UhrfjCnfIEcLkNZhtB2XC2Q== + dependencies: + "@safe-global/safe-core-sdk-types" "^1.9.2" + semver "^7.3.8" + web3-utils "^1.8.1" + +"@safe-global/safe-core-sdk@^3.3.3", "@safe-global/safe-core-sdk@^3.3.4": + version "3.3.5" + resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk/-/safe-core-sdk-3.3.5.tgz#30884639d368a9f50aa5fc96f78de87261ebdab3" + integrity sha512-ul+WmpxZOXgDIXrZ6MIHptThYbm0CVV3/rypMQEn4tZLkudh/yXK7EuWBFnx9prR3MePuku51Zcz9fu1vi7sfQ== + dependencies: + "@ethersproject/solidity" "^5.7.0" + "@safe-global/safe-core-sdk-types" "^1.9.2" + "@safe-global/safe-core-sdk-utils" "^1.7.4" + "@safe-global/safe-deployments" "^1.25.0" + ethereumjs-util "^7.1.5" + semver "^7.3.8" + web3-utils "^1.8.1" + zksync-web3 "^0.14.3" + +"@safe-global/safe-deployments@^1.20.2", "@safe-global/safe-deployments@^1.22.0", "@safe-global/safe-deployments@^1.25.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.27.0.tgz#e074d88543d084764b8bef7e3bddd238ac0d6819" + integrity sha512-Fj6NW2JwSrC3vFIiheTRBGTAdZJSUtXk4rTkZgGoO8MnFM+pWU2pJU2rWzH3EYOXvrndxT2UxsiUIkTbmB2hkw== + dependencies: + semver "^7.3.7" + +"@safe-global/safe-ethers-adapters@0.1.0-alpha.17": + version "0.1.0-alpha.17" + resolved "https://registry.yarnpkg.com/@safe-global/safe-ethers-adapters/-/safe-ethers-adapters-0.1.0-alpha.17.tgz#87ef145c04bf9fc08e7d722d738e7bd9ea63b16a" + integrity sha512-02+emAnnXZAOwld1Ucen6idnMCAD76TXrhmuteYsdYoPjl5Eyq1ySb9tzIjCWklgfjMHQtrHSHDJqwdlHFM4GQ== + dependencies: + "@safe-global/safe-core-sdk" "^3.3.3" + "@safe-global/safe-core-sdk-types" "^1.9.1" + "@safe-global/safe-deployments" "^1.22.0" + axios "^0.27.2" + +"@safe-global/safe-ethers-lib@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@safe-global/safe-ethers-lib/-/safe-ethers-lib-1.9.4.tgz#049989a302c6f2010c574cf3a834b0cfb9cf67c5" + integrity sha512-WhzcmNun0s0VxeVQKRqaapV0vEpdm76zZBR2Du+S+58u1r57OjZkOSL2Gru0tdwkt3FIZZtE3OhDu09M70pVkA== + dependencies: + "@safe-global/safe-core-sdk-types" "^1.9.2" + "@safe-global/safe-core-sdk-utils" "^1.7.4" + ethers "5.7.2" + "@safe-global/safe-gateway-typescript-sdk@^3.5.3": version "3.9.0" resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.9.0.tgz#5aa36c05b865f6fe754d1d460f83bc9bf3a0145e" @@ -2831,6 +3485,15 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + "@scure/bip39@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" @@ -2847,6 +3510,14 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -3063,7 +3734,7 @@ "@stablelib/binary" "^1.0.1" "@stablelib/wipe" "^1.0.1" -"@stablelib/sha256@1.0.1": +"@stablelib/sha256@1.0.1", "@stablelib/sha256@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== @@ -3107,6 +3778,11 @@ resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.32.6.tgz#cf7df91ab1542e67a82624fefb12a55f580b4c01" integrity sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA== +"@tanstack/query-core@4.35.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.35.0.tgz#61e5cf9363b423ed665740c422902e65619eb7da" + integrity sha512-4GMcKQuLZQi6RFBiBZNsLhl+hQGYScRZ5ZoVq8QAzfqz9M7vcGin/2YdSESwl7WaV+Qzsb5CZOAbMBes4lNTnA== + "@tanstack/query-persist-client-core@4.32.6": version "4.32.6" resolved "https://registry.yarnpkg.com/@tanstack/query-persist-client-core/-/query-persist-client-core-4.32.6.tgz#8dbe10c3e86246a708f2a8725a5596c55fe57d7e" @@ -3136,6 +3812,14 @@ "@tanstack/query-core" "4.32.6" use-sync-external-store "^1.2.0" +"@tanstack/react-query@^4.33.0": + version "4.35.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.35.0.tgz#6286d2706e69384accc4d6b9ff8e4becd427db74" + integrity sha512-LLYDNnM9ewYHgjm2rzhk4KG/puN2rdoqCUD+N9+V7SwlsYwJk5ypX58rpkoZAhFyZ+KmFUJ7Iv2lIEOoUqydIg== + dependencies: + "@tanstack/query-core" "4.35.0" + use-sync-external-store "^1.2.0" + "@testing-library/dom@^9.0.0": version "9.3.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9" @@ -3159,6 +3843,159 @@ "@testing-library/dom" "^9.0.0" "@types/react-dom" "^18.0.0" +"@thirdweb-dev/auth@3.2.40": + version "3.2.40" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/auth/-/auth-3.2.40.tgz#550486c570339af9771eddf4946410f5a9b8397a" + integrity sha512-nDvZAMp3geACL/Lv15d6/eyN3gfo677C1bnxVKhGzdxNzaCnoP6vFuXLwl/nP2m7KTGUgcXYjQFWtCBZLl1Pmg== + dependencies: + "@thirdweb-dev/wallets" "1.1.23" + cookie "^0.5.0" + uuid "^9.0.0" + zod "^3.20.2" + +"@thirdweb-dev/chains@0.1.50": + version "0.1.50" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/chains/-/chains-0.1.50.tgz#857ce24a30821497974e55d75e721905cb35ca33" + integrity sha512-0rpBdFVgTE5mjgbafoBkpUnq0izx9NZz0mfFammQXWb08eQZUueuBHOVNhK2pRQT346SpQLtf65Oqag82+zZoA== + +"@thirdweb-dev/contracts-js@1.3.12": + version "1.3.12" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts-js/-/contracts-js-1.3.12.tgz#57aa2ad364ad78a2816cd045f5a555514fee4891" + integrity sha512-CBgxCYea7fst4bSS1dXDDOOB2rb9FsgFCAUzQPSQIlpqajOJES1fEPZc/TlFz7u444AYxA/9NoHesQ9RipQUgA== + dependencies: + "@thirdweb-dev/contracts" "3.8.5" + +"@thirdweb-dev/contracts@3.8.5": + version "3.8.5" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-3.8.5.tgz#7c9e95808c74a43830408cb1c8a2f477c45cc371" + integrity sha512-JUAeJJlNLw+Lb/8StER8k74VEi5kXDaQx6Ko3cyJnKTWHpZ28xvGIPphkgOFaLw6cG/q4xB423crcZnQZw9YLQ== + dependencies: + "@chainlink/contracts" "^0.6.1" + "@openzeppelin/contracts" "4.7.3" + "@openzeppelin/contracts-upgradeable" "4.7.3" + "@thirdweb-dev/dynamic-contracts" "^1.1.2" + erc721a-upgradeable "^3.3.0" + +"@thirdweb-dev/dynamic-contracts@^1.1.2": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/dynamic-contracts/-/dynamic-contracts-1.2.0.tgz#179a5b60e9f3215d2fd8216d8834cf22560511dd" + integrity sha512-pxX3PW7oLaYV6z70QKa9H/C5Wsyany5uhV01t+6DFk5+PJaFJ41ABhYQDD0X45S1Lw5iDf6xxLFnlymJGKOfag== + +"@thirdweb-dev/generated-abis@0.0.1", "@thirdweb-dev/generated-abis@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/generated-abis/-/generated-abis-0.0.1.tgz#0d788d6aff0ac08f11e9eeb9ae4c8321845272a8" + integrity sha512-vO9/3lSLO8smyyH1QVeYravSTzFwV1nf1C/Im1NBDPdH8//YvcbhtETGGiNfHWpyCvSi0vRYwvf+/7FKdwpDGQ== + +"@thirdweb-dev/react-core@3.14.40": + version "3.14.40" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/react-core/-/react-core-3.14.40.tgz#29bd5645640b503e2c8f549fba6d220dda853185" + integrity sha512-hmMiabj3DtHMjfdPArMB4n83yBAsaCbJf/9HRkPUs7jkPztpH9H3q5PWfnxjUfY45PJtfOhvUL2DsuLGMsFbCw== + dependencies: + "@tanstack/react-query" "^4.33.0" + "@thirdweb-dev/auth" "3.2.40" + "@thirdweb-dev/chains" "0.1.50" + "@thirdweb-dev/generated-abis" "^0.0.1" + "@thirdweb-dev/sdk" "3.10.59" + "@thirdweb-dev/storage" "1.2.10" + "@thirdweb-dev/wallets" "1.1.23" + mime "3.0.0" + tiny-invariant "^1.2.0" + +"@thirdweb-dev/react@^3.14.40": + version "3.14.40" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/react/-/react-3.14.40.tgz#0fed663d9ade9927fe39d2a1068bc423d85c48cf" + integrity sha512-BfuFkkb2ZnwVlNwHQypgpDsFUyiEvGMbTDPqx6yk4YnAp8rOSP4oR+R4b2Z/iKPRUjuED01LN33KUIIKXrQ1fg== + dependencies: + "@emotion/react" "^11.11.1" + "@emotion/styled" "^11.11.0" + "@google/model-viewer" "^2.1.1" + "@radix-ui/colors" "^0.1.9" + "@radix-ui/react-dialog" "^1.0.4" + "@radix-ui/react-dropdown-menu" "^2.0.5" + "@radix-ui/react-icons" "^1.3.0" + "@radix-ui/react-popover" "^1.0.6" + "@radix-ui/react-tabs" "^1.0.4" + "@radix-ui/react-tooltip" "^1.0.6" + "@react-icons/all-files" "^4.1.0" + "@tanstack/react-query" "^4.33.0" + "@thirdweb-dev/chains" "0.1.50" + "@thirdweb-dev/react-core" "3.14.40" + "@thirdweb-dev/wallets" "1.1.23" + buffer "^6.0.3" + copy-to-clipboard "^3.3.2" + detect-browser "^5.3.0" + fuse.js "^6.6.2" + react-qr-code "^2.0.11" + tiny-invariant "^1.2.0" + +"@thirdweb-dev/sdk@3.10.59": + version "3.10.59" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/sdk/-/sdk-3.10.59.tgz#9f820ee511a5bf20d865958961a125be05b7acb6" + integrity sha512-uDGc2yavYRiXP1+etUaDNLJdzaTSFRPQNoKNqzbR1HMHMHb/KHHPXHKO50AuKpc5pMw8/f+OmCphF0qTMTZu1Q== + dependencies: + "@thirdweb-dev/chains" "0.1.50" + "@thirdweb-dev/contracts-js" "1.3.12" + "@thirdweb-dev/generated-abis" "0.0.1" + "@thirdweb-dev/storage" "1.2.10" + abitype "^0.2.5" + bn.js "^5.2.1" + bs58 "^5.0.0" + buffer "^6.0.3" + cross-fetch "^3.1.8" + eventemitter3 "^5.0.1" + fast-deep-equal "^3.1.3" + merkletreejs "^0.2.24" + tiny-invariant "^1.2.0" + tweetnacl "^1.0.3" + uuid "^9.0.0" + yaml "^2.3.1" + zod "^3.20.2" + +"@thirdweb-dev/storage@1.2.10": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/storage/-/storage-1.2.10.tgz#04f25211c8a2d23b9a2171aac798211fe49c9de7" + integrity sha512-tUqUfkCfrZfmYcNVxR7j9CLMrIx0C4w/2QkNNo27AlbKGq4x73UCKRBTPZI2ggTKGfq6pyayOfFuVLoN7W/AqA== + dependencies: + cid-tool "^3.0.0" + cross-fetch "^3.1.8" + form-data "^4.0.0" + uuid "^9.0.0" + +"@thirdweb-dev/wallets@1.1.23": + version "1.1.23" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/wallets/-/wallets-1.1.23.tgz#c6d30dea71a477a7a18f91c8745b5afab84443a3" + integrity sha512-xwFdUK3izhFdfJFq1NZnjrG03rHjxteSfxi8VV1TNL7izl36WLFbW/IkLMYnxQ8Yb90l8E7ET29mXS6VQHChjQ== + dependencies: + "@account-abstraction/contracts" "^0.5.0" + "@account-abstraction/sdk" "^0.5.0" + "@account-abstraction/utils" "^0.5.0" + "@blocto/sdk" "^0.5.4" + "@coinbase/wallet-sdk" "^3.7.1" + "@magic-ext/connect" "^6.7.2" + "@magic-ext/oauth" "^7.6.2" + "@magic-sdk/provider" "^13.6.2" + "@paperxyz/embedded-wallet-service-sdk" "^1.1.3" + "@safe-global/safe-core-sdk" "^3.3.4" + "@safe-global/safe-ethers-adapters" "0.1.0-alpha.17" + "@safe-global/safe-ethers-lib" "^1.9.4" + "@thirdweb-dev/chains" "0.1.50" + "@thirdweb-dev/contracts-js" "1.3.12" + "@thirdweb-dev/sdk" "3.10.59" + "@walletconnect/core" "^2.9.1" + "@walletconnect/ethereum-provider" "^2.9.1" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/modal" "^2.6.1" + "@walletconnect/types" "^2.9.1" + "@walletconnect/utils" "^2.9.1" + "@walletconnect/web3wallet" "^1.8.7" + buffer "^6.0.3" + cross-fetch "^3.1.8" + crypto-js "^4.1.1" + eth-provider "^0.13.6" + eventemitter3 "^5.0.1" + magic-sdk "^13.6.2" + web3-core "1.5.2" + "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" @@ -3211,14 +4048,14 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== -"@types/bn.js@^4.11.3": +"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" -"@types/bn.js@^5.1.0": +"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== @@ -3368,7 +4205,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== -"@types/node@^12.12.54": +"@types/node@^12.12.54", "@types/node@^12.12.6": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== @@ -3652,6 +4489,47 @@ eventemitter3 "^4.0.7" zustand "^4.3.1" +"@walletconnect/auth-client@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@walletconnect/auth-client/-/auth-client-2.1.1.tgz#45548fc5d5e5ac155503d1b42ac97a96a2cba98d" + integrity sha512-rFGBG3pLkmwCc5DcL9JRCsvOAmPjUcHGxm+KlX31yXNOT1QACT8Gyd8ODSOmtvz5CXZS5dPWBuvO03LUSRbPkw== + dependencies: + "@ethersproject/hash" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "^1.0.1" + "@walletconnect/core" "^2.9.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "^1.2.1" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/utils" "^2.9.0" + events "^3.3.0" + isomorphic-unfetch "^3.1.0" + +"@walletconnect/core@2.10.0", "@walletconnect/core@^2.9.0", "@walletconnect/core@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.10.0.tgz#b659de4dfb374becd938964abd4f2150d410e617" + integrity sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ== + dependencies: + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.13" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/relay-auth" "^1.0.4" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + events "^3.3.0" + lodash.isequal "4.5.0" + uint8arrays "^3.1.0" + "@walletconnect/core@2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.9.2.tgz#c46734ca63771b28fd77606fd521930b7ecfc5e1" @@ -3717,6 +4595,21 @@ "@walletconnect/utils" "2.9.2" events "^3.3.0" +"@walletconnect/ethereum-provider@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.10.0.tgz#eebde38674222a48be35bb4aa3f6a74247ba059b" + integrity sha512-NyTm7RcrtAiSaYQPh6G4sOtr1kg/pL5Z3EDE6rBTV3Se5pMsYvtuwMiSol7MidsQpf4ux9HFhthTO3imcoWImw== + dependencies: + "@walletconnect/jsonrpc-http-connection" "^1.0.7" + "@walletconnect/jsonrpc-provider" "^1.0.13" + "@walletconnect/jsonrpc-types" "^1.0.3" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/sign-client" "2.10.0" + "@walletconnect/types" "2.10.0" + "@walletconnect/universal-provider" "2.10.0" + "@walletconnect/utils" "2.10.0" + events "^3.3.0" + "@walletconnect/events@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" @@ -3725,7 +4618,7 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/heartbeat@1.2.1": +"@walletconnect/heartbeat@1.2.1", "@walletconnect/heartbeat@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== @@ -3849,7 +4742,7 @@ detect-browser "^5.3.0" query-string "^6.13.5" -"@walletconnect/logger@^2.0.1": +"@walletconnect/logger@2.0.1", "@walletconnect/logger@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== @@ -3874,7 +4767,7 @@ motion "10.16.2" qrcode "1.5.3" -"@walletconnect/modal@2.6.1": +"@walletconnect/modal@2.6.1", "@walletconnect/modal@^2.6.1": version "2.6.1" resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.6.1.tgz#066fdbfcff83b58c8a9da66ab4af0eb93e3626de" integrity sha512-G84tSzdPKAFk1zimgV7JzIUFT5olZUVtI3GcOk77OeLYjlMfnDT23RVRHm5EyCrjkptnvpD0wQScXePOFd2Xcw== @@ -3919,6 +4812,21 @@ dependencies: tslib "1.14.1" +"@walletconnect/sign-client@2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.10.0.tgz#0fee8f12821e37783099f0c7bd64e6efdfbd9d86" + integrity sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw== + dependencies: + "@walletconnect/core" "2.10.0" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + events "^3.3.0" + "@walletconnect/sign-client@2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.9.2.tgz#ff4c81c082c2078878367d07f24bcb20b1f7ab9e" @@ -3941,6 +4849,18 @@ dependencies: tslib "1.14.1" +"@walletconnect/types@2.10.0", "@walletconnect/types@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.0.tgz#5d63235b49e03d609521402a4b49627dbc4ed514" + integrity sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + "@walletconnect/types@2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.9.2.tgz#d5fd5a61dc0f41cbdca59d1885b85207ac7bf8c5" @@ -3953,6 +4873,21 @@ "@walletconnect/logger" "^2.0.1" events "^3.3.0" +"@walletconnect/universal-provider@2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.10.0.tgz#565d6478dcb5cc66955e5f03d6a00f51c9bcac14" + integrity sha512-jtVWf+AeTCqBcB3lCmWkv3bvSmdRCkQdo67GNoT5y6/pvVHMxfjgrJNBOUsWQMxpREpWDpZ993X0JRjsYVsMcA== + dependencies: + "@walletconnect/jsonrpc-http-connection" "^1.0.7" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/logger" "^2.0.1" + "@walletconnect/sign-client" "2.10.0" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + events "^3.3.0" + "@walletconnect/universal-provider@2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.9.2.tgz#40e54e98bc48b1f2f5f77eb5b7f05462093a8506" @@ -3968,6 +4903,26 @@ "@walletconnect/utils" "2.9.2" events "^3.3.0" +"@walletconnect/utils@2.10.0", "@walletconnect/utils@^2.9.0", "@walletconnect/utils@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.0.tgz#6918d12180d797b8bd4a19fb2ff128e394e181d6" + integrity sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.0" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + "@walletconnect/utils@2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.9.2.tgz#035bdb859ee81a4bcc6420f56114cc5ec3e30afb" @@ -3988,6 +4943,20 @@ query-string "7.1.3" uint8arrays "^3.1.0" +"@walletconnect/web3wallet@^1.8.7": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@walletconnect/web3wallet/-/web3wallet-1.9.0.tgz#ad4094e1e2ed757bc75efa961121b66b2eeb4306" + integrity sha512-3uu6GbOz2uwcmVaIpijkPlReywC1GsFtwJOB1bJZOkc8wjtNmR3jUMwqxWUv8ojbmDVVWQl1HN7Sptkrmq9Xyw== + dependencies: + "@walletconnect/auth-client" "2.1.1" + "@walletconnect/core" "2.10.0" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.0.1" + "@walletconnect/sign-client" "2.10.0" + "@walletconnect/types" "2.10.0" + "@walletconnect/utils" "2.10.0" + "@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" @@ -4068,6 +5037,11 @@ abitype@0.9.3: resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.3.tgz#294d25288ee683d72baf4e1fed757034e3c8c277" integrity sha512-dz4qCQLurx97FQhnb/EIYTk/ldQ+oafEDUqC0VVIeQS1Q48/YWt/9YNfMmp9SLFqN41ktxny3c8aYxHjmFIB/w== +abitype@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.2.5.tgz#e571ef2ed99db1cae551fffde5bcbcee4e446177" + integrity sha512-t1iiokWYpkrziu4WL2Gb6YdGvaP9ZKs7WnA39TI8TsW2E99GVRgDPW/xOKhzoCdyxOYt550CNYEFluCwGaFHaA== + abortable-iterator@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/abortable-iterator/-/abortable-iterator-5.0.1.tgz#5d93eba6fa8287a973a9ea090c64ca08b3777780" @@ -4076,6 +5050,11 @@ abortable-iterator@^5.0.1: get-iterator "^2.0.0" it-stream-types "^2.0.1" +abortcontroller-polyfill@^1.7.5: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" @@ -4286,6 +5265,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-hidden@^1.1.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" + integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + dependencies: + tslib "^2.0.0" + aria-query@5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" @@ -4466,6 +5452,21 @@ axe-core@^4.6.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== +axios@^0.21.0: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axios@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" @@ -4549,6 +5550,11 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" @@ -4598,6 +5604,11 @@ bignumber.js@^9.0.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== +bignumber.js@^9.0.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -4646,7 +5657,12 @@ blob-to-it@^2.0.0: dependencies: browser-readablestream-to-it "^2.0.0" -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -4760,6 +5776,13 @@ bs58@^4.0.0, bs58@^4.0.1: dependencies: base-x "^3.0.2" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" @@ -4774,6 +5797,16 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== + +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -4816,6 +5849,11 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +bufio@^1.0.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.2.1.tgz#8d4ab3ddfcd5faa90f996f922f9397d41cbaf2de" + integrity sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA== + busboy@1.6.0, busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -4900,6 +5938,19 @@ cborg@^2.0.1: resolved "https://registry.yarnpkg.com/cborg/-/cborg-2.0.5.tgz#b5393c8b1843d5c1a61f2b79b4c9f752052a4d44" integrity sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w== +chai@^4.3.4: + version "4.3.8" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c" + integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + chai@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -4971,6 +6022,29 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cid-tool@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cid-tool/-/cid-tool-3.0.0.tgz#557540c5896d204503ef0ece848b88bbb350b90a" + integrity sha512-rgpV/LzuxUsGCJvUHe9+OuOAENVCiTn+mgGT8Nee1qDLS3xFGBUvZQdsY9MEpUi0YOFy6oz1pybHErcvE4SlGw== + dependencies: + cids "^1.0.0" + explain-error "^1.0.4" + multibase "^4.0.2" + multihashes "^4.0.2" + split2 "^3.1.1" + uint8arrays "^2.1.3" + yargs "^16.2.0" + +cids@^1.0.0: + version "1.1.9" + resolved "https://registry.yarnpkg.com/cids/-/cids-1.1.9.tgz#402c26db5c07059377bcd6fb82f2a24e7f2f4a4f" + integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== + dependencies: + multibase "^4.0.1" + multicodec "^3.0.1" + multihashes "^4.0.1" + uint8arrays "^3.0.0" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -5178,7 +6252,12 @@ cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.3: +cookiejar@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== + +copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.2, copy-to-clipboard@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== @@ -5274,13 +6353,20 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-fetch@^3.0.4, cross-fetch@^3.1.4, cross-fetch@^3.1.5: +cross-fetch@^3.0.4, cross-fetch@^3.1.4, cross-fetch@^3.1.5, cross-fetch@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: node-fetch "^2.6.12" +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -5290,6 +6376,16 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^3.1.9-1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + css-background-parser@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/css-background-parser/-/css-background-parser-0.1.0.tgz#48a17f7fe6d4d4f1bca3177ddf16c5617950741b" @@ -5375,6 +6471,14 @@ cxs@^6.2.0: resolved "https://registry.yarnpkg.com/cxs/-/cxs-6.2.0.tgz#f11ca3bdaef154b93bdadca5df70f2cb3e37ca24" integrity sha512-RGatb1BUwVMBzV8DRo9Kapc55bdGfAxMcukVk+ZzE3Ts8xaTve0GVz730kBDxjhEBU2LK+RPuAcjZb00Q3O24w== +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dag-jose@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/dag-jose/-/dag-jose-4.0.0.tgz#4e65f62af58dd5203b2b094eb52142ffe0cdec1d" @@ -5431,6 +6535,13 @@ decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -5642,6 +6753,11 @@ dom-serializer@^2.0.0: domhandler "^5.0.2" entities "^4.2.0" +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" @@ -5695,6 +6811,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +eip1193-provider@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/eip1193-provider/-/eip1193-provider-1.0.1.tgz#420d29cf4f6c443e3f32e718fb16fafb250637c3" + integrity sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g== + dependencies: + "@json-rpc-tools/provider" "^1.5.5" + electron-fetch@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" @@ -5707,7 +6830,7 @@ electron-to-chromium@^1.4.477: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz#d99286f6e915667fa18ea4554def1aa60eb4d5f1" integrity sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -5800,6 +6923,13 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +erc721a-upgradeable@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/erc721a-upgradeable/-/erc721a-upgradeable-3.3.0.tgz#c7b481668694756120868261fe98ab3a245a06b4" + integrity sha512-ILE0SjKuvhx+PABG0A/41QUp0MFiYmzrgo71htQ0Ov6JfDOmgUzGxDW8gZuYfKrdlYjNwSAqMpUFWBbyW3sWBA== + dependencies: + "@openzeppelin/contracts-upgradeable" "^4.4.2" + err-code@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" @@ -5911,7 +7041,25 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promise@^4.0.3: +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3, es6-promise@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== @@ -5923,6 +7071,14 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -6176,6 +7332,27 @@ eth-json-rpc-filters@5.1.0: json-rpc-engine "^6.1.0" pify "^5.0.0" +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-provider@^0.13.6: + version "0.13.6" + resolved "https://registry.yarnpkg.com/eth-provider/-/eth-provider-0.13.6.tgz#664ad8a5b0aa5db41ff419e6cc1081b4588f1c12" + integrity sha512-/i0qSQby/rt3CCZrNVlgBdCUYQBwULStFRlBt7+ULNVpwbsYWl9VWXFaQxsbJLOo0x7swRS3OknIdlxlunsGJw== + dependencies: + ethereum-provider "0.7.7" + events "3.3.0" + oboe "2.1.5" + uuid "9.0.0" + ws "8.9.0" + xhr2-cookies "1.1.0" + eth-query@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" @@ -6198,6 +7375,13 @@ eth-rpc-errors@^4.0.2: dependencies: fast-safe-stringify "^2.0.6" +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" @@ -6229,6 +7413,23 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +ethereum-provider@0.7.7: + version "0.7.7" + resolved "https://registry.yarnpkg.com/ethereum-provider/-/ethereum-provider-0.7.7.tgz#c67c69aa9ced8f728dacc2b4c00ad4a8bf329319" + integrity sha512-ulbjKgu1p2IqtZqNTNfzXysvFJrMR3oTmWEEX3DnoEae7WLd4MkY4u82kvXhxA2C171rK8IVlcodENX7TXvHTA== + dependencies: + events "3.3.0" + ethereum-waffle@^4.0.10: version "4.0.10" resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz#f1ef1564c0155236f1a66c6eae362a5d67c9f64c" @@ -6284,7 +7485,7 @@ ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5, ethers@^5.7.1: +ethers@5.7.2, ethers@^5, ethers@^5.7.0, ethers@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -6320,6 +7521,14 @@ ethers@^5, ethers@^5.7.1: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" @@ -6328,17 +7537,27 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +eventemitter3@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + eventemitter3@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" integrity sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg== -eventemitter3@^4.0.7: +eventemitter3@^4.0.4, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.3.0: +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@3.3.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -6356,6 +7575,18 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +explain-error@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/explain-error/-/explain-error-1.0.4.tgz#a793d3ac0cad4c6ab571e9968fbbab6cb2532929" + integrity sha512-/wSgNMxFusiYRy1rd19LT2SQlIXDppHpumpWo06wxjflD1OYxDLbl6rMVw+U3bxD5Nuhex4TKqv9Aem4D0lVzQ== + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -6573,7 +7804,7 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.12.1, follow-redirects@^1.15.0: +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -6701,6 +7932,11 @@ functions-have-names@^1.2.2, functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +fuse.js@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" + integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== + ganache@7.4.3: version "7.4.3" resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.4.3.tgz#e995f1250697264efbb34d4241c374a2b0271415" @@ -6840,6 +8076,14 @@ glob@^7.1.3, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -7128,6 +8372,11 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -7198,11 +8447,23 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +image-to-base64@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/image-to-base64/-/image-to-base64-2.2.0.tgz#743039f59dee15a5953a621ea8beeacbc487f99d" + integrity sha512-Z+aMwm/91UOQqHhrz7Upre2ytKhWejZlWV/JxUTD1sT7GWWKFDJUEV5scVQKnkzSgPHFuQBUEWcanO+ma0PSVw== + dependencies: + node-fetch "^2.6.0" + immediate@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immediate@~3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" @@ -7535,6 +8796,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" @@ -7687,6 +8953,14 @@ iso-url@^1.1.5: resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== +isomorphic-unfetch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + isomorphic-ws@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" @@ -8131,6 +9405,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + linebreak@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/linebreak/-/linebreak-1.1.0.tgz#831cf378d98bced381d8ab118f852bd50d81e46b" @@ -8169,6 +9450,15 @@ lit@2.7.6: lit-element "^3.3.0" lit-html "^2.7.0" +lit@^2.2.3: + version "2.8.0" + resolved "https://registry.yarnpkg.com/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" + integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== + dependencies: + "@lit/reactive-element" "^1.6.0" + lit-element "^3.3.0" + lit-html "^2.8.0" + loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.4.2" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" @@ -8187,6 +9477,13 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +localforage@^1.7.4: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -8300,6 +9597,16 @@ lz-string@^1.5.0: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +magic-sdk@^13.6.2: + version "13.6.2" + resolved "https://registry.yarnpkg.com/magic-sdk/-/magic-sdk-13.6.2.tgz#68766fd9d1805332d2a00e5da1bd30fce251a6ac" + integrity sha512-ZjIZM2gqaxxOR+ZAyKVw50akjfdyo0q5hZzrCMiqyCqh4BXulU7yqHgUa/5/nJ+0/4xBgUejoOcDEm+UdmzLjA== + dependencies: + "@magic-sdk/commons" "^9.6.2" + "@magic-sdk/provider" "^13.6.2" + "@magic-sdk/types" "^11.6.2" + localforage "^1.7.4" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -8402,6 +9709,22 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" +merkletreejs@^0.2.24: + version "0.2.32" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" + integrity sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ== + dependencies: + bignumber.js "^9.0.1" + buffer-reverse "^1.0.1" + crypto-js "^3.1.9-1" + treeify "^1.1.0" + web3-utils "^1.3.4" + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -8435,11 +9758,28 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19: dependencies: mime-db "1.52.0" +mime@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + mini-css-extract-plugin@0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" @@ -8566,6 +9906,21 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multibase@^4.0.1, multibase@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" + integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== + dependencies: + "@multiformats/base-x" "^4.0.1" + +multicodec@^3.0.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-3.2.1.tgz#82de3254a0fb163a107c1aab324f2a91ef51efb2" + integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== + dependencies: + uint8arrays "^3.0.0" + varint "^6.0.0" + multiformats@^11.0.0, multiformats@^11.0.2: version "11.0.2" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60" @@ -8581,6 +9936,15 @@ multiformats@^9.4.2: resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== +multihashes@^4.0.1, multihashes@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" + integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== + dependencies: + multibase "^4.0.1" + uint8arrays "^3.0.0" + varint "^5.0.2" + nano-css@^5.3.1: version "5.3.5" resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.3.5.tgz#3075ea29ffdeb0c7cb6d25edb21d8f7fa8e8fe8e" @@ -8680,6 +10044,11 @@ next-redux-wrapper@^8.1.0: resolved "https://registry.yarnpkg.com/next-redux-wrapper/-/next-redux-wrapper-8.1.0.tgz#d9c135f1ceeb2478375bdacd356eb9db273d3a07" integrity sha512-2hIau0hcI6uQszOtrvAFqgc0NkZegKYhBB7ZAKiG3jk7zfuQb4E7OV9jfxViqqojh3SEHdnFfPkN9KErttUKuw== +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + next@13.4.7: version "13.4.7" resolved "https://registry.yarnpkg.com/next/-/next-13.4.7.tgz#2ab20e6fada2e25cb81bd17f68956705ffd9824e" @@ -8721,6 +10090,13 @@ node-addon-api@^6.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.6.8: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-fetch@^2.6.12: version "2.6.12" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" @@ -8728,13 +10104,6 @@ node-fetch@^2.6.12: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.7, node-fetch@^2.6.8: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - node-gyp-build@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" @@ -8760,6 +10129,14 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -8863,6 +10240,13 @@ oblivious-set@1.0.0: resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== + dependencies: + http-https "^1.0.0" + oidc-token-hash@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" @@ -9019,6 +10403,11 @@ parse-duration@^1.0.0: resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.0.tgz#5192084c5d8f2a3fd676d04a451dbd2e05a1819c" integrity sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ== +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -9321,6 +10710,11 @@ process-warning@^1.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -9393,6 +10787,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +qr.js@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" + integrity sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ== + qrcode.react@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/qrcode.react/-/qrcode.react-3.1.0.tgz#5c91ddc0340f768316fbdb8fff2765134c2aecd8" @@ -9448,6 +10847,15 @@ query-string@^4.2.2: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + query-string@^6.13.5: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -9594,6 +11002,11 @@ react-image-crop@^10.1.5: dependencies: clsx "^1.2.1" +react-ipfs-image@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/react-ipfs-image/-/react-ipfs-image-0.7.1.tgz#1a4a19e7b0cb14404c74f190996a9508bdebbb0b" + integrity sha512-PN4Ji77YDkZJ67CoZkbcW/iQ6UMxrkIHe6Y7EXv3ehBzKhYgp99ju7GqQ/x8/j1DwtmRunhvwbmk3rdtR6ZtWQ== + react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -9643,6 +11056,14 @@ react-property@2.0.0: resolved "https://registry.yarnpkg.com/react-property/-/react-property-2.0.0.tgz#2156ba9d85fa4741faf1918b38efc1eae3c6a136" integrity sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw== +react-qr-code@^2.0.11: + version "2.0.12" + resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.12.tgz#98f99e9ad5ede46d73ab819e2dd9925c5f5d7a2d" + integrity sha512-k+pzP5CKLEGBRwZsDPp98/CAJeXlsYRHM2iZn1Sd5Th/HnKhIZCSg27PXO58zk8z02RaEryg+60xa4vyywMJwg== + dependencies: + prop-types "^15.8.1" + qr.js "0.0.0" + react-query@^3.39.3: version "3.39.3" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" @@ -9692,6 +11113,17 @@ react-remove-scroll@2.5.4: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-remove-scroll@2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + react-router@^3.2.1: version "3.2.6" resolved "https://registry.yarnpkg.com/react-router/-/react-router-3.2.6.tgz#cad202796a7bba3efc2100da453b3379c9d4aeb4" @@ -9789,7 +11221,7 @@ react@18.2.0: dependencies: loose-envify "^1.1.0" -readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.0.0, readable-stream@^3.1.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -10297,6 +11729,15 @@ simple-concat@^1.0.0: resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== +simple-get@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-get@^4.0.0, simple-get@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" @@ -10435,6 +11876,13 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== +split2@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + split2@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" @@ -10822,6 +12270,11 @@ thread-stream@^0.15.1: dependencies: real-require "^0.1.0" +three@^0.146.0: + version "0.146.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.146.0.tgz#fd80f0d128ab4bb821a02191ae241e4e6326f17a" + integrity sha512-1lvNfLezN6OJ9NaFAhfX4sm5e9YCzHtaRgZ1+B4C+Hv6TibRMsuBAM5/wVKzxjpYIlMymvgsHEFrrigEfXnb2A== + three@^0.95.0: version "0.95.0" resolved "https://registry.yarnpkg.com/three/-/three-0.95.0.tgz#b60ea076ba17df9faba9e855b86ab3f541289abf" @@ -10837,6 +12290,11 @@ throttle-debounce@^3.0.1: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + timeout-abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz#dd57ffca041652c03769904f8d95afd93fb95595" @@ -10854,6 +12312,11 @@ tiny-invariant@1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73" integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA== +tiny-invariant@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" @@ -10901,6 +12364,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" @@ -11035,6 +12503,16 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + typechain@^8.0.0: version "8.3.1" resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.1.tgz#dccbc839b94877997536c356380eff7325395cfb" @@ -11090,7 +12568,7 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typedarray-to-buffer@3.1.5: +typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -11137,6 +12615,13 @@ uint8arraylist@^2.0.0, uint8arraylist@^2.1.2, uint8arraylist@^2.4.3: dependencies: uint8arrays "^4.0.2" +uint8arrays@^2.1.3: + version "2.1.10" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" + integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== + dependencies: + multiformats "^9.4.2" + uint8arrays@^3.0.0, uint8arrays@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" @@ -11168,6 +12653,11 @@ undici@^5.12.0, undici@^5.14.0: dependencies: busboy "^1.6.0" +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -11241,6 +12731,11 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== + url@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" @@ -11290,12 +12785,17 @@ utf-8-validate@^5.0.2: dependencies: node-gyp-build "^4.3.0" +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.4: +util@^0.12.0, util@^0.12.4, util@^0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -11306,6 +12806,11 @@ util@^0.12.4: is-typed-array "^1.1.3" which-typed-array "^1.1.2" +uuid@9.0.0, uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -11334,6 +12839,11 @@ valtio@1.11.0: proxy-compare "2.5.1" use-sync-external-store "1.2.0" +varint@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== + varint@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" @@ -11407,6 +12917,218 @@ watchpack@2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +web3-core-helpers@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz#bd47686c0e74ef4475713c581f9306a035ce8a74" + integrity sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ== + dependencies: + web3-eth-iban "1.10.2" + web3-utils "1.10.2" + +web3-core-helpers@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.2.tgz#b6bd5071ca099ba3f92dfafb552eed2b70af2795" + integrity sha512-U7LJoeUdQ3aY9t5gU7t/1XpcApsWm+4AcW5qKl/44ZxD44w0Dmsq1c5zJm3GuLr/a9MwQfXK4lpmvxVQWHHQRg== + dependencies: + web3-eth-iban "1.5.2" + web3-utils "1.5.2" + +web3-core-method@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.2.tgz#4adf3f8c8d0776f0f320e583b791955c41037971" + integrity sha512-gG6ES+LOuo01MJHML4gnEt702M8lcPGMYZoX8UjZzmEebGrPYOY9XccpCrsFgCeKgQzM12SVnlwwpMod1+lcLg== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.10.2" + web3-core-promievent "1.10.2" + web3-core-subscriptions "1.10.2" + web3-utils "1.10.2" + +web3-core-method@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.2.tgz#d1d602657be1000a29d11e3ca3bf7bc778dea9a5" + integrity sha512-/mC5t9UjjJoQmJJqO5nWK41YHo+tMzFaT7Tp7jDCQsBkinE68KsUJkt0jzygpheW84Zra0DVp6q19gf96+cugg== + dependencies: + "@ethereumjs/common" "^2.4.0" + "@ethersproject/transactions" "^5.0.0-beta.135" + web3-core-helpers "1.5.2" + web3-core-promievent "1.5.2" + web3-core-subscriptions "1.5.2" + web3-utils "1.5.2" + +web3-core-promievent@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz#13b380b69ee05c5bf075836be64c2f3b8bdc1a5f" + integrity sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw== + dependencies: + eventemitter3 "4.0.4" + +web3-core-promievent@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.2.tgz#2dc9fe0e5bbeb7c360fc1aac5f12b32d9949a59b" + integrity sha512-5DacbJXe98ozSor7JlkTNCy6G8945VunRRkPxMk98rUrg60ECVEM/vuefk1atACzjQsKx6tmLZuHxbJQ64TQeQ== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.2.tgz#f5b1264c6470c033f08e21210b0af0c23497c68a" + integrity sha512-nlLeNJUu6fR+ZbJr2k9Du/nN3VWwB4AJPY4r6nxUODAmykgJq57T21cLP/BEk6mbiFQYGE9TrrPhh4qWxQEtAw== + dependencies: + util "^0.12.5" + web3-core-helpers "1.10.2" + web3-providers-http "1.10.2" + web3-providers-ipc "1.10.2" + web3-providers-ws "1.10.2" + +web3-core-requestmanager@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.2.tgz#43ccc00779394c941b28e6e07e217350fd1ded71" + integrity sha512-oRVW9OrAsXN2JIZt68OEg1Mb1A9a/L3JAGMv15zLEFEnJEGw0KQsGK1ET2kvZBzvpFd5G0EVkYCnx7WDe4HSNw== + dependencies: + util "^0.12.0" + web3-core-helpers "1.5.2" + web3-providers-http "1.5.2" + web3-providers-ipc "1.5.2" + web3-providers-ws "1.5.2" + +web3-core-subscriptions@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.2.tgz#d325483141ab1406241d6707b86fd6944e4b7ea6" + integrity sha512-MiWcKjz4tco793EPPPLc/YOJmYUV3zAfxeQH/UVTfBejMfnNvmfwKa2SBKfPIvKQHz/xI5bV2TF15uvJEucU7w== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.2" + +web3-core-subscriptions@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.2.tgz#8eaebde44f81fc13c45b555c4422fe79393da9cf" + integrity sha512-hapI4rKFk22yurtIv0BYvkraHsM7epA4iI8Np+HuH6P9DD0zj/llaps6TXLM9HyacLBRwmOLZmr+pHBsPopUnQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.5.2" + +web3-core@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.2.tgz#ca2b9b1ed3cf84d48b31c9bb91f7628f97cfdcd5" + integrity sha512-sebMpQbg3kbh3vHUbHrlKGKOxDWqjgt8KatmTBsTAWj/HwWYVDzeX+2Q84+swNYsm2DrTBVFlqTErFUwPBvyaA== + dependencies: + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.5.2" + web3-core-method "1.5.2" + web3-core-requestmanager "1.5.2" + web3-utils "1.5.2" + +web3-core@^1.8.1: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.2.tgz#464a15335b3adecc4a1cdd53c89b995769059f03" + integrity sha512-qTn2UmtE8tvwMRsC5pXVdHxrQ4uZ6jiLgF5DRUVtdi7dPUmX18Dp9uxKfIfhGcA011EAn8P6+X7r3pvi2YRxBw== + dependencies: + "@types/bn.js" "^5.1.1" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.10.2" + web3-core-method "1.10.2" + web3-core-requestmanager "1.10.2" + web3-utils "1.10.2" + +web3-eth-iban@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz#f8e668034834c5be038adeb14c39b923e9257558" + integrity sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A== + dependencies: + bn.js "^5.2.1" + web3-utils "1.10.2" + +web3-eth-iban@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.2.tgz#f390ad244ef8a6c94de7c58736b0b80a484abc8e" + integrity sha512-C04YDXuSG/aDwOHSX+HySBGb0KraiAVt+/l1Mw7y/fCUrKC/K0yYzMYqY/uYOcvLtepBPsC4ZfUYWUBZ2PO8Vg== + dependencies: + bn.js "^4.11.9" + web3-utils "1.5.2" + +web3-providers-http@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.2.tgz#8bd54b5bc5bcc50612fd52af65bd773f926045f7" + integrity sha512-G8abKtpkyKGpRVKvfjIF3I4O/epHP7mxXWN8mNMQLkQj1cjMFiZBZ13f+qI77lNJN7QOf6+LtNdKrhsTGU72TA== + dependencies: + abortcontroller-polyfill "^1.7.5" + cross-fetch "^4.0.0" + es6-promise "^4.2.8" + web3-core-helpers "1.10.2" + +web3-providers-http@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.2.tgz#94f95fe5572ca54aa2c2ffd42c63956436c9eb0a" + integrity sha512-dUNFJc9IMYDLZnkoQX3H4ZjvHjGO6VRVCqrBrdh84wPX/0da9dOA7DwIWnG0Gv3n9ybWwu5JHQxK4MNQ444lyA== + dependencies: + web3-core-helpers "1.5.2" + xhr2-cookies "1.1.0" + +web3-providers-ipc@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.2.tgz#4314a04c1d68f5d1cb2d047d027db97c85f921f7" + integrity sha512-lWbn6c+SgvhLymU8u4Ea/WOVC0Gqs7OJUvauejWz+iLycxeF0xFNyXnHVAi42ZJDPVI3vnfZotafoxcNNL7Sug== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.10.2" + +web3-providers-ipc@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.2.tgz#68a516883c998eeddf60df4cead77baca4fb4aaa" + integrity sha512-SJC4Sivt4g9LHKlRy7cs1jkJgp7bjrQeUndE6BKs0zNALKguxu6QYnzbmuHCTFW85GfMDjhvi24jyyZHMnBNXQ== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.5.2" + +web3-providers-ws@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.2.tgz#00bf6e00080dd82b8ad7fbed657a6d20ecc532de" + integrity sha512-3nYSiP6grI5GvpkSoehctSywfCTodU21VY8bUtXyFHK/IVfDooNtMpd5lVIMvXVAlaxwwrCfjebokaJtKH2Iag== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.2" + websocket "^1.0.32" + +web3-providers-ws@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.2.tgz#d336a93ed608b40cdcadfadd1f1bc8d32ea046e0" + integrity sha512-xy9RGlyO8MbJDuKv2vAMDkg+en+OvXG0CGTCM2BTl6l1vIdHpCa+6A/9KV2rK8aU9OBZ7/Pf+Y19517kHVl9RA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.5.2" + websocket "^1.0.32" + +web3-utils@1.10.2, web3-utils@^1.3.4, web3-utils@^1.8.1: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" + integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3-utils@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.2.tgz#150982dcb1918ffc54eba87528e28f009ebc03aa" + integrity sha512-quTtTeQJHYSxAwIBOCGEcQtqdVcFWX6mCFNoqnp+mRbq+Hxbs8CGgO/6oqfBx4OvxIOfCpgJWYVHswRXnbEu9Q== + dependencies: + bn.js "^4.11.9" + eth-lib "0.2.8" + ethereum-bloom-filters "^1.0.6" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -11420,6 +13142,18 @@ webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -11518,7 +13252,12 @@ ws@8.12.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== -ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: +ws@8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" + integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== + +ws@^7.4.0, ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -11528,7 +13267,44 @@ ws@^8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: +xhr-request-promise@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== + dependencies: + xhr-request "^1.1.0" + +xhr-request@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr2-cookies@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== + dependencies: + cookiejar "^2.1.1" + +xhr@^2.0.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -11543,6 +13319,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -11558,6 +13339,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -11586,7 +13372,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: +yargs@16.2.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -11631,11 +13417,21 @@ yoga-wasm-web@0.3.3, yoga-wasm-web@^0.3.3: resolved "https://registry.yarnpkg.com/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz#eb8e9fcb18e5e651994732f19a220cb885d932ba" integrity sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA== +zksync-web3@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" + integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ== + zod@3.21.4: version "3.21.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== +zod@^3.20.2: + version "3.22.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.2.tgz#3add8c682b7077c05ac6f979fea6998b573e157b" + integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg== + zustand@^4.3.1: version "4.4.1" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0" From c5328855eb4ec4ce41710ae452137e8b49f6cf3d Mon Sep 17 00:00:00 2001 From: folathecoder Date: Sun, 10 Sep 2023 14:40:41 +0100 Subject: [PATCH 21/28] Integrated campaign funding contract --- .../explore/exploreSearch/exploreSearch.tsx | 2 +- .../explore/projectCard/portfolioCard.tsx | 18 +-- .../explore/projectCard/projectCard.tsx | 7 +- .../children/headerSearch/headerSearch.tsx | 1 - .../header/children/userMenu/userMenu.tsx | 1 - .../NFTDetail/Children/NFTExplorer.tsx | 27 +++- .../NFTDetail/Children/NFTInfo.tsx | 18 +-- .../NFTDetail/Children/NFTTransaction.tsx | 98 +++++++----- .../marketplace/NFTDetail/NFTDetail.tsx | 72 ++++++--- .../marketplace/NFTDetail/NFTDetailStyles.ts | 9 +- .../marketplace/children/nftCard/nftCard.tsx | 14 +- .../explorerLayout/explorerLayout.tsx | 10 +- .../ProfileTabSection/ProfileTabSection.tsx | 4 - .../children/NFTCollection.tsx | 13 +- .../Children/FundProject/FundProject.tsx | 147 ++++++++++-------- .../ProjectCreationContext.tsx | 2 - src/contexts/NFTDetailContext.tsx | 9 +- src/contexts/ProjectDetailContext.tsx | 10 +- src/helpers/formatters.ts | 30 ++++ src/helpers/ipfsImageReader.ts | 28 ---- src/hooks/ContractHooks/useFundCampaign.tsx | 2 - src/hooks/ContractHooks/useGetCampaign.tsx | 41 ++++- src/hooks/RequestHooks/GET/useGetAllNfts.tsx | 43 +++++ src/hooks/RequestHooks/GET/useGetUserById.tsx | 55 +++++++ .../RequestHooks/PATCH/usePatchProject.tsx | 54 +++++++ src/hooks/RequestHooks/POST/usePostNft.tsx | 2 - .../RequestHooks/POST/usePostPortfolio.tsx | 2 - .../RequestHooks/POST/usePostProject.tsx | 7 - .../RequestHooks/POST/usePostUserNft.tsx | 53 +++++++ src/hooks/useNftMetadataCreator.tsx | 10 +- src/types/nftTypes.ts | 1 + src/types/projectTypes.ts | 1 + 32 files changed, 549 insertions(+), 242 deletions(-) delete mode 100644 src/helpers/ipfsImageReader.ts create mode 100644 src/hooks/RequestHooks/GET/useGetAllNfts.tsx create mode 100644 src/hooks/RequestHooks/GET/useGetUserById.tsx create mode 100644 src/hooks/RequestHooks/PATCH/usePatchProject.tsx create mode 100644 src/hooks/RequestHooks/POST/usePostUserNft.tsx diff --git a/src/components/explore/exploreSearch/exploreSearch.tsx b/src/components/explore/exploreSearch/exploreSearch.tsx index 81ecf00..7642216 100644 --- a/src/components/explore/exploreSearch/exploreSearch.tsx +++ b/src/components/explore/exploreSearch/exploreSearch.tsx @@ -74,7 +74,7 @@ const ExploreSearch = ({ fullWidth }: HeaderSearchTypes) => { const handleSearchSubmit = (e: FormEvent) => { e.preventDefault(); - console.log('Search term:', searchTerm); + setSearchTerm(''); }; diff --git a/src/components/explore/projectCard/portfolioCard.tsx b/src/components/explore/projectCard/portfolioCard.tsx index 66eb7e7..af8a4a6 100644 --- a/src/components/explore/projectCard/portfolioCard.tsx +++ b/src/components/explore/projectCard/portfolioCard.tsx @@ -10,6 +10,7 @@ import { import useGetProjectById from '@/hooks/RequestHooks/GET/useGetProjectById'; import ProjectCardSkeleton from './projectCardSkeleton'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; +import { formatPriceValue } from '@/helpers/formatters'; interface ProjectCardTypes { projectId: string; @@ -44,26 +45,21 @@ const PortfolioCard = ({ projectId }: ProjectCardTypes) => { )}

    {project?.project?.projectName}

    - {/* - {project?.project?.targetAmount && - project?.project?.amountRaised && ( - - )} - */}
    Min Investment
    {project?.project?.minInvestment && ( -

    {`> ${project.project.minInvestment} ${CURRENCY_SYMBOL}`}

    +

    {`> ${formatPriceValue( + project.project.minInvestment + )} ${CURRENCY_SYMBOL}`}

    )}
    Amount Raised
    {project?.project?.amountRaised ? ( -

    {`${project.project.amountRaised.toLocaleString()} ${CURRENCY_SYMBOL}`}

    +

    {`${formatPriceValue( + project.project.amountRaised + )} ${CURRENCY_SYMBOL}`}

    ) : ( project?.project?.amountRaised === 0 && (

    {`0 ${CURRENCY_SYMBOL}`}

    diff --git a/src/components/explore/projectCard/projectCard.tsx b/src/components/explore/projectCard/projectCard.tsx index 2a9141d..bbd2704 100644 --- a/src/components/explore/projectCard/projectCard.tsx +++ b/src/components/explore/projectCard/projectCard.tsx @@ -11,6 +11,7 @@ import { import { ProgressBar } from '@/components/global'; import useGetCategoryById from '@/hooks/RequestHooks/GET/useGetCategoyById'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; +import { formatPriceValue } from '@/helpers/formatters'; interface ProjectCardTypes { projectName: string; @@ -59,12 +60,14 @@ const ProjectCard = ({
    Min Investment
    - {minInvestment &&

    {`> ${minInvestment} ${CURRENCY_SYMBOL}`}

    } + {minInvestment && ( +

    {`> ${formatPriceValue(minInvestment)} ${CURRENCY_SYMBOL}`}

    + )}
    Amount Raised
    {amountRaised ? ( -

    {`${amountRaised.toLocaleString()} ${CURRENCY_SYMBOL}`}

    +

    {`${formatPriceValue(amountRaised)} ${CURRENCY_SYMBOL}`}

    ) : ( amountRaised === 0 &&

    {`0 ${CURRENCY_SYMBOL}`}

    )} diff --git a/src/components/global/header/children/headerSearch/headerSearch.tsx b/src/components/global/header/children/headerSearch/headerSearch.tsx index 5f4f053..2167f1c 100644 --- a/src/components/global/header/children/headerSearch/headerSearch.tsx +++ b/src/components/global/header/children/headerSearch/headerSearch.tsx @@ -49,7 +49,6 @@ const HeaderSearchBar = ({ fullWidth }: HeaderSearchTypes) => { const handleSearchSubmit = (e: FormEvent) => { e.preventDefault(); - console.log('Search term:', searchTerm); setSearchTerm(''); }; diff --git a/src/components/global/header/children/userMenu/userMenu.tsx b/src/components/global/header/children/userMenu/userMenu.tsx index 0e6ad47..415681d 100644 --- a/src/components/global/header/children/userMenu/userMenu.tsx +++ b/src/components/global/header/children/userMenu/userMenu.tsx @@ -16,7 +16,6 @@ import { shortenWalletAddress } from '@/helpers/formatters'; import { profileMenu } from '@/data/menuData'; import { useRouter } from 'next/router'; import { FaPowerOff } from 'react-icons/fa'; -import usePostAuth from '@/hooks/RequestHooks/POST/usePostAuth'; import { CroppedImage } from '@/components/global'; interface UserMenuTypes { diff --git a/src/components/marketplace/NFTDetail/Children/NFTExplorer.tsx b/src/components/marketplace/NFTDetail/Children/NFTExplorer.tsx index b679863..b454e23 100644 --- a/src/components/marketplace/NFTDetail/Children/NFTExplorer.tsx +++ b/src/components/marketplace/NFTDetail/Children/NFTExplorer.tsx @@ -9,8 +9,10 @@ import { ExplorerButton, } from '@/components/marketplace/NFTDetail/NFTDetailStyles'; import { BsBoxArrowUpRight } from 'react-icons/bs'; -import { FiCopy } from 'react-icons/fi'; import { CustomSkeleton } from '@/components/global'; +import useGetUsers from '@/hooks/RequestHooks/GET/useGetUsers'; +import { shortenWalletAddress } from '@/helpers/formatters'; +import { ETHERSCAN_URL } from '@/data/appInfo'; type Props = { mobile?: boolean; @@ -21,10 +23,18 @@ const NFTExplorer = ({ mobile }: Props) => { NFTDetailContext ) as NFTDetailContextReturnTypes; + const { users } = useGetUsers(); + + const owner = users?.filter((user) => user.userId === nft?.nft.ownerId)[0]; + return ( {nftFetchingStatus === 2 ? ( - +
    Scan on Ethereum Explorer
    @@ -41,11 +51,18 @@ const NFTExplorer = ({ mobile }: Props) => { /> )} {nftFetchingStatus === 2 ? ( - + -
    Contract Address (0x..324)
    - + Contract Address ( + {shortenWalletAddress(owner?.walletAddress ?? '')}) +
    +
    +
    diff --git a/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx b/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx index 449e70c..7cc9676 100644 --- a/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx +++ b/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx @@ -11,9 +11,8 @@ import { CreatorImage, } from '@/components/marketplace/NFTDetail/NFTDetailStyles'; import image from 'public/images/nft'; -import { Button } from '@/components/global'; +import { Button, CustomSkeleton } from '@/components/global'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; -import { CustomSkeleton } from '@/components/global'; const NFTInfo = () => { const { nft, nftFetchingStatus } = useContext( @@ -48,20 +47,7 @@ const NFTInfo = () => {
    {nftFetchingStatus === 2 ? ( - <> - -
    - - {''} - -
    -

    Creator

    -

    Ghost Rider

    -
    -
    -
    -

    {nftData?.nftDescription}

    - +

    {nftData?.nftDescription}

    ) : ( )} diff --git a/src/components/marketplace/NFTDetail/Children/NFTTransaction.tsx b/src/components/marketplace/NFTDetail/Children/NFTTransaction.tsx index 858beed..2778ea8 100644 --- a/src/components/marketplace/NFTDetail/Children/NFTTransaction.tsx +++ b/src/components/marketplace/NFTDetail/Children/NFTTransaction.tsx @@ -1,4 +1,6 @@ -import React, { useContext } from 'react'; +import React, { useContext, useRef } from 'react'; +import Lottie from 'react-lottie'; +import moment from 'moment'; import { NFTDetailContext, NFTDetailContextReturnTypes, @@ -11,14 +13,21 @@ import { OwnerImage, Owner, } from '@/components/marketplace/NFTDetail/NFTDetailStyles'; -import image from 'public/images/nft'; import { CustomSkeleton } from '@/components/global'; +import useGetUsers from '@/hooks/RequestHooks/GET/useGetUsers'; +import { ProfileLottie } from 'public/images'; +import { convertToDecimal } from '@/helpers/formatters'; const NFTTransaction = () => { - const { nftFetchingStatus } = useContext( + const { nftFetchingStatus, tokenURIData, nft } = useContext( NFTDetailContext ) as NFTDetailContextReturnTypes; + const { users } = useGetUsers(); + + const animationRef = useRef(null); + + const owner = users?.filter((user) => user.userId === nft?.nft.ownerId)[0]; return ( <> {nftFetchingStatus === 2 ? ( @@ -35,15 +44,30 @@ const NFTTransaction = () => {
    - {''} + {owner?.userProfileImage ? ( + {owner?.userName + ) : ( + + )}

    Owner

    -

    Apollo Jordan

    +

    {owner?.userName ?? ''}

    @@ -58,47 +82,43 @@ const NFTTransaction = () => {
    -

    Transactions

    +

    Attributes

    - - + {tokenURIData?.attributes.map((attribute, index) => ( +
    - -
    + {attribute && ( +
    -

    12 days ago

    -

    Bought by Apollo Jordan for $23.89

    +
    +

    {attribute.trait_type}

    +
    -
    -
    + + )}
    -
    View Details
    + {attribute && ( +

    + {attribute.trait_type === 'Share Price' && + `${attribute.value} ETH`} + {attribute.trait_type === 'Total Shares' && + `${attribute.value} ETH`} + {attribute.trait_type === 'Ownership Percentage' && + `${convertToDecimal(attribute.value as string)} %`} + {attribute.trait_type === 'Date Issued' && + moment(attribute.value).format('MMMM Do YYYY')} + {['Company', 'Industry', 'Share Class'].includes( + attribute.trait_type + ) && `${attribute.value as string}`} +

    + )}
    - - - -
    -
    - -
    -
    -

    42 days ago

    -

    Minted by Ghost Rider

    -
    -
    -
    -
    -
    -
    View Details
    -
    -
    -
    - + ))}
    diff --git a/src/components/marketplace/NFTDetail/NFTDetail.tsx b/src/components/marketplace/NFTDetail/NFTDetail.tsx index 899b10c..5d6b2af 100644 --- a/src/components/marketplace/NFTDetail/NFTDetail.tsx +++ b/src/components/marketplace/NFTDetail/NFTDetail.tsx @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import React, { useContext, useState, useEffect } from 'react'; import { NFTDetailContext, NFTDetailContextReturnTypes, @@ -10,7 +10,6 @@ import { DetailRight, DetailImage, } from '@/components/marketplace/NFTDetail/NFTDetailStyles'; -import image from 'public/images/nft'; import { NavShare, NFTExplorer, @@ -26,35 +25,64 @@ const NFTDetail = () => { NFTDetailContext ) as NFTDetailContextReturnTypes; - const { nft: nftData } = nft || {}; + const { nft: nftData } = nft ?? {}; + + const [imageData, setImageData] = useState(null); + + // Function to fetch the content of ipfs image url and render the base64 erncoding to the frontend + function fetchAndReadContent(linkUrl: string) { + fetch(linkUrl) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.text(); + }) + .then((content) => { + setImageData(content); + }) + .catch((error) => { + console.error('Error fetching and reading content:', error); + }); + } + + useEffect(() => { + if (nftData?.nftImage) fetchAndReadContent(nftData?.nftImage); + }, [nftData?.nftImage]); return ( <>
    -
    - - - {nftFetchingStatus === 2 && nftData?.nftImage ? ( - {nftData.nftName} - ) : ( - - )} - - - + +
    + + + {nftFetchingStatus === 2 && nftData?.nftImage ? ( + {nftData.nftName} + ) : ( + + )} + + + +
    diff --git a/src/components/marketplace/NFTDetail/NFTDetailStyles.ts b/src/components/marketplace/NFTDetail/NFTDetailStyles.ts index 27b3a98..2fffedf 100644 --- a/src/components/marketplace/NFTDetail/NFTDetailStyles.ts +++ b/src/components/marketplace/NFTDetail/NFTDetailStyles.ts @@ -9,6 +9,7 @@ export const DetailContainer = styled.section` margin: var(--center-container); min-height: 500px; padding: 20px; + position: relative; & > * { display: flex; @@ -17,6 +18,7 @@ export const DetailContainer = styled.section` @media screen and (min-width: 1000px) { flex-direction: row; + align-items: flex-start; } & > * { @@ -31,6 +33,7 @@ export const DetailContainer = styled.section` export const DetailLeft = styled.div` width: calc(100vw - 40px); + height: 100%; @media screen and (min-width: 499px) { width: 450px; @@ -38,6 +41,8 @@ export const DetailLeft = styled.div` @media screen and (min-width: 1000px) { padding-right: 40px; + position: sticky; + top: 100px; } `; @@ -159,6 +164,8 @@ export const DetailOption = styled.div` `; export const DetailContent = styled.div` + margin-top: 20px; + h1 { font-size: 30px; line-height: 35px; @@ -177,7 +184,7 @@ export const DetailContent = styled.div` } p { - margin: 10px 0px 20px 0px; + margin: 30px 0px 20px 0px; } `; diff --git a/src/components/marketplace/children/nftCard/nftCard.tsx b/src/components/marketplace/children/nftCard/nftCard.tsx index 3f6ae5a..6057e31 100644 --- a/src/components/marketplace/children/nftCard/nftCard.tsx +++ b/src/components/marketplace/children/nftCard/nftCard.tsx @@ -1,5 +1,4 @@ import React, { useState, useEffect } from 'react'; -import { IpfsImage } from 'react-ipfs-image'; import Image from 'next/image'; import Link from 'next/link'; import { @@ -7,10 +6,10 @@ import { NFTImageContainer, NFTTitle, NFTInfo, - NFTCreator, } from './nftCardStyles'; import useGetNftById from '@/hooks/RequestHooks/GET/useGetNftById'; -import { renderIPFSImage } from '@/helpers/ipfsImageReader'; +import { formatPriceValue } from '@/helpers/formatters'; +import { CURRENCY_SYMBOL } from '@/data/appInfo'; interface PropType { nftId: string; @@ -18,12 +17,11 @@ interface PropType { const NFTCard = ({ nftId }: PropType) => { const { nft, fetchingStatus } = useGetNftById({ nftId }); - const { nft: data } = nft || {}; + const { nft: data } = nft ?? {}; const [imageData, setImageData] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); + // Function to fetch the content of ipfs image url and render the base64 erncoding to the frontend function fetchAndReadContent(linkUrl: string) { fetch(linkUrl) .then((response) => { @@ -72,7 +70,9 @@ const NFTCard = ({ nftId }: PropType) => {
    Price
    -

    {data.price.toLocaleString()} ETH

    +

    + {formatPriceValue(data.price)} {CURRENCY_SYMBOL} +

    diff --git a/src/components/marketplace/explorerLayout/explorerLayout.tsx b/src/components/marketplace/explorerLayout/explorerLayout.tsx index b4a74ae..0e70d6d 100644 --- a/src/components/marketplace/explorerLayout/explorerLayout.tsx +++ b/src/components/marketplace/explorerLayout/explorerLayout.tsx @@ -18,8 +18,6 @@ import { import { NFTCard, NFTSearch } from '@/components/marketplace'; import { ProjectCardSkeleton } from '@/components/explore'; import ExploreFilter from '@/components/marketplace/children/exploreFilter/exploreFilter'; -import { GoFilter } from 'react-icons/go'; -import { useBreakPointDown } from '@/hooks/useBreakPoint'; import HoldersSection from '@/components/marketplace/children/HoldersSection/holdersSection'; import MarketplaceProvider from '@/contexts/MarketplaceContext'; import { LottieImage } from '@/components/global'; @@ -72,9 +70,11 @@ const ExploreProject = () => { new Array(14) .fill(null) .map((item) => )} - {filteredNfts?.map((nft) => ( - - ))} + {filteredNfts + .filter((nft) => nft.price !== 0) + ?.map((nft) => ( + + ))} {fetchingStatus === 2 && filteredNfts?.length === 0 && ( diff --git a/src/components/profile/children/ProfileTabSection/ProfileTabSection.tsx b/src/components/profile/children/ProfileTabSection/ProfileTabSection.tsx index 9750a57..31d7ff8 100644 --- a/src/components/profile/children/ProfileTabSection/ProfileTabSection.tsx +++ b/src/components/profile/children/ProfileTabSection/ProfileTabSection.tsx @@ -47,10 +47,6 @@ type Tab = { content: string; }; -type TabsProps = { - tabs: Tab[]; -}; - const ProfileTabSection = () => { const [activeTab, setActiveTab] = useState(tabs[0].id); diff --git a/src/components/profile/children/ProfileTabSection/children/NFTCollection.tsx b/src/components/profile/children/ProfileTabSection/children/NFTCollection.tsx index 581aa82..78d04b9 100644 --- a/src/components/profile/children/ProfileTabSection/children/NFTCollection.tsx +++ b/src/components/profile/children/ProfileTabSection/children/NFTCollection.tsx @@ -6,19 +6,22 @@ import { } from '@/components/profile/context/ProfileContext'; import { NFTCollectionSection } from '@/components/profile/children/ProfileTabSection/ProfileTabSectionStyles'; import { NFTCard } from '@/components/marketplace'; +import useGetAllNfts from '@/hooks/RequestHooks/GET/useGetAllNfts'; const NFTCollection = () => { const { user } = useContext(ProfileContext) as ProfileReturnTypes; - const { ownedNfts } = user || {}; + const { nfts } = useGetAllNfts(); return (
    - {ownedNfts && ownedNfts.length > 0 ? ( + {nfts && nfts.length > 0 ? ( <> - {ownedNfts?.map((nft) => ( - - ))} + {nfts + .filter((nft) => nft.ownerId === user?.user.userId) + ?.map((nft) => ( + + ))} ) : (

    diff --git a/src/components/project/Children/FundProject/FundProject.tsx b/src/components/project/Children/FundProject/FundProject.tsx index 5e2ad2e..397070b 100644 --- a/src/components/project/Children/FundProject/FundProject.tsx +++ b/src/components/project/Children/FundProject/FundProject.tsx @@ -9,17 +9,20 @@ import { ProgressWrapper, FundItem, } from './FundProjectStyles'; -import { ProgressBar, TransactionLoader, Timer } from '@/components/global'; +import { + ProgressBar, + TransactionLoader, + Timer, + Notification, +} from '@/components/global'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; import useWallet from '@/wallet/useWallet'; -import { Notification } from '@/components/global'; import useRegisterUser from '@/hooks/ContractHooks/useRegisterUser'; import useGetCampaign from '@/hooks/ContractHooks/useGetCampaign'; -import { weiConverter, weiToEther } from '@/helpers/weiConverter'; -import useGetTokenId from '@/hooks/ContractHooks/useGetTokenId'; import useFundCampaign from '@/hooks/ContractHooks/useFundCampaign'; import usePostNft from '@/hooks/RequestHooks/POST/usePostNft'; import usePostPortfolio from '@/hooks/RequestHooks/POST/usePostPortfolio'; +import { formatPriceValue } from '@/helpers/formatters'; export const fundings: FundProjectTypes = { target: { @@ -66,14 +69,18 @@ const FundProject = ({ }: FundProjectTypes) => { const { wallet } = useWallet(); const { userData } = useContext(AppContext) as AppContextReturnTypes; - const { fundAmount, setFundAmount, generateNftImage, project, tokenURI } = - useContext(ProjectDetailContext) as ProjectDetailContextReturnTypes; + const { + fundAmount, + setFundAmount, + generateNftImage, + project, + tokenURI, + tokenURILoading, + } = useContext(ProjectDetailContext) as ProjectDetailContextReturnTypes; const [notificationMessage, setNotificationMessage] = useState(''); const [showNotification, setShowNotification] = useState(false); const [showFundButton, setShowFundButton] = useState(false); - const [fundingLoading, setFundingLoading] = useState(false); - const [hasStartedFunding, setHasStartedFunding] = useState(false); // Get the project data from the backend const { project: data } = useContext( @@ -91,23 +98,19 @@ const FundProject = ({ // Get updated campaign funding data from the smart contract const { campaign } = useGetCampaign({ projectAddress: project?.project.projectWalletAddress as `0x${string}`, + project: data, + token: tokenURI || '', }); // Fund a campaign on the blockchain - const { - fundCampaign, - isFundingSuccess, - isFundingLoading, - isFundingError, - isFundingIdle, - } = useFundCampaign({ + const { fundCampaign, isFundingSuccess, isFundingLoading } = useFundCampaign({ campaignAddress: project?.project.projectWalletAddress as `0x${string}`, fundAmount: Number(fundAmount), tokenURI: tokenURI || '', }); // Create a new NFT - const { nftData, fetchError, fetchStatus, createNFT } = usePostNft({ + const { createNFT } = usePostNft({ tokenURI: tokenURI || '', projectCategoryId: project?.category.categoryId || '', }); @@ -136,8 +139,8 @@ const FundProject = ({ setFundAmount(Number(value)); }; - // Function to generate NFT Metadata and fund a project - const handleFundProject = async () => { + // Function to generate NFT Metadata + const handleGenerateNft = async () => { if ( project?.project.minInvestment && fundAmount !== 0 && @@ -146,30 +149,29 @@ const FundProject = ({ campaign?.campaignStatus === 1 && fundAmount >= project?.project.minInvestment ) { - setFundingLoading(true); - await generateNftImage(); + generateNftImage(); } else { - setFundingLoading(false); setShowNotification(true); fundErrorMessage(); } }; - // Initiate the funding process then the tokenURI is avaiable - useEffect(() => { - if (tokenURI && !hasStartedFunding) { - console.log('Yeasss 1'); - const startFunding = async () => { - await fundCampaign(); - setHasStartedFunding(true); // Mark as started - - console.log('Yeasss 2'); - }; - - startFunding(); + // Function initialize the fundCampaign function on the smart contract + const handleFundProject = async () => { + if ( + project?.project.minInvestment && + fundAmount !== 0 && + fundAmount !== '' && + wallet.walletStatus.isConnected && + campaign?.campaignStatus === 1 && + fundAmount >= project?.project.minInvestment + ) { + await fundCampaign(); + } else { + setShowNotification(true); + fundErrorMessage(); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [tokenURI, hasStartedFunding]); + }; const fundErrorMessage = () => { if (fundAmount === 0) { @@ -197,37 +199,23 @@ const FundProject = ({ } }; - // Show campaign funding success message + // Series of events that occurs when camapaign is successfully funded useEffect(() => { if (isFundingSuccess) { - setFundingLoading(false); - - // Create NFT + // Create an NFT data on the backend createNFT(); - //Add Project to User Portfolio - addProjectToPortfolio(project?.project.projectId || '', fundAmount || 0); + // Add Project to User Portfolio + addProjectToPortfolio(project?.project.projectId ?? '', fundAmount || 0); + // Render notification setShowNotification(true); setNotificationMessage( `Congratuations, you have successfully funded ${project?.project.projectName} with ${fundAmount} ETH. Your newly minted share NFT has been added to your collection.` ); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ - fundAmount, - isFundingSuccess, - project?.project.projectId, - project?.project.projectName, - ]); - - useEffect(() => { - if (isFundingError) { - setFundingLoading(false); - } - }, [isFundingError]); - - console.log(tokenURI, isFundingSuccess, isFundingError); + }, [isFundingSuccess]); return ( @@ -244,7 +232,9 @@ const FundProject = ({

    {Number(campaign?.targetAmount) ? ` - ${Number(campaign?.targetAmount).toFixed(3)} ${CURRENCY_SYMBOL}` + ${formatPriceValue( + Number(campaign?.targetAmount) + )} ${CURRENCY_SYMBOL}` : '--'}

    {target.title}

    @@ -253,7 +243,9 @@ const FundProject = ({

    {Number(campaign?.raisedAmount) ? ` - ${Number(campaign?.raisedAmount).toFixed(3)} ${CURRENCY_SYMBOL}` + ${formatPriceValue( + Number(campaign?.raisedAmount) + )} ${CURRENCY_SYMBOL}` : Number(campaign?.raisedAmount) === 0 ? `0 ${CURRENCY_SYMBOL}` : '--'} @@ -263,7 +255,9 @@ const FundProject = ({

    {Number(campaign?.minFunding) - ? `${Number(campaign?.minFunding).toFixed(3)} ${CURRENCY_SYMBOL}` + ? `${formatPriceValue( + Number(campaign?.minFunding) + )} ${CURRENCY_SYMBOL}` : '--'}

    {investment.title}

    @@ -271,7 +265,7 @@ const FundProject = ({

    {campaign?.backersCount - ? `${campaign?.backersCount}` + ? `${formatPriceValue(campaign?.backersCount)}` : campaign?.backersCount === 0 ? '0' : '--'} @@ -283,7 +277,7 @@ const FundProject = ({ {data?.project.createdAt && campaign?.targetDeadline ? ( ) : ( '--' @@ -308,16 +302,31 @@ const FundProject = ({ /> )} {showFundButton ? ( - + ) : ( + )} - + ) : (

    + )}
    - )} -
    - +

    + Create an account on the blockchain to verify your wallet address + for all future NFT purchases. +

    + + )} + {user?.user.userId === nft?.nft.ownerId && + userData?.token && + wallet.walletAddress && + wallet.walletStatus.isConnected && + nftData?.price === 0 && ( + + + + +

    + Please note that the listing fee is {NFT_LISTING_FEE}{' '} + {CURRENCY_SYMBOL}, and it will be deducted from your wallet when + you initiate this transaction. +

    +
    + )} + {nftFetchingStatus === 2 ? (

    {nftData?.nftDescription}

    ) : ( )} + ); }; diff --git a/src/components/marketplace/NFTDetail/NFTDetailStyles.ts b/src/components/marketplace/NFTDetail/NFTDetailStyles.ts index 2fffedf..b1c78e7 100644 --- a/src/components/marketplace/NFTDetail/NFTDetailStyles.ts +++ b/src/components/marketplace/NFTDetail/NFTDetailStyles.ts @@ -194,6 +194,11 @@ export const DetailPrice = styled.div` align-items: center; justify-content: space-between; } + + P { + font-style: italic; + color: var(--color-font-300) + } `; export const Creator = styled.div` @@ -293,3 +298,55 @@ export const OwnerImage = styled.div` border-radius: 100%; } `; + +export const TransactionContainer = styled.div` + width: 100%; + margin: 2rem 0rem; + + input { + width: 100%; + height: 50px; + padding: 10px; + border-radius: 0.5rem; + border: 0.1rem solid var(--color-border-100); + background-color: var(--color-bg-200); + color: var(--color-font-100); + margin-bottom: 1rem; + + &:active { + outline: 0.1rem solid var(--color-accent-100); + } + + &:focus { + outline: 0.1rem solid var(--color-border-100); + } + + &:hover { + outline: 0.1rem solid var(--color-border-100); + } + } + + button { + width: 100%; + padding-block: 1rem; + text-transform: uppercase; + border-radius: 0.75rem; + border: 1px solid #fff; + display: flex; + justify-content: center; + + span { + margin-left: 1rem; + } + + &:hover { + background: black; + color: #fff; + } + } + + P { + font-style: italic; + color: var(--color-font-300) + } +`; diff --git a/src/components/project/Children/MainProject/MainProject.tsx b/src/components/project/Children/MainProject/MainProject.tsx index 527ef82..aa743a5 100644 --- a/src/components/project/Children/MainProject/MainProject.tsx +++ b/src/components/project/Children/MainProject/MainProject.tsx @@ -58,13 +58,14 @@ const MainProject: React.FC = () => { }; // Get updated campaign funding data from the smart contract - const { campaign } = useGetCampaign({ - projectAddress: project?.project.projectWalletAddress as `0x${string}`, - }); - const isWalletAvailable = campaign?.depositAddress - ? checkAddressIsValid(campaign.depositAddress) - : false; + // const { campaign } = useGetCampaign({ + // projectAddress: project?.project.projectWalletAddress as `0x${string}`, + // project: data, + // token: tokenURI || '', + // }); + + const isWalletAvailable = false; return ( diff --git a/src/contexts/MarketplaceContext.tsx b/src/contexts/MarketplaceContext.tsx index a3d84eb..c2f08e6 100644 --- a/src/contexts/MarketplaceContext.tsx +++ b/src/contexts/MarketplaceContext.tsx @@ -80,11 +80,11 @@ const MarketplaceProvider = ({ children }: PropTypes): ReactElement => { }, [exploreFilter]); const sortNftsByName = (nfts: NftMainType[]): NftMainType[] | [] => { - return nfts.sort((a, b) => a.nftName.localeCompare(b.nftName)); + return nfts.sort((a, b) => a.nftName?.localeCompare(b.nftName)); }; const filteredNfts = sortNftsByName(nfts || []).filter((project) => - project.nftName.toLowerCase().includes(searchTerm.toLowerCase()) + project.nftName?.toLowerCase().includes(searchTerm.toLowerCase()) ); return ( diff --git a/src/contexts/NFTDetailContext.tsx b/src/contexts/NFTDetailContext.tsx index 95e739a..937a651 100644 --- a/src/contexts/NFTDetailContext.tsx +++ b/src/contexts/NFTDetailContext.tsx @@ -9,6 +9,7 @@ export interface NFTDetailContextReturnTypes { nft: NftType | null; nftFetchingStatus: FetchingStatus; tokenURIData: MetadataType | null; + refetch: () => void; } interface PropTypes { @@ -20,7 +21,11 @@ export const NFTDetailContext = React.createContext(null); const NFTDetailProvider = ({ children, nftId }: PropTypes): ReactElement => { - const { nft, fetchingStatus: nftFetchingStatus } = useGetNftById({ + const { + nft, + fetchingStatus: nftFetchingStatus, + refetch, + } = useGetNftById({ nftId: nftId, }); @@ -29,7 +34,9 @@ const NFTDetailProvider = ({ children, nftId }: PropTypes): ReactElement => { }); return ( - + {children} ); diff --git a/src/helpers/formatters.ts b/src/helpers/formatters.ts index 2d5de6e..f25593a 100644 --- a/src/helpers/formatters.ts +++ b/src/helpers/formatters.ts @@ -116,3 +116,16 @@ export function formatPriceValue(num: number): string { return formatted.toLocaleString(); } + +export function extractNumberBehindLastHash(input: string): number | null { + // Regular expression to find the last '#' followed by numbers + const match = input.match(/#(\d+)(?!.*#\d+)/); + + // If there's a match, return the number behind the last '#' as a number. + if (match && match[1]) { + return parseInt(match[1], 10); + } + + // Return null if no matching number is found. + return null; +} diff --git a/src/hooks/ContractHooks/useBuyListedNft.tsx b/src/hooks/ContractHooks/useBuyListedNft.tsx new file mode 100644 index 0000000..a7b3dc7 --- /dev/null +++ b/src/hooks/ContractHooks/useBuyListedNft.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import useWallet from '@/wallet/useWallet'; +import { + usePrepareContractWrite, + useContractWrite, + useWaitForTransaction, +} from 'wagmi'; +import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; +import { extractNumberBehindLastHash } from '@/helpers/formatters'; +import { weiConverter } from '@/helpers/weiConverter'; + +interface ReturnType { + buyListedNFT: () => void; + isBuyingSuccess: boolean; + isBuyingLoading: boolean; + isBuyingIdle: boolean; + isBuyingError: boolean; +} + +interface PropType { + nftName: string; + nftPrice: number; +} + +const useBuyListedNft = ({ nftName, nftPrice }: PropType): ReturnType => { + const { wallet } = useWallet(); + + // Prepare contract write configuration for buyListedNFT function + const { config: buyListedNFTConfig } = usePrepareContractWrite({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: 'buyListedNFT', + chainId: 11155111, + account: wallet.walletAddress as `0x${string}`, + args: [extractNumberBehindLastHash(nftName)], + value: weiConverter(nftPrice), + }); + + // Write buy nft for sale data to the contract + const { write: writeBuyListedNFT, data: buyListedNFTData } = + useContractWrite(buyListedNFTConfig); + + // Wait for the Buying function transaction to complete + const { + isSuccess: isBuyingSuccess, + isLoading: isBuyingLoading, + isError: isBuyingError, + isIdle: isBuyingIdle, + } = useWaitForTransaction({ + hash: buyListedNFTData?.hash, + }); + + const buyListedNFT = async () => { + await writeBuyListedNFT?.(); + }; + + return { + buyListedNFT, + isBuyingSuccess, + isBuyingLoading, + isBuyingIdle, + isBuyingError, + }; +}; + +export default useBuyListedNft; diff --git a/src/hooks/ContractHooks/useGetCampaign.tsx b/src/hooks/ContractHooks/useGetCampaign.tsx index dc391c3..7442e79 100644 --- a/src/hooks/ContractHooks/useGetCampaign.tsx +++ b/src/hooks/ContractHooks/useGetCampaign.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import { useContractRead } from 'wagmi'; import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; import { weiToEther } from '@/helpers/weiConverter'; -import { ProjectDetailType, ProjectPostType } from '@/types/projectTypes'; +import { ProjectDetailType } from '@/types/projectTypes'; import usePatchProject from '@/hooks/RequestHooks/PATCH/usePatchProject'; interface ReturnType { diff --git a/src/hooks/ContractHooks/useListNFTForSale.tsx b/src/hooks/ContractHooks/useListNFTForSale.tsx new file mode 100644 index 0000000..62058c6 --- /dev/null +++ b/src/hooks/ContractHooks/useListNFTForSale.tsx @@ -0,0 +1,69 @@ +import useWallet from '@/wallet/useWallet'; +import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; +import { + usePrepareContractWrite, + useContractWrite, + useWaitForTransaction, +} from 'wagmi'; +import { weiConverter } from '@/helpers/weiConverter'; +import { NFT_LISTING_FEE } from '@/data/appInfo'; +import { extractNumberBehindLastHash } from '@/helpers/formatters'; + +interface ReturnType { + listNftForSale: () => void; + isListingSuccess: boolean; + isListingLoading: boolean; + isListingIdle: boolean; + isListingError: boolean; +} + +interface PropType { + nftName: string; + listPrice: number | ''; +} + +const useListNFTForSale = ({ nftName, listPrice }: PropType): ReturnType => { + const { wallet } = useWallet(); + + // Prepare contract write configuration for listNFTForSale function + const { config: listNftForSaleConfig } = usePrepareContractWrite({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: 'listNFTForSale', + chainId: 11155111, + account: wallet.walletAddress as `0x${string}`, + args: [ + extractNumberBehindLastHash(nftName), + weiConverter(Number(listPrice)), + ], + value: weiConverter(NFT_LISTING_FEE), + }); + + // Write list nft for sale data to the contract + const { write: writeListNftForSale, data: listNftForSaleData } = + useContractWrite(listNftForSaleConfig); + + // Wait for the Listing function transaction to complete + const { + isSuccess: isListingSuccess, + isLoading: isListingLoading, + isError: isListingError, + isIdle: isListingIdle, + } = useWaitForTransaction({ + hash: listNftForSaleData?.hash, + }); + + const listNftForSale = async () => { + await writeListNftForSale?.(); + }; + + return { + listNftForSale, + isListingSuccess, + isListingLoading, + isListingIdle, + isListingError, + }; +}; + +export default useListNFTForSale; diff --git a/src/hooks/RequestHooks/GET/useGetNftById.tsx b/src/hooks/RequestHooks/GET/useGetNftById.tsx index a9827b1..6ba4f8b 100644 --- a/src/hooks/RequestHooks/GET/useGetNftById.tsx +++ b/src/hooks/RequestHooks/GET/useGetNftById.tsx @@ -1,5 +1,5 @@ import axios from 'axios'; -import { useState, useEffect } from 'react'; +import { useState, useEffect, useCallback } from 'react'; import { FetchingStatus } from '@/types/fetchingTypes'; import { NftType } from '@/types/projectTypes'; @@ -11,6 +11,7 @@ interface NftReturnType { nft: NftType | null; fetchingStatus: FetchingStatus; error: string | null; + refetch: () => void; } const useGetNftById = ({ nftId }: PropsType): NftReturnType => { @@ -20,7 +21,8 @@ const useGetNftById = ({ nftId }: PropsType): NftReturnType => { FetchingStatus.Default ); - useEffect(() => { + // Refactored fetching logic into a separate function + const fetchNft = useCallback(() => { setFetchingStatus(FetchingStatus.Loading); axios @@ -39,7 +41,11 @@ const useGetNftById = ({ nftId }: PropsType): NftReturnType => { }); }, [nftId]); - return { nft, error, fetchingStatus }; + useEffect(() => { + fetchNft(); + }, [fetchNft]); + + return { nft, error, fetchingStatus, refetch: fetchNft }; }; export default useGetNftById; diff --git a/src/hooks/RequestHooks/PATCH/usePatchNft.tsx b/src/hooks/RequestHooks/PATCH/usePatchNft.tsx new file mode 100644 index 0000000..1304bc6 --- /dev/null +++ b/src/hooks/RequestHooks/PATCH/usePatchNft.tsx @@ -0,0 +1,47 @@ +import axios from 'axios'; +import { useState } from 'react'; +import { FetchingStatus } from '@/types/fetchingTypes'; +import { NFTPostType } from '@/types/nftTypes'; + +interface ReturnType { + fetchingStatus: FetchingStatus; + error: any; + updateNftData: (data: NFTPostType, nftId: string) => Promise; +} + +const usePatchNft = (): ReturnType => { + const [error, setError] = useState(null); + const [fetchingStatus, setFetchingStatus] = useState( + FetchingStatus.Default + ); + + const updateNftData = async (data: NFTPostType, nftId: string) => { + if (data) + try { + setFetchingStatus(FetchingStatus.Loading); + + const response = await axios.patch( + `${process.env.NEXT_PUBLIC_BACKEND_URL}/api/user/Nft/${nftId}`, + data, + { + headers: { + accept: '*/*', + }, + } + ); + + if (response.status === 204) { + setFetchingStatus(FetchingStatus.Fetched); + } + + return response.data; + } catch (error) { + setError(error); + setFetchingStatus(FetchingStatus.Error); + } + }; + + return { fetchingStatus, error, updateNftData }; +}; + +export default usePatchNft; diff --git a/src/types/nftTypes.ts b/src/types/nftTypes.ts index 6991de3..29252f0 100644 --- a/src/types/nftTypes.ts +++ b/src/types/nftTypes.ts @@ -17,3 +17,11 @@ export interface NFTPostData { categoryId: string; nftId: string; } + +export interface NFTPostType { + nftName: string; + nftDescription: string; + nftImage: string; + price: number; + ownerId: string; +} From 02ceb634b1879cda33ab844291c54d4e321066cf Mon Sep 17 00:00:00 2001 From: folathecoder Date: Mon, 11 Sep 2023 18:33:25 +0100 Subject: [PATCH 23/28] Integrated Final Smart Contract to Frontend --- .../NFTDetail/Children/NFTInfo.tsx | 13 +- .../profile/children/ProfileMetrics.tsx | 32 ++- .../Children/FundProject/FundProject.tsx | 6 + .../Children/MainProject/MainProject.tsx | 25 +- .../Children/MiniChildren/Wallet/Wallet.tsx | 241 ++++++++++++------ .../MiniChildren/Wallet/WalletStyles.ts | 6 + src/contexts/ProjectDetailContext.tsx | 13 + src/helpers/formatters.ts | 82 +----- src/helpers/inputChecks.ts | 11 +- src/hooks/ContractHooks/useBuyListedNft.tsx | 4 +- src/hooks/ContractHooks/useGetUserInfo.tsx | 47 ++++ src/hooks/ContractHooks/useGetWalletInfo.tsx | 134 ++++++++++ 12 files changed, 434 insertions(+), 180 deletions(-) create mode 100644 src/hooks/ContractHooks/useGetUserInfo.tsx create mode 100644 src/hooks/ContractHooks/useGetWalletInfo.tsx diff --git a/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx b/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx index bf65054..f161773 100644 --- a/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx +++ b/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx @@ -82,12 +82,9 @@ const NFTInfo = () => { const handleBuying = () => { if (isUserRegistered) { - console.log(1); if (wallet.walletAddress && wallet.walletStatus.isConnected) { - console.log(2); if (user?.user.userId !== nft?.nft.ownerId) { buyListedNFT(); - console.log(3); } else { setShowNotification(true); setNotificationMessage( @@ -222,10 +219,12 @@ const NFTInfo = () => {
    )} -

    - Create an account on the blockchain to verify your wallet address - for all future NFT purchases. -

    + {!showBuyButton && ( +

    + Create an account on the blockchain to verify your wallet + address for all future NFT purchases. +

    + )} )} {user?.user.userId === nft?.nft.ownerId && diff --git a/src/components/profile/children/ProfileMetrics.tsx b/src/components/profile/children/ProfileMetrics.tsx index de20136..8107254 100644 --- a/src/components/profile/children/ProfileMetrics.tsx +++ b/src/components/profile/children/ProfileMetrics.tsx @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import React, { useContext, useState } from 'react'; import { ProfileContext, ProfileReturnTypes } from '../context/ProfileContext'; import { MetricsContainer, @@ -6,18 +6,31 @@ import { } from '@/components/profile/ProfileStyles'; import { Button } from '@/components/global'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; +import useGetUserInfo from '@/hooks/ContractHooks/useGetUserInfo'; +import { Notification } from '@/components/global'; const ProfileMetrics = () => { + const [showNotification, setShowNotification] = useState(false); + const [notificationMessage, setNotificationMessage] = useState(''); + const { profileMetrics } = useContext(ProfileContext) as ProfileReturnTypes; const { walletBalance } = profileMetrics; + const { userInfo } = useGetUserInfo(); + + const handleClaim = () => { + setShowNotification(true); + setNotificationMessage('You have no dividends available to claim.'); + }; return (

    Total Investment

    -

    0.0 {CURRENCY_SYMBOL}

    +

    + {userInfo?.totalInvestedAmount ?? 0.0} {CURRENCY_SYMBOL} +

    Wallet Balance

    @@ -28,22 +41,29 @@ const ProfileMetrics = () => {

    Total Dividend

    - 0.0 {CURRENCY_SYMBOL} - +0.0% + {userInfo?.totalDividendEarned ?? 0.0} {CURRENCY_SYMBOL}

    Claimable Dividend

    -

    0.0 {CURRENCY_SYMBOL}

    +

    + {userInfo?.claimableBalance ?? 0.0} + {CURRENCY_SYMBOL} +

    +
    ); }; diff --git a/src/components/project/Children/FundProject/FundProject.tsx b/src/components/project/Children/FundProject/FundProject.tsx index 397070b..609c0ce 100644 --- a/src/components/project/Children/FundProject/FundProject.tsx +++ b/src/components/project/Children/FundProject/FundProject.tsx @@ -197,6 +197,12 @@ const FundProject = ({ } ETH. Please enter an amount greater or equal to this amount.` ); } + + if (campaign?.campaignStatus !== 1) { + setNotificationMessage( + 'The funding round is closed, please explore other projects on the platform.' + ); + } }; // Series of events that occurs when camapaign is successfully funded diff --git a/src/components/project/Children/MainProject/MainProject.tsx b/src/components/project/Children/MainProject/MainProject.tsx index aa743a5..e5a06e9 100644 --- a/src/components/project/Children/MainProject/MainProject.tsx +++ b/src/components/project/Children/MainProject/MainProject.tsx @@ -41,7 +41,7 @@ const internalLinkData: InternalDataTypes[] = [ ]; const MainProject: React.FC = () => { - const { project, updateCount, fundAmount } = useContext( + const { project, updateCount, fundAmount, tokenURI } = useContext( ProjectDetailContext ) as ProjectDetailContextReturnTypes; @@ -58,14 +58,16 @@ const MainProject: React.FC = () => { }; // Get updated campaign funding data from the smart contract + const { campaign } = useGetCampaign({ + projectAddress: project?.project.projectWalletAddress as `0x${string}`, + project: project, + token: tokenURI || '', + }); - // const { campaign } = useGetCampaign({ - // projectAddress: project?.project.projectWalletAddress as `0x${string}`, - // project: data, - // token: tokenURI || '', - // }); - - const isWalletAvailable = false; + // Check if the campaign has a wallet activated by the smart contract + const isWalletAvailable = campaign?.depositAddress + ? checkAddressIsValid(campaign.depositAddress) + : false; return ( @@ -105,7 +107,7 @@ const MainProject: React.FC = () => { {contents[activeContent]}
    - + { {project?.project.projectName && (

    {`This is a unique design of ${project?.project.projectName} Shares NFT. When you get one, - it will have all your investment info, like share price and ID. - The NFT also has a one-of-a-kind barcode that links to an ether - scanner.`} + it will have all your investment details, like share price and ID. + The NFT also has a one-of-a-kind barcode that links to the project on Crowdlaunch.`}

    )}
    diff --git a/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx b/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx index 8c0e53a..66dc7db 100644 --- a/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx +++ b/src/components/project/Children/MiniChildren/Wallet/Wallet.tsx @@ -13,18 +13,24 @@ import { WalletTransaction, WalletDeposit, WalletWithdraw, - Transactions, WalletDividend, } from './WalletStyles'; import { BsInfoCircle } from 'react-icons/bs'; import { BiCopy } from 'react-icons/bi'; import Tooltip from '@mui/material/Tooltip'; import { CURRENCY_SYMBOL } from '@/data/appInfo'; -import { BarcodeGenerator, Button, Notification } from '@/components/global'; +import { + BarcodeGenerator, + Button, + Notification, + Timer, +} from '@/components/global'; import { shortenWalletAddress } from '@/helpers/formatters'; -import DepositIcon from 'public/images/global/wallet/deposit-icon.png'; import LockIcon from 'public/images/global/wallet/lock.png'; import useWallet from '@/wallet/useWallet'; +import useGetWalletInfo from '@/hooks/ContractHooks/useGetWalletInfo'; +import useGetCampaign from '@/hooks/ContractHooks/useGetCampaign'; +import { formatPriceValue } from '@/helpers/formatters'; const walletInfoData = { currentBalance: 'Current ETH balance in the wallet.', @@ -35,10 +41,52 @@ const walletInfoData = { outstandingDividend: 'Pending dividend amount due to investors.', }; +interface DepositPropType { + depositAddress: `0x${string}`; +} + +interface WithdrawPropType { + withdraw: (amount: number) => Promise; + isWithdrawalSuccess: boolean; + isWithdrawalLoading: boolean; + isWithdrawalError: boolean; + currentBalance: string | undefined; +} + const Wallet = () => { + const { project, tokenURI, withdrawal } = useContext( + ProjectDetailContext + ) as ProjectDetailContextReturnTypes; + const [showNotification, setShowNotification] = useState(false); const [notificationMessage, setNotificationMessage] = useState(''); + // Get updated campaign funding data from the smart contract + const { campaign } = useGetCampaign({ + projectAddress: project?.project.projectWalletAddress as `0x${string}`, + project: project, + token: tokenURI || '', + }); + + // Get all wallet information + const { + startBalance, + totalDeposits, + totalWithdrawals, + paidDividends, + currentBalance, + walletAddress, + withdraw, + isWithdrawalSuccess, + isWithdrawalLoading, + isWithdrawalError, + } = useGetWalletInfo({ + contractAddress: campaign?.depositAddress as `0x${string}`, + withdrawAmount: withdrawal.amount, + }); + + const outstandingDividends = Number(currentBalance) - Number(startBalance); + return (
    @@ -48,41 +96,50 @@ const Wallet = () => { - - + + - {/* */} {

    - {value.toLocaleString()} {CURRENCY_SYMBOL} + {value} {CURRENCY_SYMBOL}

    ); }; -const WalletDepositCard = () => { +const WalletDepositCard = ({ depositAddress }: DepositPropType) => { const clipboard = useClipboard(); const [copied, setCopied] = useState(false); - const [address, setAddress] = useState( - '0x3eccc70b6396d8428338d77b71d35c5ff2bd6bed' - ); const handleCopyClick = useCallback(() => { setCopied(true); - clipboard.copy(address); - }, [clipboard, address]); + clipboard.copy(depositAddress); + }, [clipboard, depositAddress]); useEffect(() => { setTimeout(() => { @@ -153,11 +207,19 @@ const WalletDepositCard = () => {
    - + {depositAddress && }
    )} + ); }; diff --git a/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts b/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts index ee5ab7b..d0cc892 100644 --- a/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts +++ b/src/components/project/Children/MiniChildren/Wallet/WalletStyles.ts @@ -271,4 +271,10 @@ export const WalletDividend = styled.div` display: grid; place-items: center; } + + span { + h3 { + color: var(--color-accent-100); + } + } `; diff --git a/src/contexts/ProjectDetailContext.tsx b/src/contexts/ProjectDetailContext.tsx index 8df1f49..810da89 100644 --- a/src/contexts/ProjectDetailContext.tsx +++ b/src/contexts/ProjectDetailContext.tsx @@ -33,6 +33,13 @@ export interface ProjectDetailContextReturnTypes { generateNftImage: () => void; tokenURI: string | null; tokenURILoading: boolean; + withdrawal: WithdrawalType; + setWithdrawal: React.Dispatch>; +} + +interface WithdrawalType { + message: string; + amount: number; } interface PropTypes { @@ -63,6 +70,10 @@ const ProjectDetailProvider = ({ const [ipfsUrl, setIpfsUrl] = useState(null); const [tokenURI, setTokenURI] = useState(null); const [tokenURILoading, setTokenURILoading] = useState(false); + const [withdrawal, setWithdrawal] = useState({ + message: '', + amount: 0, + }); const { nextTokenId } = useGetTokenId(); const { uploadFileToIpfs } = useUploadToIpfs(); @@ -154,6 +165,8 @@ const ProjectDetailProvider = ({ generateNftImage, tokenURI, tokenURILoading, + withdrawal, + setWithdrawal, }} > {children} diff --git a/src/helpers/formatters.ts b/src/helpers/formatters.ts index f25593a..1e14813 100644 --- a/src/helpers/formatters.ts +++ b/src/helpers/formatters.ts @@ -1,131 +1,75 @@ -/** - * Shortens a wallet address by keeping the first 6 and the last 4 characters, - * and truncating the middle part with ellipsis. - * - * @param {string} address - The full wallet address. - * @returns {string} The shortened wallet address. - * - * @example - * const shortAddress = shortenWalletAddress("0x123456789012345678901234567890"); - * console.log(shortAddress); // Expected output: "0x1234...7890" - */ +// Shortens a wallet address for display export const shortenWalletAddress = (address: string) => `${address.slice(0, 6)}...${address.slice(address.length - 4)}`; -/** - * Calculates the duration in seconds from now until a given end date. - * - * @param {string} endDate - The end date in a string format. - * @returns {number} Duration in seconds between now and the end date. - * @throws {Error} If the end date is in the past. - * - * @example - * const secondsRemaining = durationInSeconds("2023-09-01T12:00:00"); - */ +// Calculates time duration in seconds until a given future date export const durationInSeconds = (endDate: string): number => { const end = new Date(endDate); const now = new Date(); const differenceInMillis = end.getTime() - now.getTime(); - if (differenceInMillis < 0) { throw new Error('End date must be in the future.'); } - return Math.floor(differenceInMillis / 1000); }; -/** - * Converts a given duration in seconds to its equivalent in days. - * - * @param {number} seconds - The duration in seconds. - * @returns {number} The equivalent duration in days. - * - * @example - * const days = secondsToDays(86400); // Expected output: 1 - */ +// Converts time duration from seconds to days export const secondsToDays = (seconds: number) => { return Math.round(seconds / (24 * 60 * 60)); }; +// Calculates time duration in seconds from now to a future date string export const secondsFutureDate = (futureDateString: string): number => { - // Parse the future date string into a Date object const futureDate = new Date(futureDateString); - - // Check if the parsed date is valid if (isNaN(futureDate.getTime())) { console.error(`Invalid date format: ${futureDateString}`); - return NaN; // Return NaN to indicate an error + return NaN; } - - // Get the current date and time const currentDate = new Date(); - - // Calculate the time difference in milliseconds const timeDifferenceMillis = futureDate.getTime() - currentDate.getTime(); - - // Convert milliseconds to seconds - const secondsDifference = Math.floor(timeDifferenceMillis / 1000); - - return secondsDifference; + return Math.floor(timeDifferenceMillis / 1000); }; +// Formats a number using a 4-4-3-4 pattern separated by dashes export const formatNumberWithDashes = (num: number): string => { - // Convert the number to a string and pad it with zeros to a length of 4 const paddedNum = num.toString().padStart(4, '0'); - - // Split the number into parts: "0000" "0000" "000" "0001" const parts = [ paddedNum.slice(0, 4), paddedNum.slice(4, 8), paddedNum.slice(8, 11), paddedNum.slice(11), - ].filter((part) => part !== ''); // Remove empty parts - - // Join the parts with dashes - const formattedNumber = parts.join('-'); - - return formattedNumber; + ].filter((part) => part !== ''); + return parts.join('-'); }; +// Converts a number in scientific notation to decimal string export function convertToDecimal( scientificNotationString: string, fixedDecimalPlaces: number = 20 ): string { const decimalNumber: number = parseFloat(scientificNotationString); let decimalString: string = decimalNumber.toFixed(fixedDecimalPlaces); - - // Remove trailing zeros if (decimalString.indexOf('.') > 0) { decimalString = decimalString.replace(/0+$/, ''); } - - // Remove the decimal point if there are no decimal digits left if (decimalString.endsWith('.')) { decimalString = decimalString.substring(0, decimalString.length - 1); } - return decimalString; } +// Formats a price value to 8 decimal places without trailing zeros export function formatPriceValue(num: number): string { - // Format number to 6 decimal places - let formatted = num.toFixed(6); - - // Remove trailing zeros + let formatted = num.toFixed(8); formatted = formatted.replace(/\.?0+$/, ''); - return formatted.toLocaleString(); } +// Extracts the last number following a hash (#) symbol in a string export function extractNumberBehindLastHash(input: string): number | null { - // Regular expression to find the last '#' followed by numbers const match = input.match(/#(\d+)(?!.*#\d+)/); - - // If there's a match, return the number behind the last '#' as a number. if (match && match[1]) { return parseInt(match[1], 10); } - - // Return null if no matching number is found. return null; } diff --git a/src/helpers/inputChecks.ts b/src/helpers/inputChecks.ts index 6951f93..8ed29bd 100644 --- a/src/helpers/inputChecks.ts +++ b/src/helpers/inputChecks.ts @@ -5,6 +5,7 @@ * @param str - The input string to process. * @returns A string with at most one decimal point. */ + export const handleDecimals = (str: string): string => { const parts = str.split('.'); if (parts.length > 2) { @@ -34,16 +35,6 @@ export const sanitizeInputValue = (inputValue: string): string => { * Validates if a given project form string is complete. The string is deemed complete * if it does not have any standalone '**' sequences, which are presumably placeholders. * The function ensures that '**' does not occur at the beginning, end, or adjacent to other '*'. - * - * @param {string} str - The project form string to be validated. - * @returns {boolean} Returns true if the string is complete, false otherwise. - * - * @example - * const isValid = isProjectFormComplete("This is a valid **project** form."); - * console.log(isValid); // Expected output: true - * - * const isNotValid = isProjectFormComplete("**This is an invalid project form."); - * console.log(isNotValid); // Expected output: false */ export const isProjectFormComplete = (str: string): boolean => { diff --git a/src/hooks/ContractHooks/useBuyListedNft.tsx b/src/hooks/ContractHooks/useBuyListedNft.tsx index a7b3dc7..e9bb72d 100644 --- a/src/hooks/ContractHooks/useBuyListedNft.tsx +++ b/src/hooks/ContractHooks/useBuyListedNft.tsx @@ -10,7 +10,7 @@ import { extractNumberBehindLastHash } from '@/helpers/formatters'; import { weiConverter } from '@/helpers/weiConverter'; interface ReturnType { - buyListedNFT: () => void; + buyListedNFT: () => Promise; isBuyingSuccess: boolean; isBuyingLoading: boolean; isBuyingIdle: boolean; @@ -50,7 +50,7 @@ const useBuyListedNft = ({ nftName, nftPrice }: PropType): ReturnType => { hash: buyListedNFTData?.hash, }); - const buyListedNFT = async () => { + const buyListedNFT = async (): Promise => { await writeBuyListedNFT?.(); }; diff --git a/src/hooks/ContractHooks/useGetUserInfo.tsx b/src/hooks/ContractHooks/useGetUserInfo.tsx new file mode 100644 index 0000000..809b382 --- /dev/null +++ b/src/hooks/ContractHooks/useGetUserInfo.tsx @@ -0,0 +1,47 @@ +import { useState, useEffect } from 'react'; +import { useContractRead } from 'wagmi'; +import CrowdfundContractABI from 'contracts/abi/crowdfundContractABI.json'; +import useWallet from '@/wallet/useWallet'; +import { weiToEther } from '@/helpers/weiConverter'; + +interface UserInfoType { + userId: number; + userAddress: `0x${string}`; + totalInvestedAmount: string; + totalDividendEarned: string; + claimableBalance: string; +} + +const useGetUserInfo = () => { + const [userInfo, setUserInfo] = useState(null); + const { wallet } = useWallet(); + + // Read user data from the contract + const { data: userData } = useContractRead({ + address: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS as `0x${string}`, + abi: CrowdfundContractABI, + functionName: 'users', + chainId: 11155111, + args: [wallet.walletAddress as `0x${string}`], + watch: true, + }); + + const user = userData as Array; + + useEffect(() => { + if (user) { + setUserInfo({ + userId: Number(user[1]), + userAddress: user[2], + totalInvestedAmount: weiToEther(user[3]), + totalDividendEarned: weiToEther(user[4]), + claimableBalance: weiToEther(user[7]), + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [user]); + + return { userInfo }; +}; + +export default useGetUserInfo; diff --git a/src/hooks/ContractHooks/useGetWalletInfo.tsx b/src/hooks/ContractHooks/useGetWalletInfo.tsx new file mode 100644 index 0000000..d0a26fb --- /dev/null +++ b/src/hooks/ContractHooks/useGetWalletInfo.tsx @@ -0,0 +1,134 @@ +import { + useContractRead, + useBalance, + usePrepareContractWrite, + useContractWrite, + useWaitForTransaction, +} from 'wagmi'; +import WalletContractABI from 'contracts/abi/accountContractABI.json'; +import { weiConverter, weiToEther } from '@/helpers/weiConverter'; +import useWallet from '@/wallet/useWallet'; + +interface ReturnType { + walletOwner: `0x${string}`; + startBalance: string | number; + totalWithdrawals: string | number; + totalDeposits: string | number; + paidDividends: string | number; + currentBalance?: string; + walletAddress: `0x${string}`; + withdraw: (amount: number) => Promise; + isWithdrawalSuccess: boolean; + isWithdrawalLoading: boolean; + isWithdrawalError: boolean; +} + +interface PropType { + contractAddress: `0x${string}`; + withdrawAmount: number; +} + +const useGetWalletInfo = ({ + contractAddress, + withdrawAmount, +}: PropType): ReturnType => { + const { wallet } = useWallet(); + + // Read account owner from the smart contract + const { data: accountOwner } = useContractRead({ + address: contractAddress, + abi: WalletContractABI, + functionName: 'accountOwner', + chainId: 11155111, + watch: true, + }); + + // Read start balance from the smart contract + const { data: startBalance } = useContractRead({ + address: contractAddress, + abi: WalletContractABI, + functionName: 'startBalance', + chainId: 11155111, + watch: true, + }); + + // Read start balance from the smart contract + const { data: totalWithdrawals } = useContractRead({ + address: contractAddress, + abi: WalletContractABI, + functionName: 'totalWithdrawals', + chainId: 11155111, + watch: true, + }); + + // Read total deposits from the smart contract + const { data: totalDeposits } = useContractRead({ + address: contractAddress, + abi: WalletContractABI, + functionName: 'totalDeposits', + chainId: 11155111, + watch: true, + }); + + // Read total paid dividends from the smart contract + const { data: paidDividends } = useContractRead({ + address: contractAddress, + abi: WalletContractABI, + functionName: 'paidDividends', + chainId: 11155111, + watch: true, + }); + + // Read the wallet balance + const currentBalance = useBalance({ + address: contractAddress, + chainId: 11155111, + watch: true, + formatUnits: 'ether', + }); + + // Prepare contract write configuration for withdraw function + const { config: createWithdrawConfig } = usePrepareContractWrite({ + address: contractAddress, + abi: WalletContractABI, + functionName: 'withdraw', + chainId: 11155111, + account: wallet.walletAddress as `0x${string}`, + args: [weiConverter(withdrawAmount)], + }); + + // Write withdraw data to the contract + const { write: writeWithdrawal, data: withdrawalData } = + useContractWrite(createWithdrawConfig); + + // Wait for the withdrawal function transaction to complete + const { + isSuccess: isWithdrawalSuccess, + isLoading: isWithdrawalLoading, + isError: isWithdrawalError, + } = useWaitForTransaction({ + hash: withdrawalData?.hash, + }); + + const withdraw = async (amount: number) => { + await writeWithdrawal?.(); + }; + + return { + walletOwner: accountOwner as `0x${string}`, + startBalance: startBalance ? weiToEther(startBalance as bigint) : 0, + totalWithdrawals: totalWithdrawals + ? weiToEther(totalWithdrawals as bigint) + : 0, + totalDeposits: totalDeposits ? weiToEther(totalDeposits as bigint) : 0, + paidDividends: paidDividends ? weiToEther(paidDividends as bigint) : 0, + currentBalance: currentBalance.data?.formatted, + walletAddress: contractAddress, + withdraw, + isWithdrawalSuccess, + isWithdrawalLoading, + isWithdrawalError, + }; +}; + +export default useGetWalletInfo; From 7b651c599ed66f5550ebd50ae327cec381b17b35 Mon Sep 17 00:00:00 2001 From: folathecoder Date: Mon, 11 Sep 2023 18:41:17 +0100 Subject: [PATCH 24/28] Redeployed the smart contract and generated new contract address --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index 33f0149..ce7f9bd 100644 --- a/.env +++ b/.env @@ -8,6 +8,6 @@ NEXT_PUBLIC_ALCHEMY_API_KEY=9xeTvkkpEiR-PXbo-NmV12O3BkNWixrk NEXT_PUBLIC_ETHERSCAN_API_KEY=CAM2IJY36H53V5MQGP4U6NGNYYH3ZUGBU2 NEXT_PUBLIC_SEPOLIA_PRIVATE_KEY=7bba322ef8f78463c19f6db542c5831ce83d80e02766c0b1dd8504a7e65a8b83 NEXT_PUBLIC_INFURA_API_KEY=8c2f0978d3394f98b1e3160bba2844ab -NEXT_PUBLIC_CONTRACT_ADDRESS=0xf265c5A02212c36f515206419dE3164eEf2cF0b6 +NEXT_PUBLIC_CONTRACT_ADDRESS=0xD7A00a83eF39E68931701C03B2B12762874498BA NEXT_PUBLIC_IPFS_API_KEY=2V90hTdp8C9BmLgSpq2LPWn2skX NEXT_PUBLIC_IPFS_SECRET_KEY=65c68d12c92db6731cacbf80e522c8a0 \ No newline at end of file From 35d1a6f2322ae719640088a8da4d266d24cf7aaa Mon Sep 17 00:00:00 2001 From: folathecoder Date: Tue, 12 Sep 2023 07:23:48 +0100 Subject: [PATCH 25/28] Fixed UI issues and loading spinner --- .../marketplace/NFTDetail/Children/NFTInfo.tsx | 2 +- .../marketplace/explorerLayout/explorerLayout.tsx | 4 +--- .../project/Children/MainProject/MainProject.tsx | 14 +++++++------- .../Children/FormBodyTabs/DividendTab.tsx | 4 ++-- src/contexts/ProjectDetailContext.tsx | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx b/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx index f161773..8696f19 100644 --- a/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx +++ b/src/components/marketplace/NFTDetail/Children/NFTInfo.tsx @@ -62,7 +62,7 @@ const NFTInfo = () => { const { updateNftData } = usePatchNft(); - const { nft: nftData } = nft || {}; + const { nft: nftData } = nft ?? {}; const handleInputChange = (e: React.ChangeEvent) => { const { value } = e.target; diff --git a/src/components/marketplace/explorerLayout/explorerLayout.tsx b/src/components/marketplace/explorerLayout/explorerLayout.tsx index 0e70d6d..4c3cc5b 100644 --- a/src/components/marketplace/explorerLayout/explorerLayout.tsx +++ b/src/components/marketplace/explorerLayout/explorerLayout.tsx @@ -1,5 +1,5 @@ import React, { useState, useContext } from 'react'; -import { +import MarketplaceProvider, { MarketplaceContextReturnTypes, MarketplaceContext, } from '@/contexts/MarketplaceContext'; @@ -11,7 +11,6 @@ import { ExploreFilterContainer, ExploreCardsContainer, ExploreSearchWrap, - ExploreOptions, ExploreWrap, ExploreError, } from './explorerLayoutStyles'; @@ -19,7 +18,6 @@ import { NFTCard, NFTSearch } from '@/components/marketplace'; import { ProjectCardSkeleton } from '@/components/explore'; import ExploreFilter from '@/components/marketplace/children/exploreFilter/exploreFilter'; import HoldersSection from '@/components/marketplace/children/HoldersSection/holdersSection'; -import MarketplaceProvider from '@/contexts/MarketplaceContext'; import { LottieImage } from '@/components/global'; import NotFoundImage from 'public/images/global/not-found.json'; diff --git a/src/components/project/Children/MainProject/MainProject.tsx b/src/components/project/Children/MainProject/MainProject.tsx index e5a06e9..fc77a13 100644 --- a/src/components/project/Children/MainProject/MainProject.tsx +++ b/src/components/project/Children/MainProject/MainProject.tsx @@ -61,7 +61,7 @@ const MainProject: React.FC = () => { const { campaign } = useGetCampaign({ projectAddress: project?.project.projectWalletAddress as `0x${string}`, project: project, - token: tokenURI || '', + token: tokenURI ?? '', }); // Check if the campaign has a wallet activated by the smart contract @@ -98,7 +98,7 @@ const MainProject: React.FC = () => { ); })} - + Explore NFTs @@ -107,14 +107,14 @@ const MainProject: React.FC = () => { {contents[activeContent]}
    - + { @@ -35,6 +34,7 @@ const DividendTab = () => { setState1(dividend[0]); setState2(dividend[1]); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const saveAndContinue = () => { diff --git a/src/contexts/ProjectDetailContext.tsx b/src/contexts/ProjectDetailContext.tsx index 810da89..86d234e 100644 --- a/src/contexts/ProjectDetailContext.tsx +++ b/src/contexts/ProjectDetailContext.tsx @@ -108,6 +108,7 @@ const ProjectDetailProvider = ({ } try { + setTokenURILoading(true); const dataUrl = await toPng(nftImageRef.current, { cacheBust: true }); const link = document.createElement('a'); @@ -127,7 +128,6 @@ const ProjectDetailProvider = ({ const generateTokenUri = useCallback(async () => { if (ipfsUrl) try { - setTokenURILoading(true); const metaData = JSON.stringify(generateMetaData(), null, 2); const url = await uploadFileToIpfs(metaData); setTokenURI(url); From fde0af14628a5fc8e1b0a3eda8286ededdd73401 Mon Sep 17 00:00:00 2001 From: folathecoder Date: Tue, 12 Sep 2023 07:35:48 +0100 Subject: [PATCH 26/28] Added Readme File --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/README.md b/README.md index 8b13789..606d566 100644 --- a/README.md +++ b/README.md @@ -1 +1,65 @@ +# NFT-Based Decentralised Crowdfunding Platform +## Project Overview + +This project aims to develop an advanced NFT-based decentralised crowdfunding platform for startups. Utilizing Next.js, TypeScript, and blockchain technology, this platform democratizes the fundraising process by allowing startups to raise capital directly from a global pool of investors. By leveraging the unique attributes of NFTs and blockchain, the platform aims to overcome the hurdles and costs associated with traditional fundraising mechanisms. + +## Tech Stack + +- **Frontend**: Next.js, TypeScript, Styled Components, Material UI, Ethers.js Wagmi, Axios, GraphQL +- **Package Manager**: Yarn +- **Blockchain**: [Your Blockchain technology] + +## Prerequisites + +- Node.js v14.x or higher +- Yarn v1.x or higher + +## Installation + +Clone the repository: + +\`\`\`bash +git clone https://github.com/yourusername/your-project-name.git +\`\`\` + +Navigate to the project directory: + +\`\`\`bash +cd your-project-name +\`\`\` + +Install dependencies: + +\`\`\`bash +yarn install +\`\`\` + +## Running the App + +Start the development server: + +\`\`\`bash +yarn dev +\`\`\` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Building for Production + +To create a production build, run: + +\`\`\`bash +yarn build +\`\`\` + +Then to start the production server: + +\`\`\`bash +yarn start +\`\`\` + + +## Copyright + +Images used in this project are for demmentation purposes only and do not belong to the creator of this project. From e23d9ef973e0a0b6d3d2abc4de377bf9a9282d70 Mon Sep 17 00:00:00 2001 From: Folarin Akinloye Date: Tue, 12 Sep 2023 07:43:46 +0100 Subject: [PATCH 27/28] Update README.md --- README.md | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 606d566..457e7a4 100644 --- a/README.md +++ b/README.md @@ -19,29 +19,29 @@ This project aims to develop an advanced NFT-based decentralised crowdfunding pl Clone the repository: -\`\`\`bash -git clone https://github.com/yourusername/your-project-name.git -\`\`\` +```bash +git clone https://github.com/folathecoder/crowdlaunch-frontend +``` Navigate to the project directory: -\`\`\`bash +```bash cd your-project-name -\`\`\` +``` Install dependencies: -\`\`\`bash +```bash yarn install -\`\`\` +``` ## Running the App Start the development server: -\`\`\`bash +```bash yarn dev -\`\`\` +``` Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. @@ -49,17 +49,16 @@ Open [http://localhost:3000](http://localhost:3000) with your browser to see the To create a production build, run: -\`\`\`bash +```bash yarn build -\`\`\` +``` -Then to start the production server: +Then, to start the production server: -\`\`\`bash +```bash yarn start -\`\`\` - +``` ## Copyright -Images used in this project are for demmentation purposes only and do not belong to the creator of this project. +Images used in this project are for demmostration purposes only and do not belong to the creator of this project. From 75ca81a674357415a7b92a070b60ded7a993986c Mon Sep 17 00:00:00 2001 From: folathecoder Date: Tue, 12 Sep 2023 07:47:39 +0100 Subject: [PATCH 28/28] hide env virables --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5bca27c..dc12df2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +.env # testing /coverage