From 31cfaf68c3b517852bbd88d629cbf7c8d49eed45 Mon Sep 17 00:00:00 2001
From: GM-11
Date: Mon, 9 Sep 2024 06:06:37 +0000
Subject: [PATCH 1/4] chore: forge init
---
crowdfunding-dapp/.github/workflows/test.yml | 45 +++++++++++++
crowdfunding-dapp/.gitignore | 14 +++++
crowdfunding-dapp/README.md | 66 ++++++++++++++++++++
crowdfunding-dapp/foundry.toml | 6 ++
crowdfunding-dapp/script/Counter.s.sol | 19 ++++++
crowdfunding-dapp/src/Counter.sol | 14 +++++
crowdfunding-dapp/test/Counter.t.sol | 24 +++++++
7 files changed, 188 insertions(+)
create mode 100644 crowdfunding-dapp/.github/workflows/test.yml
create mode 100644 crowdfunding-dapp/.gitignore
create mode 100644 crowdfunding-dapp/README.md
create mode 100644 crowdfunding-dapp/foundry.toml
create mode 100644 crowdfunding-dapp/script/Counter.s.sol
create mode 100644 crowdfunding-dapp/src/Counter.sol
create mode 100644 crowdfunding-dapp/test/Counter.t.sol
diff --git a/crowdfunding-dapp/.github/workflows/test.yml b/crowdfunding-dapp/.github/workflows/test.yml
new file mode 100644
index 00000000..762a2966
--- /dev/null
+++ b/crowdfunding-dapp/.github/workflows/test.yml
@@ -0,0 +1,45 @@
+name: CI
+
+on:
+ push:
+ pull_request:
+ workflow_dispatch:
+
+env:
+ FOUNDRY_PROFILE: ci
+
+jobs:
+ check:
+ strategy:
+ fail-fast: true
+
+ name: Foundry project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Install Foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Show Forge version
+ run: |
+ forge --version
+
+ - name: Run Forge fmt
+ run: |
+ forge fmt --check
+ id: fmt
+
+ - name: Run Forge build
+ run: |
+ forge build --sizes
+ id: build
+
+ - name: Run Forge tests
+ run: |
+ forge test -vvv
+ id: test
diff --git a/crowdfunding-dapp/.gitignore b/crowdfunding-dapp/.gitignore
new file mode 100644
index 00000000..85198aaa
--- /dev/null
+++ b/crowdfunding-dapp/.gitignore
@@ -0,0 +1,14 @@
+# Compiler files
+cache/
+out/
+
+# Ignores development broadcast logs
+!/broadcast
+/broadcast/*/31337/
+/broadcast/**/dry-run/
+
+# Docs
+docs/
+
+# Dotenv file
+.env
diff --git a/crowdfunding-dapp/README.md b/crowdfunding-dapp/README.md
new file mode 100644
index 00000000..9265b455
--- /dev/null
+++ b/crowdfunding-dapp/README.md
@@ -0,0 +1,66 @@
+## Foundry
+
+**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.**
+
+Foundry consists of:
+
+- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools).
+- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data.
+- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network.
+- **Chisel**: Fast, utilitarian, and verbose solidity REPL.
+
+## Documentation
+
+https://book.getfoundry.sh/
+
+## Usage
+
+### Build
+
+```shell
+$ forge build
+```
+
+### Test
+
+```shell
+$ forge test
+```
+
+### Format
+
+```shell
+$ forge fmt
+```
+
+### Gas Snapshots
+
+```shell
+$ forge snapshot
+```
+
+### Anvil
+
+```shell
+$ anvil
+```
+
+### Deploy
+
+```shell
+$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key
+```
+
+### Cast
+
+```shell
+$ cast
+```
+
+### Help
+
+```shell
+$ forge --help
+$ anvil --help
+$ cast --help
+```
diff --git a/crowdfunding-dapp/foundry.toml b/crowdfunding-dapp/foundry.toml
new file mode 100644
index 00000000..25b918f9
--- /dev/null
+++ b/crowdfunding-dapp/foundry.toml
@@ -0,0 +1,6 @@
+[profile.default]
+src = "src"
+out = "out"
+libs = ["lib"]
+
+# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
diff --git a/crowdfunding-dapp/script/Counter.s.sol b/crowdfunding-dapp/script/Counter.s.sol
new file mode 100644
index 00000000..cdc1fe9a
--- /dev/null
+++ b/crowdfunding-dapp/script/Counter.s.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+import {Script, console} from "forge-std/Script.sol";
+import {Counter} from "../src/Counter.sol";
+
+contract CounterScript is Script {
+ Counter public counter;
+
+ function setUp() public {}
+
+ function run() public {
+ vm.startBroadcast();
+
+ counter = new Counter();
+
+ vm.stopBroadcast();
+ }
+}
diff --git a/crowdfunding-dapp/src/Counter.sol b/crowdfunding-dapp/src/Counter.sol
new file mode 100644
index 00000000..aded7997
--- /dev/null
+++ b/crowdfunding-dapp/src/Counter.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+contract Counter {
+ uint256 public number;
+
+ function setNumber(uint256 newNumber) public {
+ number = newNumber;
+ }
+
+ function increment() public {
+ number++;
+ }
+}
diff --git a/crowdfunding-dapp/test/Counter.t.sol b/crowdfunding-dapp/test/Counter.t.sol
new file mode 100644
index 00000000..54b724f7
--- /dev/null
+++ b/crowdfunding-dapp/test/Counter.t.sol
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+import {Test, console} from "forge-std/Test.sol";
+import {Counter} from "../src/Counter.sol";
+
+contract CounterTest is Test {
+ Counter public counter;
+
+ function setUp() public {
+ counter = new Counter();
+ counter.setNumber(0);
+ }
+
+ function test_Increment() public {
+ counter.increment();
+ assertEq(counter.number(), 1);
+ }
+
+ function testFuzz_SetNumber(uint256 x) public {
+ counter.setNumber(x);
+ assertEq(counter.number(), x);
+ }
+}
From 4e9f26521e93bf6ac8eb1485095cab2e724dae7d Mon Sep 17 00:00:00 2001
From: GM-11
Date: Mon, 9 Sep 2024 06:06:39 +0000
Subject: [PATCH 2/4] forge install: forge-std
v1.9.2
---
.gitmodules | 3 +++
crowdfunding-dapp/lib/forge-std | 1 +
2 files changed, 4 insertions(+)
create mode 100644 .gitmodules
create mode 160000 crowdfunding-dapp/lib/forge-std
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..936ebb4f
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "crowdfunding-dapp/lib/forge-std"]
+ path = crowdfunding-dapp/lib/forge-std
+ url = https://github.com/foundry-rs/forge-std
diff --git a/crowdfunding-dapp/lib/forge-std b/crowdfunding-dapp/lib/forge-std
new file mode 160000
index 00000000..1714bee7
--- /dev/null
+++ b/crowdfunding-dapp/lib/forge-std
@@ -0,0 +1 @@
+Subproject commit 1714bee72e286e73f76e320d110e0eaf5c4e649d
From c575569421937ae3496c2f2a2ff1c75763685004 Mon Sep 17 00:00:00 2001
From: GM-11
Date: Mon, 16 Sep 2024 06:33:21 +0000
Subject: [PATCH 3/4] added tutorial 8
---
07-NFT Minitng dApp on Core/README.md | 2 +-
.../.github/workflows/test.yml | 0
.../.gitignore | 0
08-Crowdfunding dApp on Core/README.md | 406 +++++
08-Crowdfunding dApp on Core/deploy.sh | 1 +
.../foundry.toml | 0
.../frontend/.gitignore | 24 +
.../frontend/README.md | 50 +
.../frontend/index.html | 13 +
.../frontend/package.json | 31 +
.../frontend/public/vite.svg | 1 +
.../frontend/src/App.tsx | 117 ++
.../frontend/src/Campaign.tsx | 77 +
.../frontend/src/abis/Campaign.json | 207 +++
.../frontend/src/abis/CampaignFactory.json | 176 ++
.../frontend/src/assets/react.svg | 1 +
.../frontend/src/index.css | 0
.../frontend/src/index.d.ts | 7 +
.../frontend/src/main.tsx | 20 +
.../frontend/src/vite-env.d.ts | 1 +
.../frontend/tsconfig.app.json | 24 +
.../frontend/tsconfig.json | 7 +
.../frontend/tsconfig.node.json | 22 +
.../frontend/vite.config.ts | 7 +
.../frontend/yarn.lock | 1613 +++++++++++++++++
.../images/campaign-lists.PNG | Bin 0 -> 21546 bytes
.../images/connect-wallet.PNG | Bin 0 -> 22929 bytes
.../images/create-frontend.PNG | Bin 0 -> 33848 bytes
.../images/create-new-campaign.PNG | Bin 0 -> 47474 bytes
.../images/deploy.PNG | Bin 0 -> 18997 bytes
.../images/donating-to-campaign.PNG | Bin 0 -> 40772 bytes
.../images/folder-sructure.PNG | Bin 0 -> 3949 bytes
.../images/forge-build.PNG | Bin 0 -> 14948 bytes
.../images/forge-init.PNG | Bin 0 -> 35841 bytes
.../images/forge-test.PNG | Bin 0 -> 27392 bytes
.../images/foundryup.PNG | Bin 0 -> 48927 bytes
.../images/home-after-connect-wallet.PNG | Bin 0 -> 24378 bytes
.../images/withdraw-received.PNG | Bin 0 -> 15990 bytes
.../lib/forge-std | 0
08-Crowdfunding dApp on Core/src/Campaign.sol | 25 +
.../src/CampaignFactory.sol | 20 +
.../src/Counter.sol | 0
.../test/CampaignFactory.t.sol | 35 +
crowdfunding-dapp/README.md | 66 -
crowdfunding-dapp/script/Counter.s.sol | 19 -
crowdfunding-dapp/test/Counter.t.sol | 24 -
46 files changed, 2886 insertions(+), 110 deletions(-)
rename {crowdfunding-dapp => 08-Crowdfunding dApp on Core}/.github/workflows/test.yml (100%)
rename {crowdfunding-dapp => 08-Crowdfunding dApp on Core}/.gitignore (100%)
create mode 100644 08-Crowdfunding dApp on Core/README.md
create mode 100755 08-Crowdfunding dApp on Core/deploy.sh
rename {crowdfunding-dapp => 08-Crowdfunding dApp on Core}/foundry.toml (100%)
create mode 100644 08-Crowdfunding dApp on Core/frontend/.gitignore
create mode 100644 08-Crowdfunding dApp on Core/frontend/README.md
create mode 100644 08-Crowdfunding dApp on Core/frontend/index.html
create mode 100644 08-Crowdfunding dApp on Core/frontend/package.json
create mode 100644 08-Crowdfunding dApp on Core/frontend/public/vite.svg
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/App.tsx
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/Campaign.tsx
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/abis/Campaign.json
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/abis/CampaignFactory.json
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/assets/react.svg
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/index.css
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/index.d.ts
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/main.tsx
create mode 100644 08-Crowdfunding dApp on Core/frontend/src/vite-env.d.ts
create mode 100644 08-Crowdfunding dApp on Core/frontend/tsconfig.app.json
create mode 100644 08-Crowdfunding dApp on Core/frontend/tsconfig.json
create mode 100644 08-Crowdfunding dApp on Core/frontend/tsconfig.node.json
create mode 100644 08-Crowdfunding dApp on Core/frontend/vite.config.ts
create mode 100644 08-Crowdfunding dApp on Core/frontend/yarn.lock
create mode 100644 08-Crowdfunding dApp on Core/images/campaign-lists.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/connect-wallet.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/create-frontend.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/create-new-campaign.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/deploy.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/donating-to-campaign.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/folder-sructure.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/forge-build.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/forge-init.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/forge-test.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/foundryup.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/home-after-connect-wallet.PNG
create mode 100644 08-Crowdfunding dApp on Core/images/withdraw-received.PNG
rename {crowdfunding-dapp => 08-Crowdfunding dApp on Core}/lib/forge-std (100%)
create mode 100644 08-Crowdfunding dApp on Core/src/Campaign.sol
create mode 100644 08-Crowdfunding dApp on Core/src/CampaignFactory.sol
rename {crowdfunding-dapp => 08-Crowdfunding dApp on Core}/src/Counter.sol (100%)
create mode 100644 08-Crowdfunding dApp on Core/test/CampaignFactory.t.sol
delete mode 100644 crowdfunding-dapp/README.md
delete mode 100644 crowdfunding-dapp/script/Counter.s.sol
delete mode 100644 crowdfunding-dapp/test/Counter.t.sol
diff --git a/07-NFT Minitng dApp on Core/README.md b/07-NFT Minitng dApp on Core/README.md
index 7dd42c62..fe727692 100644
--- a/07-NFT Minitng dApp on Core/README.md
+++ b/07-NFT Minitng dApp on Core/README.md
@@ -384,7 +384,7 @@ But wait, why can't we see it?๐ค

-Well since this NFT is on the testnet, metamask automatically does not detect them. We need to import our NFT into our wallet.
+Well since this NFT is on the testnet, metamask automatically does not detect them. We need to import our NFT into our wallet.a
Cick on `Import NFT` at the bottom. Add your contract address in the **Address** input field and 0 in the **Token Id** input field and click on **Import**.
diff --git a/crowdfunding-dapp/.github/workflows/test.yml b/08-Crowdfunding dApp on Core/.github/workflows/test.yml
similarity index 100%
rename from crowdfunding-dapp/.github/workflows/test.yml
rename to 08-Crowdfunding dApp on Core/.github/workflows/test.yml
diff --git a/crowdfunding-dapp/.gitignore b/08-Crowdfunding dApp on Core/.gitignore
similarity index 100%
rename from crowdfunding-dapp/.gitignore
rename to 08-Crowdfunding dApp on Core/.gitignore
diff --git a/08-Crowdfunding dApp on Core/README.md b/08-Crowdfunding dApp on Core/README.md
new file mode 100644
index 00000000..b011c8ea
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/README.md
@@ -0,0 +1,406 @@
+# Building Crowdfunding DApp on Core
+
+Welcome to this tutorial where we will build a simple Crowdfunding DApp on Core Blockchain from scratch. We will make a basic DApp where you will be able to create campaigns and contribute to them. By the end of the tutorial, we will have a functional dapp that interacts with smart contracts on the Core Blockchain Testnet. Letโs start๐
+
+## Learning Takeaways
+
+- Smart Contract Development in Solidity programming language
+- Building frontend using React.js
+- Using Ethers.js library for interaction of frontend with smart contracts
+- Integrating Metamask wallet for secure user transactions
+- Read and write data to/from smart contracts
+
+## Software Prerequisites
+
+- [Git](https://git-scm.com/)
+- [Node.js](https://nodejs.org/en) v20.13.1
+- [Yarn](https://yarnpkg.com/) v1.22.21
+- [Foundry](https://book.getfoundry.sh/getting-started/installation)
+- [Metamask Wallet](https://metamask.io/download/)
+- **Core Testnet Configuration**: Configure MetaMask to connect to the Core Testnet. Refer here for more details.
+ - **Network Name**: Core Testnet
+ - **New RPC URL**: [https://rpc.test.btcs.network](https://rpc.test.btcs.network)
+ - **Chain ID**: 1115
+ - **Currency Symbol**: CORE
+- **Core Faucet**: To get test CORE tokens for transactions, visit the Core Faucet, refer [here](https://docs.coredao.org/docs/Dev-Guide/core-faucet) for more details.
+
+## Setting up Dev Environment
+
+### 1. Initialize project
+
+We will create a new project with the name `crowdfunding-dapp`.
+
+```bash
+forge init crowdfunding-dapp
+```
+
+
+
+### 2. Writing Smart Contracts
+
+Now navigate to the project directory and create a new Solidity file called `Campaign.sol` in the `src` directory.
+
+```js
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.26;
+
+contract Campaign {
+ address public owner;
+ string public title;
+ string public description;
+
+ constructor(string memory _title, string memory _description) {
+ owner = msg.sender;
+ title = _title;
+ description = _description;
+ }
+
+ function contribute() public payable {
+ require(msg.value > 0, "Contribution must be greater than 0");
+ (bool success, ) = payable(address(this)).call{value: msg.value}("");
+ require(success, "Failed to send funds");
+ }
+
+ function withdraw() public payable {
+ require(msg.sender == owner, "Only owner can withdraw funds");
+ payable(msg.sender).transfer(address(this).balance);
+ }
+}
+
+```
+
+In this contract, we:
+
+- Define a contract named `Campaign`
+- Declare state variables for the campaign's owner, title, and description
+- Implement a constructor to initialize the campaign with a title and description
+- Implement a `contribute` function that allows users to contribute to the campaign by sending ETH
+- Implement a `withdraw` function that allows the campaign owner to withdraw the funds raised
+
+Now create another file called `CampaignFactory.sol` in the `src` directory.
+
+```js
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.26;
+
+import "./Campaign.sol";
+
+contract CampaignFactory {
+ address[] public campaigns;
+
+ function createCampaign(string memory title, string memory description) public {
+ Campaign newCampaign = new Campaign(title, description);
+ campaigns.push(address(newCampaign));
+ }
+
+ function getCampaigns() public view returns (address[] memory) {
+ return campaigns;
+ }
+}
+```
+
+In this contract, we:
+
+- Define a contract named `CampaignFactory`
+- Implement a `createCampaign` function that creates a new `Campaign` contract and adds its address to the `campaigns` array
+- Implement a `getCampaigns` function that returns all the addresses of the created campaigns.
+
+Now let's build our smart contracts to make sure there are no errors.
+
+
+
+We can also test our smart contracts using Foundry. Create a new file called `CampaignFactory.t.sol` in the `test` directory.
+
+```js
+/// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.26;
+
+import {Test, console} from "../forge-std/Test.sol";
+
+contract CampaignFactoryTest is Test {
+ CampaignFactory public campaignFactory;
+
+ function setUp() public {
+ campaignFactory = new CampaignFactory();
+ }
+
+ function test_CreateCampaign() public {
+ campaignFactory.createCampaign(
+ "Test Campaign",
+ "This is a test campaign"
+ );
+ }
+
+ function test_GetCampaigns() public {
+ campaignFactory.createCampaign(
+ "Test Campaign",
+ "This is a test campaign"
+ );
+ campaignFactory.createCampaign(
+ "Test Campaign",
+ "This is a test campaign"
+ );
+
+ address[] memory campaigns = campaignFactory.getCampaigns();
+ assertEq(campaigns.length, 2);
+ assertEq(campaigns[0], address(campaigns[0]));
+ assertEq(campaigns[1], address(campaigns[1]));
+ }
+}
+```
+
+
+
+Perfect, our smart contracts are working perfectly. Now let's deploy them to the Core Testnet.
+
+```bash
+forge create --rpc-url https://rpc.test.btcs.network --legacy ./src/CampaignFactory.sol:CampaignFactory --private-key
+```
+
+
+
+### 3. Writing Frontend
+
+Perfect, our smart contract are working perfectly. Now let's build our frontend.
+Run the `yarn create vite frontend` command and select `React` and `Typescript` for the project.
+
+
+
+And then run these commands to install the dependencies.
+
+```bash
+cd frontend
+yarn add ethers react-router-dom
+```
+
+Now let's write code to connect our metamask wallet in the `App.tsx` file.
+
+```js
+import { ethers } from 'ethers'
+import { useState, useEffect } from 'react'
+
+const contractAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3"; // replace your contract address
+
+function App() {
+ const [walletAddress, setWalletAddress] = useState("");
+
+
+ async function connectWallet() {
+ const { ethereum } = window;
+ if (!ethereum) {
+ alert("Please install MetaMask!");
+ return;
+ }
+
+ try {
+ const [account] = await ethereum.request({
+ method: "eth_requestAccounts",
+ });
+ setWalletAddress(account);
+ } catch (error) {
+ console.log("Error fetching network:", error);
+ }
+ }
+ useEffect(() => {
+ connectWallet();
+ }, []);
+
+
+ return (
+
+ {
+ walletAddress ? (
+
+ Connected Address: {walletAddress}
+
+
+ ) : (
+
Please connect your wallet
+ )
+ }
+
+ )
+}
+
+export default App
+
+```
+
+Now run `yarn dev` command in the frontend directory, open the app in your browser on `http://localhost:5173`. You should see your metamaks wallet prompt you to connect to the website.
+
+
+
+Now add the input fields to create a new campaign.
+
+```js
+
+async function createCampaign() {
+ try {
+ const provider = new ethers.BrowserProvider(window.ethereum);
+ const signer = await provider.getSigner();
+ const contract = new ethers.Contract(contractAddress, CampaignFactory.abi, signer);
+ const tx = await contract.createCampaign(title, description);
+ await tx.wait();
+ getAllCampaigns();
+
+ } catch (error) {
+ console.log("Error creating campaign:", error);
+ }
+ }
+
+ // rest of code
+
+ Create new campaign
+ setTitle(e.target.value)} />
+ setDescription(e.target.value)} />
+ Create
+ Connected Address: {walletAddress}
+
+```
+
+Now lets create a new campaign and see if it is added to the list of campaigns.
+
+
+
+Now you can see the list of campaigns created.
+
+
+
+Now create new react component `Campaign.tsx`, and edit the `main.tsx` file to add this page to the routes.
+
+`main.tsx`
+
+```js
+const router = createBrowserRouter([
+ {
+ path: '/',
+ element: ,
+ },
+ {
+ path: '/campaign/:campaignAddress',
+ element: ,
+ },
+])
+
+createRoot(document.getElementById('root')!).render(
+
+)
+
+```
+
+`Campaign.tsx`
+
+```js
+import { useParams } from 'react-router-dom'
+import { useState, useEffect } from 'react'
+import Campaign from "./abis/Campaign.json"
+import ethers from 'ethers'
+
+function CampaignPage() {
+ const { campaignAddress } = useParams()
+
+ const [title, setTitle] = useState('')
+ const [description, setDescription] = useState('')
+ const [funds, setFunds] = useState()
+ const [owner, setOwner] = useState('')
+
+ const [fundingAmount, setFundingAmount] = useState(0)
+
+ useEffect(() => {
+ async function fetchCampaign() {
+ if (!campaignAddress) return
+ const provider = new ethers.BrowserProvider(window.ethereum)
+ const campaignContract = new ethers.Contract(campaignAddress, Campaign.abi, provider)
+ setTitle(await campaignContract.title())
+ setDescription(await campaignContract.description())
+ setOwner(await campaignContract.owner())
+ setFunds(Number(await provider.getBalance(campaignAddress)) / (10 ** 18))
+ }
+ fetchCampaign()
+ }, [])
+
+
+ async function fundCampaign() {
+ if (!campaignAddress) return
+ try {
+ const provider = new ethers.BrowserProvider(window.ethereum)
+ const signer = await provider.getSigner()
+ const campaignContract = new ethers.Contract(campaignAddress, Campaign.abi, signer)
+ const tx = await campaignContract.fund({ value: ethers.parseEther(fundingAmount.toString()) })
+ await tx.wait()
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+ return (
+
+
{title}
+
{description}
+
Funds: {funds}
+
Owner: {owner}
+
Campaign Address: {campaignAddress}
+
+
setFundingAmount(Number(e.target.value))} />
+
Fund Campaign
+
+ )
+}
+
+export default CampaignPage
+
+```
+
+Edit the `App.tsx` file to add a link to the campaign page.
+
+```js
+
+
+```
+
+Now lets navigate to the campaign page and try funding the campaign with another wallet.
+
+
+
+Nice, our campaign is successfully funded. Now lets add a withdraw function to the campaign page.
+For this we need to check if the campaign owner is the one withdrawing the funds.
+
+```js
+ async function withdrawFunds() {
+ if (!campaignAddress) return
+ try {
+ const provider = new ethers.BrowserProvider(window.ethereum)
+ const signer = await provider.getSigner()
+
+ if ((await signer.getAddress()).toLowerCase() !== owner.toLowerCase()) {
+ alert("You are not the owner of this campaign")
+ return
+ }
+ const campaignContract = new ethers.Contract(campaignAddress, Campaign.abi, signer)
+ const tx = await campaignContract.withdraw()
+ await tx.wait()
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+```
+
+Now lets add a button to the campaign page to withdraw the funds.
+
+```js
+Withdraw Funds
+```
+
+Now when we click the withdraw button, it will ask us to sign the transaction, after successful transaction the funds will be transferred back to the owner.
+We can confirm this by checking the transaction in the core explorer.
+
+
+
+## Conclusion
+
+Wooho๐๐ We have successfully built a simple crowdfunding DApp on Core Blockchain.
+
+Now of course, the UI is very basic and we can add many more features to it. We can also use a more sophisticated frontend framework like Next.js for a better user experience.
+
+Till then, Happy coding and keep building ๐๐ค
diff --git a/08-Crowdfunding dApp on Core/deploy.sh b/08-Crowdfunding dApp on Core/deploy.sh
new file mode 100755
index 00000000..07015fd1
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/deploy.sh
@@ -0,0 +1 @@
+forge create --rpc-url https://rpc.test.btcs.network --legacy ./src/CampaignFactory.sol:CampaignFactory --private-key 7f3ed3d4b4d6dca6127fca65f465c94cd541938faf126d6c481fe9b8800e502b
\ No newline at end of file
diff --git a/crowdfunding-dapp/foundry.toml b/08-Crowdfunding dApp on Core/foundry.toml
similarity index 100%
rename from crowdfunding-dapp/foundry.toml
rename to 08-Crowdfunding dApp on Core/foundry.toml
diff --git a/08-Crowdfunding dApp on Core/frontend/.gitignore b/08-Crowdfunding dApp on Core/frontend/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/08-Crowdfunding dApp on Core/frontend/README.md b/08-Crowdfunding dApp on Core/frontend/README.md
new file mode 100644
index 00000000..74872fd4
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/README.md
@@ -0,0 +1,50 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
+
+- Configure the top-level `parserOptions` property like this:
+
+```js
+export default tseslint.config({
+ languageOptions: {
+ // other options...
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+})
+```
+
+- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked`
+- Optionally add `...tseslint.configs.stylisticTypeChecked`
+- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config:
+
+```js
+// eslint.config.js
+import react from 'eslint-plugin-react'
+
+export default tseslint.config({
+ // Set the react version
+ settings: { react: { version: '18.3' } },
+ plugins: {
+ // Add the react plugin
+ react,
+ },
+ rules: {
+ // other rules...
+ // Enable its recommended rules
+ ...react.configs.recommended.rules,
+ ...react.configs['jsx-runtime'].rules,
+ },
+})
+```
diff --git a/08-Crowdfunding dApp on Core/frontend/index.html b/08-Crowdfunding dApp on Core/frontend/index.html
new file mode 100644
index 00000000..e4b78eae
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite + React + TS
+
+
+
+
+
+
diff --git a/08-Crowdfunding dApp on Core/frontend/package.json b/08-Crowdfunding dApp on Core/frontend/package.json
new file mode 100644
index 00000000..7e5fc9f3
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "ethers": "^6.13.2",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-router-dom": "^6.26.2"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.9.0",
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0",
+ "@vitejs/plugin-react": "^4.3.1",
+ "eslint": "^9.9.0",
+ "eslint-plugin-react-hooks": "^5.1.0-rc.0",
+ "eslint-plugin-react-refresh": "^0.4.9",
+ "globals": "^15.9.0",
+ "typescript": "^5.5.3",
+ "typescript-eslint": "^8.0.1",
+ "vite": "^5.4.1"
+ }
+}
diff --git a/08-Crowdfunding dApp on Core/frontend/public/vite.svg b/08-Crowdfunding dApp on Core/frontend/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/08-Crowdfunding dApp on Core/frontend/src/App.tsx b/08-Crowdfunding dApp on Core/frontend/src/App.tsx
new file mode 100644
index 00000000..7cf7ed24
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/App.tsx
@@ -0,0 +1,117 @@
+import { ethers } from 'ethers'
+import { useState, useEffect } from 'react'
+import CampaignFactory from "./abis/CampaignFactory.json"
+import Campaign from "./abis/Campaign.json"
+import { Link } from 'react-router-dom'
+
+type Campaign = {
+ title: string
+ description: string
+ owner: string
+ fund: number
+ campaignAddress: string
+}
+
+const contractAddress = "0x6732D0158D83da10fC3cd49708edA26f339a944a"; // replace with your contract address
+
+function App() {
+ const [allCampaigns, setAllCampaigns] = useState([]);
+ const [walletAddress, setWalletAddress] = useState("");
+ const [title, setTitle] = useState("");
+ const [description, setDescription] = useState("");
+
+ async function getAllCampaigns() {
+ const provider = new ethers.BrowserProvider(window.ethereum);
+
+ const contract = new ethers.Contract(contractAddress, CampaignFactory.abi, provider);
+
+ console.log(contract)
+ const _campaigns = await contract.getCampaigns();
+ console.log(_campaigns)
+ let campaigns: Campaign[] = [];
+
+ for (let i = 0; i < _campaigns.length; i++) {
+ const campaign = _campaigns[i];
+ console.log(campaign)
+ const campaignContract = new ethers.Contract(campaign, Campaign.abi, provider);
+ console.log(campaignContract)
+ campaigns.push({
+ title: await campaignContract.title(),
+ description: await campaignContract.description(),
+ owner: await campaignContract.owner(),
+ fund: Number(await provider.getBalance(campaign)) / (10 ** 18),
+ campaignAddress: campaign
+ });
+ }
+ setAllCampaigns(campaigns);
+ }
+
+ async function connectWallet() {
+ const { ethereum } = window;
+ if (!ethereum) {
+ alert("Please install MetaMask!");
+ return;
+ }
+
+ try {
+ const [account] = await ethereum.request({
+ method: "eth_requestAccounts",
+ });
+ setWalletAddress(account);
+ } catch (error) {
+ console.log("Error fetching network:", error);
+ }
+ }
+ useEffect(() => {
+ connectWallet();
+ getAllCampaigns();
+ }, []);
+
+ async function createCampaign() {
+ try {
+ const provider = new ethers.BrowserProvider(window.ethereum);
+ const signer = await provider.getSigner();
+ const contract = new ethers.Contract(contractAddress, CampaignFactory.abi, signer);
+ const tx = await contract.createCampaign(title, description);
+ await tx.wait();
+ getAllCampaigns();
+
+ } catch (error) {
+ console.log("Error creating campaign:", error);
+ }
+ }
+
+
+ return (
+
+ {
+ walletAddress ? (
+ <>
+ Create new campaign
+ setTitle(e.target.value)} />
+ setDescription(e.target.value)} />
+ Create
+
+ Connected Address: {walletAddress}
+ {
+ allCampaigns.map((campaign, index) => (
+
+
{campaign.title}
+ {campaign.description}
+ Owner: {campaign.owner}
+ Fund: {campaign.fund}
+
+ ))
+ }
+
>
+ ) : (
+ Please connect your wallet
+ )
+ }
+
+
+
+ )
+}
+
+export default App
diff --git a/08-Crowdfunding dApp on Core/frontend/src/Campaign.tsx b/08-Crowdfunding dApp on Core/frontend/src/Campaign.tsx
new file mode 100644
index 00000000..c381272c
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/Campaign.tsx
@@ -0,0 +1,77 @@
+import { useParams } from 'react-router-dom'
+import { useState, useEffect } from 'react'
+import Campaign from "./abis/Campaign.json"
+import { ethers } from 'ethers'
+
+export default function CampaignPage() {
+ const { campaignAddress } = useParams()
+
+ const [title, setTitle] = useState('')
+ const [description, setDescription] = useState('')
+ const [funds, setFunds] = useState()
+ const [owner, setOwner] = useState('')
+
+ const [fundingAmount, setFundingAmount] = useState(0)
+
+ useEffect(() => {
+ async function fetchCampaign() {
+ if (!campaignAddress) return
+ const provider = new ethers.BrowserProvider(window.ethereum)
+ const campaignContract = new ethers.Contract(campaignAddress, Campaign.abi, provider)
+ setTitle(await campaignContract.title())
+ setDescription(await campaignContract.description())
+ setOwner(await campaignContract.owner())
+ setFunds(Number(await provider.getBalance(campaignAddress)) / (10 ** 18))
+ }
+ fetchCampaign()
+ }, [])
+
+ async function withdrawFunds() {
+ if (!campaignAddress) return
+ try {
+ const provider = new ethers.BrowserProvider(window.ethereum)
+ const signer = await provider.getSigner()
+
+ if ((await signer.getAddress()).toLowerCase() !== owner.toLowerCase()) {
+ alert("You are not the owner of this campaign")
+ return
+ }
+ const campaignContract = new ethers.Contract(campaignAddress, Campaign.abi, signer)
+ const tx = await campaignContract.withdraw()
+ await tx.wait()
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+
+
+ async function fundCampaign() {
+ if (!campaignAddress) return
+ try {
+ const provider = new ethers.BrowserProvider(window.ethereum)
+ const signer = await provider.getSigner()
+ const campaignContract = new ethers.Contract(campaignAddress, Campaign.abi, signer)
+ const tx = await campaignContract.fund({ value: ethers.parseEther(fundingAmount.toString()) })
+ await tx.wait()
+ } catch (error) {
+ console.error(error)
+ }
+ }
+
+ return (
+
+
{title}
+
{description}
+
Funds: {funds}
+
Owner: {owner}
+
Campaign Address: {campaignAddress}
+
+
setFundingAmount(Number(e.target.value))} />
+
Fund Campaign
+
Withdraw Funds
+
+ )
+}
+
+
diff --git a/08-Crowdfunding dApp on Core/frontend/src/abis/Campaign.json b/08-Crowdfunding dApp on Core/frontend/src/abis/Campaign.json
new file mode 100644
index 00000000..2ff56e16
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/abis/Campaign.json
@@ -0,0 +1,207 @@
+{
+ "abi": [
+ {
+ "type": "constructor",
+ "inputs": [
+ {
+ "name": "_title",
+ "type": "string",
+ "internalType": "string"
+ },
+ {
+ "name": "_description",
+ "type": "string",
+ "internalType": "string"
+ }
+ ],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "contribute",
+ "inputs": [],
+ "outputs": [],
+ "stateMutability": "payable"
+ },
+ {
+ "type": "function",
+ "name": "description",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "string",
+ "internalType": "string"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "owner",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "address",
+ "internalType": "address"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "title",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "string",
+ "internalType": "string"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "withdraw",
+ "inputs": [],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ }
+ ],
+ "bytecode": {
+ "object": "0x608060405234801561001057600080fd5b5060405161068738038061068783398101604081905261002f9161011b565b600080546001600160a01b03191633179055600161004d838261020d565b50600261005a828261020d565b5050506102cb565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261008957600080fd5b81516001600160401b038111156100a2576100a2610062565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d0576100d0610062565b6040528181528382016020018510156100e857600080fd5b60005b82811015610107576020818601810151838301820152016100eb565b506000918101602001919091529392505050565b6000806040838503121561012e57600080fd5b82516001600160401b0381111561014457600080fd5b61015085828601610078565b602085015190935090506001600160401b0381111561016e57600080fd5b61017a85828601610078565b9150509250929050565b600181811c9082168061019857607f821691505b6020821081036101b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561020857806000526020600020601f840160051c810160208510156101e55750805b601f840160051c820191505b8181101561020557600081556001016101f1565b50505b505050565b81516001600160401b0381111561022657610226610062565b61023a816102348454610184565b846101be565b6020601f82116001811461026e57600083156102565750848201515b600019600385901b1c1916600184901b178455610205565b600084815260208120601f198516915b8281101561029e578785015182556020948501946001909201910161027e565b50848210156102bc5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6103ad806102da6000396000f3fe60806040526004361061004a5760003560e01c80633ccfd60b1461004f5780634a79d50c146100665780637284e416146100915780638da5cb5b146100a6578063d7bb99ba146100de575b600080fd5b34801561005b57600080fd5b506100646100e6565b005b34801561007257600080fd5b5061007b6101e3565b60405161008891906102ef565b60405180910390f35b34801561009d57600080fd5b5061007b610271565b3480156100b257600080fd5b506000546100c6906001600160a01b031681565b6040516001600160a01b039091168152602001610088565b61006461027e565b6000546001600160a01b031633146101455760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e65722063616e2077697468647261772066756e647300000060448201526064015b60405180910390fd5b6000336001600160a01b0316476040515b60006040518083038185875af1925050503d8060008114610193576040519150601f19603f3d011682016040523d82523d6000602084013e610198565b606091505b50509050806101e05760405162461bcd60e51b81526020600482015260146024820152734661696c656420746f2073656e642066756e647360601b604482015260640161013c565b50565b600180546101f09061033d565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061033d565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b600280546101f09061033d565b600034116102da5760405162461bcd60e51b815260206004820152602360248201527f436f6e747269627574696f6e206d75737420626520677265617465722074686160448201526206e20360ec1b606482015260840161013c565b6000306001600160a01b031634604051610156565b602081526000825180602084015260005b8181101561031d5760208186018101516040868401015201610300565b506000604082850101526040601f19601f83011684010191505092915050565b600181811c9082168061035157607f821691505b60208210810361037157634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212201fb4a52834fac6a115bdc75420344fc9a4307154bae2b25d860a332e9db609cb64736f6c634300081a0033",
+ "sourceMap": "58:785:23:-:0;;;165:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;237:5;:18;;-1:-1:-1;;;;;;237:18:23;245:10;237:18;;;;265:14;273:6;237:18;265:14;:::i;:::-;-1:-1:-1;289:11:23;:26;303:12;289:11;:26;:::i;:::-;;165:157;;58:785;;14:127:28;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:834;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;298:13;;-1:-1:-1;;;;;323:30:28;;320:56;;;356:18;;:::i;:::-;405:2;399:9;497:2;459:17;;-1:-1:-1;;455:31:28;;;488:2;451:40;447:54;435:67;;-1:-1:-1;;;;;517:34:28;;553:22;;;514:62;511:88;;;579:18;;:::i;:::-;615:2;608:22;639;;;680:19;;;701:4;676:30;673:39;-1:-1:-1;670:59:28;;;725:1;722;715:12;670:59;747:1;757:143;771:6;768:1;765:13;757:143;;;883:4;867:14;;;863:25;;857:32;834:14;;;830:25;;823:67;786:12;757:143;;;-1:-1:-1;948:1:28;920:19;;;941:4;916:30;909:41;;;;924:6;146:834;-1:-1:-1;;;146:834:28:o;985:557::-;1084:6;1092;1145:2;1133:9;1124:7;1120:23;1116:32;1113:52;;;1161:1;1158;1151:12;1113:52;1188:16;;-1:-1:-1;;;;;1216:30:28;;1213:50;;;1259:1;1256;1249:12;1213:50;1282:61;1335:7;1326:6;1315:9;1311:22;1282:61;:::i;:::-;1389:2;1374:18;;1368:25;1272:71;;-1:-1:-1;1368:25:28;-1:-1:-1;;;;;;1405:32:28;;1402:52;;;1450:1;1447;1440:12;1402:52;1473:63;1528:7;1517:8;1506:9;1502:24;1473:63;:::i;:::-;1463:73;;;985:557;;;;;:::o;1547:380::-;1626:1;1622:12;;;;1669;;;1690:61;;1744:4;1736:6;1732:17;1722:27;;1690:61;1797:2;1789:6;1786:14;1766:18;1763:38;1760:161;;1843:10;1838:3;1834:20;1831:1;1824:31;1878:4;1875:1;1868:15;1906:4;1903:1;1896:15;1760:161;;1547:380;;;:::o;2058:518::-;2160:2;2155:3;2152:11;2149:421;;;2196:5;2193:1;2186:16;2240:4;2237:1;2227:18;2310:2;2298:10;2294:19;2291:1;2287:27;2281:4;2277:38;2346:4;2334:10;2331:20;2328:47;;;-1:-1:-1;2369:4:28;2328:47;2424:2;2419:3;2415:12;2412:1;2408:20;2402:4;2398:31;2388:41;;2479:81;2497:2;2490:5;2487:13;2479:81;;;2556:1;2542:16;;2523:1;2512:13;2479:81;;;2483:3;;2149:421;2058:518;;;:::o;2752:1299::-;2872:10;;-1:-1:-1;;;;;2894:30:28;;2891:56;;;2927:18;;:::i;:::-;2956:97;3046:6;3006:38;3038:4;3032:11;3006:38;:::i;:::-;3000:4;2956:97;:::i;:::-;3102:4;3133:2;3122:14;;3150:1;3145:649;;;;3838:1;3855:6;3852:89;;;-1:-1:-1;3907:19:28;;;3901:26;3852:89;-1:-1:-1;;2709:1:28;2705:11;;;2701:24;2697:29;2687:40;2733:1;2729:11;;;2684:57;3954:81;;3115:930;;3145:649;2005:1;1998:14;;;2042:4;2029:18;;-1:-1:-1;;3181:20:28;;;3299:222;3313:7;3310:1;3307:14;3299:222;;;3395:19;;;3389:26;3374:42;;3502:4;3487:20;;;;3455:1;3443:14;;;;3329:12;3299:222;;;3303:3;3549:6;3540:7;3537:19;3534:201;;;3610:19;;;3604:26;-1:-1:-1;;3693:1:28;3689:14;;;3705:3;3685:24;3681:37;3677:42;3662:58;3647:74;;3534:201;-1:-1:-1;;;;3781:1:28;3765:14;;;3761:22;3748:36;;-1:-1:-1;2752:1299:28:o;:::-;58:785:23;;;;;;",
+ "linkReferences": {}
+ },
+ "deployedBytecode": {
+ "object": "0x60806040526004361061004a5760003560e01c80633ccfd60b1461004f5780634a79d50c146100665780637284e416146100915780638da5cb5b146100a6578063d7bb99ba146100de575b600080fd5b34801561005b57600080fd5b506100646100e6565b005b34801561007257600080fd5b5061007b6101e3565b60405161008891906102ef565b60405180910390f35b34801561009d57600080fd5b5061007b610271565b3480156100b257600080fd5b506000546100c6906001600160a01b031681565b6040516001600160a01b039091168152602001610088565b61006461027e565b6000546001600160a01b031633146101455760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e65722063616e2077697468647261772066756e647300000060448201526064015b60405180910390fd5b6000336001600160a01b0316476040515b60006040518083038185875af1925050503d8060008114610193576040519150601f19603f3d011682016040523d82523d6000602084013e610198565b606091505b50509050806101e05760405162461bcd60e51b81526020600482015260146024820152734661696c656420746f2073656e642066756e647360601b604482015260640161013c565b50565b600180546101f09061033d565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061033d565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b600280546101f09061033d565b600034116102da5760405162461bcd60e51b815260206004820152602360248201527f436f6e747269627574696f6e206d75737420626520677265617465722074686160448201526206e20360ec1b606482015260840161013c565b6000306001600160a01b031634604051610156565b602081526000825180602084015260005b8181101561031d5760208186018101516040868401015201610300565b506000604082850101526040601f19601f83011684010191505092915050565b600181811c9082168061035157607f821691505b60208210810361037157634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212201fb4a52834fac6a115bdc75420344fc9a4307154bae2b25d860a332e9db609cb64736f6c634300081a0033",
+ "sourceMap": "58:785:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;577:264;;;;;;;;;;;;;:::i;:::-;;108:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133:25;;;;;;;;;;;;;:::i;82:20::-;;;;;;;;;;-1:-1:-1;82:20:23;;;;-1:-1:-1;;;;;82:20:23;;;;;;-1:-1:-1;;;;;710:32:28;;;692:51;;680:2;665:18;82:20:23;546:203:28;328:243:23;;;:::i;577:264::-;636:5;;-1:-1:-1;;;;;636:5:23;622:10;:19;614:61;;;;-1:-1:-1;;;614:61:23;;956:2:28;614:61:23;;;938:21:28;995:2;975:18;;;968:30;1034:31;1014:18;;;1007:59;1083:18;;614:61:23;;;;;;;;;686:12;712:10;-1:-1:-1;;;;;704:24:23;749:21;704:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;685:99;;;802:7;794:40;;;;-1:-1:-1;;;794:40:23;;1524:2:28;794:40:23;;;1506:21:28;1563:2;1543:18;;;1536:30;-1:-1:-1;;;1582:18:28;;;1575:50;1642:18;;794:40:23;1322:344:28;794:40:23;604:237;577:264::o;108:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;133:25::-;;;;;;;:::i;328:243::-;395:1;383:9;:13;375:61;;;;-1:-1:-1;;;375:61:23;;2258:2:28;375:61:23;;;2240:21:28;2297:2;2277:18;;;2270:30;2336:34;2316:18;;;2309:62;-1:-1:-1;;;2387:18:28;;;2380:33;2430:19;;375:61:23;2056:399:28;375:61:23;447:12;481:4;-1:-1:-1;;;;;465:27:23;500:9;465:49;;;1112:205:28;14:527;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;263:1;273:140;287:6;284:1;281:13;273:140;;;398:2;382:14;;;378:23;;372:30;367:2;348:17;;;344:26;337:66;302:10;273:140;;;277:3;462:1;457:2;448:6;437:9;433:22;429:31;422:42;532:2;525;521:7;516:2;508:6;504:15;500:29;489:9;485:45;481:54;473:62;;;14:527;;;;:::o;1671:380::-;1750:1;1746:12;;;;1793;;;1814:61;;1868:4;1860:6;1856:17;1846:27;;1814:61;1921:2;1913:6;1910:14;1890:18;1887:38;1884:161;;1967:10;1962:3;1958:20;1955:1;1948:31;2002:4;1999:1;1992:15;2030:4;2027:1;2020:15;1884:161;;1671:380;;;:::o",
+ "linkReferences": {}
+ },
+ "methodIdentifiers": {
+ "contribute()": "d7bb99ba",
+ "description()": "7284e416",
+ "owner()": "8da5cb5b",
+ "title()": "4a79d50c",
+ "withdraw()": "3ccfd60b"
+ },
+ "rawMetadata": "{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"contribute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"title\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Campaign.sol\":\"Campaign\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/Campaign.sol\":{\"keccak256\":\"0x3861d65d56e3c88bf4f84e86eea35d7ece6d9ab3b4d913153e5a395fd1afb144\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc60c005694ee5dae2e1d901838961ac8d777a43e27af7c376240502ccc21a6d\",\"dweb:/ipfs/QmSrXpFRYGuQaSmQszyYqgeK1R8m4SEtxB3PpQkWDdM6wA\"]}},\"version\":1}",
+ "metadata": {
+ "compiler": {
+ "version": "0.8.26+commit.8a97fa7a"
+ },
+ "language": "Solidity",
+ "output": {
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "_title",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "_description",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "stateMutability": "payable",
+ "type": "function",
+ "name": "contribute"
+ },
+ {
+ "inputs": [],
+ "stateMutability": "view",
+ "type": "function",
+ "name": "description",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "inputs": [],
+ "stateMutability": "view",
+ "type": "function",
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ]
+ },
+ {
+ "inputs": [],
+ "stateMutability": "view",
+ "type": "function",
+ "name": "title",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ "name": "withdraw"
+ }
+ ],
+ "devdoc": {
+ "kind": "dev",
+ "methods": {},
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {},
+ "version": 1
+ }
+ },
+ "settings": {
+ "remappings": [
+ "forge-std/=lib/forge-std/src/"
+ ],
+ "optimizer": {
+ "enabled": true,
+ "runs": 200
+ },
+ "metadata": {
+ "bytecodeHash": "ipfs"
+ },
+ "compilationTarget": {
+ "src/Campaign.sol": "Campaign"
+ },
+ "evmVersion": "paris",
+ "libraries": {}
+ },
+ "sources": {
+ "src/Campaign.sol": {
+ "keccak256": "0x3861d65d56e3c88bf4f84e86eea35d7ece6d9ab3b4d913153e5a395fd1afb144",
+ "urls": [
+ "bzz-raw://dc60c005694ee5dae2e1d901838961ac8d777a43e27af7c376240502ccc21a6d",
+ "dweb:/ipfs/QmSrXpFRYGuQaSmQszyYqgeK1R8m4SEtxB3PpQkWDdM6wA"
+ ],
+ "license": "MIT"
+ }
+ },
+ "version": 1
+ },
+ "id": 23
+}
\ No newline at end of file
diff --git a/08-Crowdfunding dApp on Core/frontend/src/abis/CampaignFactory.json b/08-Crowdfunding dApp on Core/frontend/src/abis/CampaignFactory.json
new file mode 100644
index 00000000..feb74e03
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/abis/CampaignFactory.json
@@ -0,0 +1,176 @@
+{
+ "abi": [
+ {
+ "type": "function",
+ "name": "campaigns",
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256",
+ "internalType": "uint256"
+ }
+ ],
+ "outputs": [
+ {
+ "name": "",
+ "type": "address",
+ "internalType": "address"
+ }
+ ],
+ "stateMutability": "view"
+ },
+ {
+ "type": "function",
+ "name": "createCampaign",
+ "inputs": [
+ {
+ "name": "title",
+ "type": "string",
+ "internalType": "string"
+ },
+ {
+ "name": "description",
+ "type": "string",
+ "internalType": "string"
+ }
+ ],
+ "outputs": [],
+ "stateMutability": "nonpayable"
+ },
+ {
+ "type": "function",
+ "name": "getCampaigns",
+ "inputs": [],
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]",
+ "internalType": "address[]"
+ }
+ ],
+ "stateMutability": "view"
+ }
+ ],
+ "bytecode": {
+ "object": "0x6080604052348015600f57600080fd5b50610a678061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063141961bc14610046578063a6b0363314610076578063fce3f6ac1461008b575b600080fd5b6100596100543660046101c3565b6100a0565b6040516001600160a01b0390911681526020015b60405180910390f35b61007e6100ca565b60405161006d91906101dc565b61009e6100993660046102cd565b61012c565b005b600081815481106100b057600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600080548060200260200160405190810160405280929190818152602001828054801561012257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610104575b5050505050905090565b6000828260405161013c906101b6565b61014792919061037c565b604051809103906000f080158015610163573d6000803e3d6000fd5b50600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b0392909216919091179055505050565b610687806103ab83390190565b6000602082840312156101d557600080fd5b5035919050565b602080825282518282018190526000918401906040840190835b8181101561021d5783516001600160a01b03168352602093840193909201916001016101f6565b509095945050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261024f57600080fd5b813567ffffffffffffffff81111561026957610269610228565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561029857610298610228565b6040528181528382016020018510156102b057600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156102e057600080fd5b823567ffffffffffffffff8111156102f757600080fd5b6103038582860161023e565b925050602083013567ffffffffffffffff81111561032057600080fd5b61032c8582860161023e565b9150509250929050565b6000815180845260005b8181101561035c57602081850181015186830182015201610340565b506000602082860101526020601f19601f83011685010191505092915050565b60408152600061038f6040830185610336565b82810360208401526103a18185610336565b9594505050505056fe608060405234801561001057600080fd5b5060405161068738038061068783398101604081905261002f9161011b565b600080546001600160a01b03191633179055600161004d838261020d565b50600261005a828261020d565b5050506102cb565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261008957600080fd5b81516001600160401b038111156100a2576100a2610062565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d0576100d0610062565b6040528181528382016020018510156100e857600080fd5b60005b82811015610107576020818601810151838301820152016100eb565b506000918101602001919091529392505050565b6000806040838503121561012e57600080fd5b82516001600160401b0381111561014457600080fd5b61015085828601610078565b602085015190935090506001600160401b0381111561016e57600080fd5b61017a85828601610078565b9150509250929050565b600181811c9082168061019857607f821691505b6020821081036101b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561020857806000526020600020601f840160051c810160208510156101e55750805b601f840160051c820191505b8181101561020557600081556001016101f1565b50505b505050565b81516001600160401b0381111561022657610226610062565b61023a816102348454610184565b846101be565b6020601f82116001811461026e57600083156102565750848201515b600019600385901b1c1916600184901b178455610205565b600084815260208120601f198516915b8281101561029e578785015182556020948501946001909201910161027e565b50848210156102bc5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6103ad806102da6000396000f3fe60806040526004361061004a5760003560e01c80633ccfd60b1461004f5780634a79d50c146100665780637284e416146100915780638da5cb5b146100a6578063d7bb99ba146100de575b600080fd5b34801561005b57600080fd5b506100646100e6565b005b34801561007257600080fd5b5061007b6101e3565b60405161008891906102ef565b60405180910390f35b34801561009d57600080fd5b5061007b610271565b3480156100b257600080fd5b506000546100c6906001600160a01b031681565b6040516001600160a01b039091168152602001610088565b61006461027e565b6000546001600160a01b031633146101455760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e65722063616e2077697468647261772066756e647300000060448201526064015b60405180910390fd5b6000336001600160a01b0316476040515b60006040518083038185875af1925050503d8060008114610193576040519150601f19603f3d011682016040523d82523d6000602084013e610198565b606091505b50509050806101e05760405162461bcd60e51b81526020600482015260146024820152734661696c656420746f2073656e642066756e647360601b604482015260640161013c565b50565b600180546101f09061033d565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061033d565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b600280546101f09061033d565b600034116102da5760405162461bcd60e51b815260206004820152602360248201527f436f6e747269627574696f6e206d75737420626520677265617465722074686160448201526206e20360ec1b606482015260840161013c565b6000306001600160a01b031634604051610156565b602081526000825180602084015260005b8181101561031d5760208186018101516040868401015201610300565b506000604082850101526040601f19601f83011684010191505092915050565b600181811c9082168061035157607f821691505b60208210810361037157634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212201fb4a52834fac6a115bdc75420344fc9a4307154bae2b25d860a332e9db609cb64736f6c634300081a0033a2646970667358221220e69865dfd5ee1e0087c5f667a957fa4cb0d9645e2be8b161c5d9704a2a838a5064736f6c634300081a0033",
+ "sourceMap": "84:387:24:-:0;;;;;;;;;;;;;;;;;;;",
+ "linkReferences": {}
+ },
+ "deployedBytecode": {
+ "object": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063141961bc14610046578063a6b0363314610076578063fce3f6ac1461008b575b600080fd5b6100596100543660046101c3565b6100a0565b6040516001600160a01b0390911681526020015b60405180910390f35b61007e6100ca565b60405161006d91906101dc565b61009e6100993660046102cd565b61012c565b005b600081815481106100b057600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600080548060200260200160405190810160405280929190818152602001828054801561012257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610104575b5050505050905090565b6000828260405161013c906101b6565b61014792919061037c565b604051809103906000f080158015610163573d6000803e3d6000fd5b50600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b0392909216919091179055505050565b610687806103ab83390190565b6000602082840312156101d557600080fd5b5035919050565b602080825282518282018190526000918401906040840190835b8181101561021d5783516001600160a01b03168352602093840193909201916001016101f6565b509095945050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261024f57600080fd5b813567ffffffffffffffff81111561026957610269610228565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561029857610298610228565b6040528181528382016020018510156102b057600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156102e057600080fd5b823567ffffffffffffffff8111156102f757600080fd5b6103038582860161023e565b925050602083013567ffffffffffffffff81111561032057600080fd5b61032c8582860161023e565b9150509250929050565b6000815180845260005b8181101561035c57602081850181015186830182015201610340565b506000602082860101526020601f19601f83011685010191505092915050565b60408152600061038f6040830185610336565b82810360208401526103a18185610336565b9594505050505056fe608060405234801561001057600080fd5b5060405161068738038061068783398101604081905261002f9161011b565b600080546001600160a01b03191633179055600161004d838261020d565b50600261005a828261020d565b5050506102cb565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261008957600080fd5b81516001600160401b038111156100a2576100a2610062565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d0576100d0610062565b6040528181528382016020018510156100e857600080fd5b60005b82811015610107576020818601810151838301820152016100eb565b506000918101602001919091529392505050565b6000806040838503121561012e57600080fd5b82516001600160401b0381111561014457600080fd5b61015085828601610078565b602085015190935090506001600160401b0381111561016e57600080fd5b61017a85828601610078565b9150509250929050565b600181811c9082168061019857607f821691505b6020821081036101b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561020857806000526020600020601f840160051c810160208510156101e55750805b601f840160051c820191505b8181101561020557600081556001016101f1565b50505b505050565b81516001600160401b0381111561022657610226610062565b61023a816102348454610184565b846101be565b6020601f82116001811461026e57600083156102565750848201515b600019600385901b1c1916600184901b178455610205565b600084815260208120601f198516915b8281101561029e578785015182556020948501946001909201910161027e565b50848210156102bc5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6103ad806102da6000396000f3fe60806040526004361061004a5760003560e01c80633ccfd60b1461004f5780634a79d50c146100665780637284e416146100915780638da5cb5b146100a6578063d7bb99ba146100de575b600080fd5b34801561005b57600080fd5b506100646100e6565b005b34801561007257600080fd5b5061007b6101e3565b60405161008891906102ef565b60405180910390f35b34801561009d57600080fd5b5061007b610271565b3480156100b257600080fd5b506000546100c6906001600160a01b031681565b6040516001600160a01b039091168152602001610088565b61006461027e565b6000546001600160a01b031633146101455760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e65722063616e2077697468647261772066756e647300000060448201526064015b60405180910390fd5b6000336001600160a01b0316476040515b60006040518083038185875af1925050503d8060008114610193576040519150601f19603f3d011682016040523d82523d6000602084013e610198565b606091505b50509050806101e05760405162461bcd60e51b81526020600482015260146024820152734661696c656420746f2073656e642066756e647360601b604482015260640161013c565b50565b600180546101f09061033d565b80601f016020809104026020016040519081016040528092919081815260200182805461021c9061033d565b80156102695780601f1061023e57610100808354040283529160200191610269565b820191906000526020600020905b81548152906001019060200180831161024c57829003601f168201915b505050505081565b600280546101f09061033d565b600034116102da5760405162461bcd60e51b815260206004820152602360248201527f436f6e747269627574696f6e206d75737420626520677265617465722074686160448201526206e20360ec1b606482015260840161013c565b6000306001600160a01b031634604051610156565b602081526000825180602084015260005b8181101561031d5760208186018101516040868401015201610300565b506000604082850101526040601f19601f83011684010191505092915050565b600181811c9082168061035157607f821691505b60208210810361037157634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212201fb4a52834fac6a115bdc75420344fc9a4307154bae2b25d860a332e9db609cb64736f6c634300081a0033a2646970667358221220e69865dfd5ee1e0087c5f667a957fa4cb0d9645e2be8b161c5d9704a2a838a5064736f6c634300081a0033",
+ "sourceMap": "84:387:24:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115:26;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;363:32:28;;;345:51;;333:2;318:18;115:26:24;;;;;;;;373:96;;;:::i;:::-;;;;;;;:::i;148:219::-;;;;;;:::i;:::-;;:::i;:::-;;115:26;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;115:26:24;;-1:-1:-1;115:26:24;:::o;373:96::-;418:16;453:9;446:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;446:16:24;;;;;;;;;;;;;;;;;;;;;;;373:96;:::o;148:219::-;259:20;295:5;302:11;282:32;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;324:9:24;:36;;;;;;;;;;;;;;-1:-1:-1;;;;;;324:36:24;-1:-1:-1;;;;;324:36:24;;;;;;;;;;-1:-1:-1;;;148:219:24:o;-1:-1:-1:-;;;;;;;;:::o;14:180:28:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:28;;14:180;-1:-1:-1;14:180:28:o;407:637::-;597:2;609:21;;;679:13;;582:18;;;701:22;;;549:4;;780:15;;;754:2;739:18;;;549:4;823:195;837:6;834:1;831:13;823:195;;;902:13;;-1:-1:-1;;;;;898:39:28;886:52;;967:2;993:15;;;;958:12;;;;934:1;852:9;823:195;;;-1:-1:-1;1035:3:28;;407:637;-1:-1:-1;;;;;407:637:28:o;1049:127::-;1110:10;1105:3;1101:20;1098:1;1091:31;1141:4;1138:1;1131:15;1165:4;1162:1;1155:15;1181:726;1224:5;1277:3;1270:4;1262:6;1258:17;1254:27;1244:55;;1295:1;1292;1285:12;1244:55;1335:6;1322:20;1365:18;1357:6;1354:30;1351:56;;;1387:18;;:::i;:::-;1436:2;1430:9;1528:2;1490:17;;-1:-1:-1;;1486:31:28;;;1519:2;1482:40;1478:54;1466:67;;1563:18;1548:34;;1584:22;;;1545:62;1542:88;;;1610:18;;:::i;:::-;1646:2;1639:22;1670;;;1711:19;;;1732:4;1707:30;1704:39;-1:-1:-1;1701:59:28;;;1756:1;1753;1746:12;1701:59;1820:6;1813:4;1805:6;1801:17;1794:4;1786:6;1782:17;1769:58;1875:1;1847:19;;;1868:4;1843:30;1836:41;;;;1851:6;1181:726;-1:-1:-1;;;1181:726:28:o;1912:538::-;2000:6;2008;2061:2;2049:9;2040:7;2036:23;2032:32;2029:52;;;2077:1;2074;2067:12;2029:52;2117:9;2104:23;2150:18;2142:6;2139:30;2136:50;;;2182:1;2179;2172:12;2136:50;2205;2247:7;2238:6;2227:9;2223:22;2205:50;:::i;:::-;2195:60;;;2308:2;2297:9;2293:18;2280:32;2337:18;2327:8;2324:32;2321:52;;;2369:1;2366;2359:12;2321:52;2392;2436:7;2425:8;2414:9;2410:24;2392:52;:::i;:::-;2382:62;;;1912:538;;;;;:::o;2455:400::-;2497:3;2535:5;2529:12;2562:6;2557:3;2550:19;2587:1;2597:139;2611:6;2608:1;2605:13;2597:139;;;2719:4;2704:13;;;2700:24;;2694:31;2674:11;;;2670:22;;2663:63;2626:12;2597:139;;;2601:3;2781:1;2774:4;2765:6;2760:3;2756:16;2752:27;2745:38;2844:4;2837:2;2833:7;2828:2;2820:6;2816:15;2812:29;2807:3;2803:39;2799:50;2792:57;;;2455:400;;;;:::o;2860:383::-;3057:2;3046:9;3039:21;3020:4;3083:45;3124:2;3113:9;3109:18;3101:6;3083:45;:::i;:::-;3176:9;3168:6;3164:22;3159:2;3148:9;3144:18;3137:50;3204:33;3230:6;3222;3204:33;:::i;:::-;3196:41;2860:383;-1:-1:-1;;;;;2860:383:28:o",
+ "linkReferences": {}
+ },
+ "methodIdentifiers": {
+ "campaigns(uint256)": "141961bc",
+ "createCampaign(string,string)": "fce3f6ac",
+ "getCampaigns()": "a6b03633"
+ },
+ "rawMetadata": "{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"campaigns\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"createCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCampaigns\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/CampaignFactory.sol\":\"CampaignFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/Campaign.sol\":{\"keccak256\":\"0x3861d65d56e3c88bf4f84e86eea35d7ece6d9ab3b4d913153e5a395fd1afb144\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dc60c005694ee5dae2e1d901838961ac8d777a43e27af7c376240502ccc21a6d\",\"dweb:/ipfs/QmSrXpFRYGuQaSmQszyYqgeK1R8m4SEtxB3PpQkWDdM6wA\"]},\"src/CampaignFactory.sol\":{\"keccak256\":\"0xde81f08c511d4008b6c070955c485d59d5dbb09af5b84b873f7c9674e1ea476f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://542398c38491d4e1e70fcbe588dfcd70d66276b619452a78479e5a5f447091c7\",\"dweb:/ipfs/QmbT7iXKBCfWNTWc5mR5B34qsPqcdChLJUWFe7X8Sv6Fpn\"]}},\"version\":1}",
+ "metadata": {
+ "compiler": {
+ "version": "0.8.26+commit.8a97fa7a"
+ },
+ "language": "Solidity",
+ "output": {
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ "name": "campaigns",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ]
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "title",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ "name": "createCampaign"
+ },
+ {
+ "inputs": [],
+ "stateMutability": "view",
+ "type": "function",
+ "name": "getCampaigns",
+ "outputs": [
+ {
+ "internalType": "address[]",
+ "name": "",
+ "type": "address[]"
+ }
+ ]
+ }
+ ],
+ "devdoc": {
+ "kind": "dev",
+ "methods": {},
+ "version": 1
+ },
+ "userdoc": {
+ "kind": "user",
+ "methods": {},
+ "version": 1
+ }
+ },
+ "settings": {
+ "remappings": [
+ "forge-std/=lib/forge-std/src/"
+ ],
+ "optimizer": {
+ "enabled": true,
+ "runs": 200
+ },
+ "metadata": {
+ "bytecodeHash": "ipfs"
+ },
+ "compilationTarget": {
+ "src/CampaignFactory.sol": "CampaignFactory"
+ },
+ "evmVersion": "paris",
+ "libraries": {}
+ },
+ "sources": {
+ "src/Campaign.sol": {
+ "keccak256": "0x3861d65d56e3c88bf4f84e86eea35d7ece6d9ab3b4d913153e5a395fd1afb144",
+ "urls": [
+ "bzz-raw://dc60c005694ee5dae2e1d901838961ac8d777a43e27af7c376240502ccc21a6d",
+ "dweb:/ipfs/QmSrXpFRYGuQaSmQszyYqgeK1R8m4SEtxB3PpQkWDdM6wA"
+ ],
+ "license": "MIT"
+ },
+ "src/CampaignFactory.sol": {
+ "keccak256": "0xde81f08c511d4008b6c070955c485d59d5dbb09af5b84b873f7c9674e1ea476f",
+ "urls": [
+ "bzz-raw://542398c38491d4e1e70fcbe588dfcd70d66276b619452a78479e5a5f447091c7",
+ "dweb:/ipfs/QmbT7iXKBCfWNTWc5mR5B34qsPqcdChLJUWFe7X8Sv6Fpn"
+ ],
+ "license": "MIT"
+ }
+ },
+ "version": 1
+ },
+ "id": 24
+}
\ No newline at end of file
diff --git a/08-Crowdfunding dApp on Core/frontend/src/assets/react.svg b/08-Crowdfunding dApp on Core/frontend/src/assets/react.svg
new file mode 100644
index 00000000..6c87de9b
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/08-Crowdfunding dApp on Core/frontend/src/index.css b/08-Crowdfunding dApp on Core/frontend/src/index.css
new file mode 100644
index 00000000..e69de29b
diff --git a/08-Crowdfunding dApp on Core/frontend/src/index.d.ts b/08-Crowdfunding dApp on Core/frontend/src/index.d.ts
new file mode 100644
index 00000000..4f78a389
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/index.d.ts
@@ -0,0 +1,7 @@
+import { ethers } from 'ethers'
+
+declare global {
+ interface Window {
+ ethereum: ethers.Eip6963Provider
+ }
+}
\ No newline at end of file
diff --git a/08-Crowdfunding dApp on Core/frontend/src/main.tsx b/08-Crowdfunding dApp on Core/frontend/src/main.tsx
new file mode 100644
index 00000000..8716a50c
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/main.tsx
@@ -0,0 +1,20 @@
+import { createRoot } from 'react-dom/client'
+import { createBrowserRouter, RouterProvider } from 'react-router-dom'
+import App from './App.tsx'
+import Campaign from './Campaign.tsx'
+import './index.css'
+
+const router = createBrowserRouter([
+ {
+ path: '/',
+ element: ,
+ },
+ {
+ path: '/campaign/:campaignAddress',
+ element: ,
+ },
+])
+
+createRoot(document.getElementById('root')!).render(
+
+)
diff --git a/08-Crowdfunding dApp on Core/frontend/src/vite-env.d.ts b/08-Crowdfunding dApp on Core/frontend/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/08-Crowdfunding dApp on Core/frontend/tsconfig.app.json b/08-Crowdfunding dApp on Core/frontend/tsconfig.app.json
new file mode 100644
index 00000000..f0a23505
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/tsconfig.app.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/08-Crowdfunding dApp on Core/frontend/tsconfig.json b/08-Crowdfunding dApp on Core/frontend/tsconfig.json
new file mode 100644
index 00000000..1ffef600
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/08-Crowdfunding dApp on Core/frontend/tsconfig.node.json b/08-Crowdfunding dApp on Core/frontend/tsconfig.node.json
new file mode 100644
index 00000000..0d3d7144
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/tsconfig.node.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/08-Crowdfunding dApp on Core/frontend/vite.config.ts b/08-Crowdfunding dApp on Core/frontend/vite.config.ts
new file mode 100644
index 00000000..5a33944a
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/08-Crowdfunding dApp on Core/frontend/yarn.lock b/08-Crowdfunding dApp on Core/frontend/yarn.lock
new file mode 100644
index 00000000..0f3b25df
--- /dev/null
+++ b/08-Crowdfunding dApp on Core/frontend/yarn.lock
@@ -0,0 +1,1613 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@adraffy/ens-normalize@1.10.1":
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069"
+ integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
+ integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
+ dependencies:
+ "@babel/highlight" "^7.24.7"
+ picocolors "^1.0.0"
+
+"@babel/compat-data@^7.25.2":
+ version "7.25.4"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb"
+ integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==
+
+"@babel/core@^7.24.5":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77"
+ integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.25.0"
+ "@babel/helper-compilation-targets" "^7.25.2"
+ "@babel/helper-module-transforms" "^7.25.2"
+ "@babel/helpers" "^7.25.0"
+ "@babel/parser" "^7.25.0"
+ "@babel/template" "^7.25.0"
+ "@babel/traverse" "^7.25.2"
+ "@babel/types" "^7.25.2"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.25.0", "@babel/generator@^7.25.6":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c"
+ integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
+ dependencies:
+ "@babel/types" "^7.25.6"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^2.5.1"
+
+"@babel/helper-compilation-targets@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c"
+ integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==
+ dependencies:
+ "@babel/compat-data" "^7.25.2"
+ "@babel/helper-validator-option" "^7.24.8"
+ browserslist "^4.23.1"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-module-imports@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
+ integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-module-transforms@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6"
+ integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-simple-access" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/traverse" "^7.25.2"
+
+"@babel/helper-plugin-utils@^7.24.7":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878"
+ integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==
+
+"@babel/helper-simple-access@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
+ integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
+"@babel/helper-string-parser@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
+ integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
+
+"@babel/helper-validator-identifier@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
+ integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
+
+"@babel/helper-validator-option@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d"
+ integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==
+
+"@babel/helpers@^7.25.0":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60"
+ integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==
+ dependencies:
+ "@babel/template" "^7.25.0"
+ "@babel/types" "^7.25.6"
+
+"@babel/highlight@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
+ integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.24.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
+ integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
+ dependencies:
+ "@babel/types" "^7.25.6"
+
+"@babel/plugin-transform-react-jsx-self@^7.24.5":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab"
+ integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-react-jsx-source@^7.24.1":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3"
+ integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/template@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a"
+ integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/parser" "^7.25.0"
+ "@babel/types" "^7.25.0"
+
+"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41"
+ integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.25.6"
+ "@babel/parser" "^7.25.6"
+ "@babel/template" "^7.25.0"
+ "@babel/types" "^7.25.6"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
+ integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
+ dependencies:
+ "@babel/helper-string-parser" "^7.24.8"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ to-fast-properties "^2.0.0"
+
+"@esbuild/aix-ppc64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
+ integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
+
+"@esbuild/android-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
+ integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
+
+"@esbuild/android-arm@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
+ integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
+
+"@esbuild/android-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
+ integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
+
+"@esbuild/darwin-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
+ integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
+
+"@esbuild/darwin-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
+ integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
+
+"@esbuild/freebsd-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
+ integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
+
+"@esbuild/freebsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
+ integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
+
+"@esbuild/linux-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
+ integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
+
+"@esbuild/linux-arm@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
+ integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
+
+"@esbuild/linux-ia32@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
+ integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
+
+"@esbuild/linux-loong64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
+ integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
+
+"@esbuild/linux-mips64el@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
+ integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
+
+"@esbuild/linux-ppc64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
+ integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
+
+"@esbuild/linux-riscv64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
+ integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
+
+"@esbuild/linux-s390x@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
+ integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
+
+"@esbuild/linux-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
+ integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
+
+"@esbuild/netbsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
+ integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
+
+"@esbuild/openbsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
+ integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
+
+"@esbuild/sunos-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
+ integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
+
+"@esbuild/win32-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
+ integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
+
+"@esbuild/win32-ia32@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
+ integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
+
+"@esbuild/win32-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
+ integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0":
+ version "4.11.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f"
+ integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==
+
+"@eslint/config-array@^0.18.0":
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d"
+ integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==
+ dependencies:
+ "@eslint/object-schema" "^2.1.4"
+ debug "^4.3.1"
+ minimatch "^3.1.2"
+
+"@eslint/eslintrc@^3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6"
+ integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^10.0.1"
+ globals "^14.0.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@9.10.0", "@eslint/js@^9.9.0":
+ version "9.10.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.10.0.tgz#eaa3cb0baec497970bb29e43a153d0d5650143c6"
+ integrity sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==
+
+"@eslint/object-schema@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843"
+ integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==
+
+"@eslint/plugin-kit@^0.1.0":
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz#809b95a0227ee79c3195adfb562eb94352e77974"
+ integrity sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==
+ dependencies:
+ levn "^0.4.1"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/retry@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570"
+ integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@noble/curves@1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
+ integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
+ dependencies:
+ "@noble/hashes" "1.3.2"
+
+"@noble/hashes@1.3.2":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
+ integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@remix-run/router@1.19.2":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.2.tgz#0c896535473291cb41f152c180bedd5680a3b273"
+ integrity sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==
+
+"@rollup/rollup-android-arm-eabi@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz#155c7d82c1b36c3ad84d9adf9b3cd520cba81a0f"
+ integrity sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==
+
+"@rollup/rollup-android-arm64@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz#b94b6fa002bd94a9cbd8f9e47e23b25e5bd113ba"
+ integrity sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==
+
+"@rollup/rollup-darwin-arm64@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz#0934126cf9cbeadfe0eb7471ab5d1517e8cd8dcc"
+ integrity sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==
+
+"@rollup/rollup-darwin-x64@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz#0ce8e1e0f349778938c7c90e4bdc730640e0a13e"
+ integrity sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz#5669d34775ad5d71e4f29ade99d0ff4df523afb6"
+ integrity sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==
+
+"@rollup/rollup-linux-arm-musleabihf@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz#f6d1a0e1da4061370cb2f4244fbdd727c806dd88"
+ integrity sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==
+
+"@rollup/rollup-linux-arm64-gnu@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz#ed96a05e99743dee4d23cc4913fc6e01a0089c88"
+ integrity sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==
+
+"@rollup/rollup-linux-arm64-musl@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz#057ea26eaa7e537a06ded617d23d57eab3cecb58"
+ integrity sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz#6e6e1f9404c9bf3fbd7d51cd11cd288a9a2843aa"
+ integrity sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==
+
+"@rollup/rollup-linux-riscv64-gnu@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz#eef1536a53f6e6658a2a778130e6b1a4a41cb439"
+ integrity sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==
+
+"@rollup/rollup-linux-s390x-gnu@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz#2b28fb89ca084efaf8086f435025d96b4a966957"
+ integrity sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==
+
+"@rollup/rollup-linux-x64-gnu@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz#5226cde6c6b495b04a3392c1d2c572844e42f06b"
+ integrity sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==
+
+"@rollup/rollup-linux-x64-musl@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz#2c2412982e6c2a00a2ecac6d548ebb02f0aa6ca4"
+ integrity sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==
+
+"@rollup/rollup-win32-arm64-msvc@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz#fbb6ef5379199e2ec0103ef32877b0985c773a55"
+ integrity sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==
+
+"@rollup/rollup-win32-ia32-msvc@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz#d50e2082e147e24d87fe34abbf6246525ec3845a"
+ integrity sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==
+
+"@rollup/rollup-win32-x64-msvc@4.21.3":
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz#4115233aa1bd5a2060214f96d8511f6247093212"
+ integrity sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==
+
+"@types/babel__core@^7.20.5":
+ version "7.20.5"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.6.8"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab"
+ integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*":
+ version "7.20.6"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7"
+ integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==
+ dependencies:
+ "@babel/types" "^7.20.7"
+
+"@types/estree@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
+ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
+
+"@types/node@18.15.13":
+ version "18.15.13"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469"
+ integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==
+
+"@types/prop-types@*":
+ version "15.7.12"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
+ integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
+
+"@types/react-dom@^18.3.0":
+ version "18.3.0"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0"
+ integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@^18.3.3":
+ version "18.3.5"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.5.tgz#5f524c2ad2089c0ff372bbdabc77ca2c4dbadf8f"
+ integrity sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==
+ dependencies:
+ "@types/prop-types" "*"
+ csstype "^3.0.2"
+
+"@typescript-eslint/eslint-plugin@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz#7c1863693a98371703686e1c0fac64ffc576cdb1"
+ integrity sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==
+ dependencies:
+ "@eslint-community/regexpp" "^4.10.0"
+ "@typescript-eslint/scope-manager" "8.5.0"
+ "@typescript-eslint/type-utils" "8.5.0"
+ "@typescript-eslint/utils" "8.5.0"
+ "@typescript-eslint/visitor-keys" "8.5.0"
+ graphemer "^1.4.0"
+ ignore "^5.3.1"
+ natural-compare "^1.4.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/parser@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.5.0.tgz#d590e1ef9f31f26d423999ad3f687723247e6bcc"
+ integrity sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==
+ dependencies:
+ "@typescript-eslint/scope-manager" "8.5.0"
+ "@typescript-eslint/types" "8.5.0"
+ "@typescript-eslint/typescript-estree" "8.5.0"
+ "@typescript-eslint/visitor-keys" "8.5.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz#385341de65b976f02b295b8aca54bb4ffd6b5f07"
+ integrity sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==
+ dependencies:
+ "@typescript-eslint/types" "8.5.0"
+ "@typescript-eslint/visitor-keys" "8.5.0"
+
+"@typescript-eslint/type-utils@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz#6215b23aa39dbbd8dde0a4ef9ee0f745410c29b1"
+ integrity sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "8.5.0"
+ "@typescript-eslint/utils" "8.5.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/types@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.5.0.tgz#4465d99331d1276f8fb2030e4f9c73fe01a05bf9"
+ integrity sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==
+
+"@typescript-eslint/typescript-estree@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz#6e5758cf2f63aa86e9ddfa4e284e2e0b81b87557"
+ integrity sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==
+ dependencies:
+ "@typescript-eslint/types" "8.5.0"
+ "@typescript-eslint/visitor-keys" "8.5.0"
+ debug "^4.3.4"
+ fast-glob "^3.3.2"
+ is-glob "^4.0.3"
+ minimatch "^9.0.4"
+ semver "^7.6.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/utils@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.5.0.tgz#4d4ffed96d0654546a37faa5b84bdce16d951634"
+ integrity sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@typescript-eslint/scope-manager" "8.5.0"
+ "@typescript-eslint/types" "8.5.0"
+ "@typescript-eslint/typescript-estree" "8.5.0"
+
+"@typescript-eslint/visitor-keys@8.5.0":
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz#13028df3b866d2e3e2e2cc4193cf2c1e0e04c4bf"
+ integrity sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==
+ dependencies:
+ "@typescript-eslint/types" "8.5.0"
+ eslint-visitor-keys "^3.4.3"
+
+"@vitejs/plugin-react@^4.3.1":
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e"
+ integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==
+ dependencies:
+ "@babel/core" "^7.24.5"
+ "@babel/plugin-transform-react-jsx-self" "^7.24.5"
+ "@babel/plugin-transform-react-jsx-source" "^7.24.1"
+ "@types/babel__core" "^7.20.5"
+ react-refresh "^0.14.2"
+
+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.12.0:
+ version "8.12.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
+ integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
+
+aes-js@4.0.0-beta.5:
+ version "4.0.0-beta.5"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873"
+ integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==
+
+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==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+browserslist@^4.23.1:
+ version "4.23.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800"
+ integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
+ dependencies:
+ caniuse-lite "^1.0.30001646"
+ electron-to-chromium "^1.5.4"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001646:
+ version "1.0.30001660"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz#31218de3463fabb44d0b7607b652e56edf2e2355"
+ integrity sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+csstype@^3.0.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+electron-to-chromium@^1.5.4:
+ version "1.5.23"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.23.tgz#6dabd8f7fec5cbf618b732ff4c42950dcc7a3be5"
+ integrity sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==
+
+esbuild@^0.21.3:
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
+ integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.21.5"
+ "@esbuild/android-arm" "0.21.5"
+ "@esbuild/android-arm64" "0.21.5"
+ "@esbuild/android-x64" "0.21.5"
+ "@esbuild/darwin-arm64" "0.21.5"
+ "@esbuild/darwin-x64" "0.21.5"
+ "@esbuild/freebsd-arm64" "0.21.5"
+ "@esbuild/freebsd-x64" "0.21.5"
+ "@esbuild/linux-arm" "0.21.5"
+ "@esbuild/linux-arm64" "0.21.5"
+ "@esbuild/linux-ia32" "0.21.5"
+ "@esbuild/linux-loong64" "0.21.5"
+ "@esbuild/linux-mips64el" "0.21.5"
+ "@esbuild/linux-ppc64" "0.21.5"
+ "@esbuild/linux-riscv64" "0.21.5"
+ "@esbuild/linux-s390x" "0.21.5"
+ "@esbuild/linux-x64" "0.21.5"
+ "@esbuild/netbsd-x64" "0.21.5"
+ "@esbuild/openbsd-x64" "0.21.5"
+ "@esbuild/sunos-x64" "0.21.5"
+ "@esbuild/win32-arm64" "0.21.5"
+ "@esbuild/win32-ia32" "0.21.5"
+ "@esbuild/win32-x64" "0.21.5"
+
+escalade@^3.1.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-plugin-react-hooks@^5.1.0-rc.0:
+ version "5.1.0-rc-fb9a90fa48-20240614"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz#206a7ec005f0b286aaf7091f4e566083d310b189"
+ integrity sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==
+
+eslint-plugin-react-refresh@^0.4.9:
+ version "0.4.12"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz#73d61c7fcbe3f7280edb6579380b4350d2f547ed"
+ integrity sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==
+
+eslint-scope@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94"
+ integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb"
+ integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
+
+eslint@^9.9.0:
+ version "9.10.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.10.0.tgz#0bd74d7fe4db77565d0e7f57c7df6d2b04756806"
+ integrity sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.11.0"
+ "@eslint/config-array" "^0.18.0"
+ "@eslint/eslintrc" "^3.1.0"
+ "@eslint/js" "9.10.0"
+ "@eslint/plugin-kit" "^0.1.0"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@humanwhocodes/retry" "^0.3.0"
+ "@nodelib/fs.walk" "^1.2.8"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^8.0.2"
+ eslint-visitor-keys "^4.0.0"
+ espree "^10.1.0"
+ esquery "^1.5.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^8.0.0"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ is-path-inside "^3.0.3"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
+ text-table "^0.2.0"
+
+espree@^10.0.1, espree@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56"
+ integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==
+ dependencies:
+ acorn "^8.12.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^4.0.0"
+
+esquery@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+ethers@^6.13.2:
+ version "6.13.2"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.2.tgz#4b67d4b49e69b59893931a032560999e5e4419fe"
+ integrity sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==
+ dependencies:
+ "@adraffy/ens-normalize" "1.10.1"
+ "@noble/curves" "1.2.0"
+ "@noble/hashes" "1.3.2"
+ "@types/node" "18.15.13"
+ aes-js "4.0.0-beta.5"
+ tslib "2.4.0"
+ ws "8.17.1"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
+
+file-entry-cache@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f"
+ integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
+ dependencies:
+ flat-cache "^4.0.0"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c"
+ integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.4"
+
+flatted@^3.2.9:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
+ integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+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"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
+ integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
+
+globals@^15.9.0:
+ version "15.9.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-15.9.0.tgz#e9de01771091ffbc37db5714dab484f9f69ff399"
+ integrity sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+ignore@^5.2.0, ignore@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-schema-traverse@^0.4.1:
+ version "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-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==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+keyv@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+loose-envify@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.5"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59"
+ integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
+
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+postcss@^8.4.43:
+ version "8.4.47"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
+ integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.1.0"
+ source-map-js "^1.2.1"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-dom@^18.3.1:
+ version "18.3.1"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
+ integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
+ dependencies:
+ loose-envify "^1.1.0"
+ scheduler "^0.23.2"
+
+react-refresh@^0.14.2:
+ version "0.14.2"
+ resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9"
+ integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==
+
+react-router-dom@^6.26.2:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.2.tgz#a6e3b0cbd6bfd508e42b9342099d015a0ac59680"
+ integrity sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==
+ dependencies:
+ "@remix-run/router" "1.19.2"
+ react-router "6.26.2"
+
+react-router@6.26.2:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.2.tgz#2f0a68999168954431cdc29dd36cec3b6fa44a7e"
+ integrity sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==
+ dependencies:
+ "@remix-run/router" "1.19.2"
+
+react@^18.3.1:
+ version "18.3.1"
+ resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
+ integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rollup@^4.20.0:
+ version "4.21.3"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.3.tgz#c64ba119e6aeb913798a6f7eef2780a0df5a0821"
+ integrity sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==
+ dependencies:
+ "@types/estree" "1.0.5"
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.21.3"
+ "@rollup/rollup-android-arm64" "4.21.3"
+ "@rollup/rollup-darwin-arm64" "4.21.3"
+ "@rollup/rollup-darwin-x64" "4.21.3"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.21.3"
+ "@rollup/rollup-linux-arm-musleabihf" "4.21.3"
+ "@rollup/rollup-linux-arm64-gnu" "4.21.3"
+ "@rollup/rollup-linux-arm64-musl" "4.21.3"
+ "@rollup/rollup-linux-powerpc64le-gnu" "4.21.3"
+ "@rollup/rollup-linux-riscv64-gnu" "4.21.3"
+ "@rollup/rollup-linux-s390x-gnu" "4.21.3"
+ "@rollup/rollup-linux-x64-gnu" "4.21.3"
+ "@rollup/rollup-linux-x64-musl" "4.21.3"
+ "@rollup/rollup-win32-arm64-msvc" "4.21.3"
+ "@rollup/rollup-win32-ia32-msvc" "4.21.3"
+ "@rollup/rollup-win32-x64-msvc" "4.21.3"
+ fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+scheduler@^0.23.2:
+ version "0.23.2"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
+ integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.6.0:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+ts-api-utils@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
+ integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
+
+tslib@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+typescript-eslint@^8.0.1:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.5.0.tgz#041f6c302d0e9a8e116a33d60b0bb19f34036dd7"
+ integrity sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==
+ dependencies:
+ "@typescript-eslint/eslint-plugin" "8.5.0"
+ "@typescript-eslint/parser" "8.5.0"
+ "@typescript-eslint/utils" "8.5.0"
+
+typescript@^5.5.3:
+ version "5.6.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0"
+ integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==
+
+update-browserslist-db@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
+ integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+ dependencies:
+ escalade "^3.1.2"
+ picocolors "^1.0.1"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+vite@^5.4.1:
+ version "5.4.5"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.5.tgz#e4ab27709de46ff29bd8db52b0c51606acba893b"
+ integrity sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==
+ dependencies:
+ esbuild "^0.21.3"
+ postcss "^8.4.43"
+ rollup "^4.20.0"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+ws@8.17.1:
+ version "8.17.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
+ integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/08-Crowdfunding dApp on Core/images/campaign-lists.PNG b/08-Crowdfunding dApp on Core/images/campaign-lists.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..563d8c29d40b02964c6113cdb262b966c04729db
GIT binary patch
literal 21546
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
A(f|Me
literal 0
HcmV?d00001
diff --git a/08-Crowdfunding dApp on Core/images/create-frontend.PNG b/08-Crowdfunding dApp on Core/images/create-frontend.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..189ba97fc9640e70acc7d2375bc332cf51e60d6c
GIT binary patch
literal 33848
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