From 216cf953653aaa27a08ae6bf9f66b4bc697084fb Mon Sep 17 00:00:00 2001 From: Jan Cibulka Date: Thu, 30 May 2024 20:10:25 +0300 Subject: [PATCH] Readme files and package updates --- README.md | 47 ++++++++-------- backend/README.md | 121 +++++++++++++++++++++++++++++++----------- backend/bun.lockb | Bin 364554 -> 367668 bytes backend/package.json | 16 ++---- frontend/.env.example | 2 +- frontend/README.md | 49 ++++++++++++----- frontend/bun.lockb | Bin 249924 -> 256228 bytes frontend/package.json | 13 +++-- subgraph/README.md | 55 +++++++++++++++++++ 9 files changed, 218 insertions(+), 85 deletions(-) create mode 100644 subgraph/README.md diff --git a/README.md b/README.md index 09f5b2b..8417839 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,46 @@ # NFT Marketplace -The whole NFT Marketplace. +This project consists of a backend, frontend, and subgraph to create a comprehensive NFT marketplace ecosystem. Users can mint, list, buy, and sell NFTs seamlessly. -## Install +## Project Structure -1. `$ cd backend` -2. `$ npm install` -3. `$ cd ../frontend` -4. `$ npm install` -5. `$ cd ../subgraph` -6. `$ npm install` +- **Backend:** Smart contracts for the NFT collection and marketplace. +- **Frontend:** Next.js application for interacting with the smart contracts. +- **Subgraph:** Subgraph using The Graph to gather blockchain data. + +## Features -## Run +- **Mint NFTs:** Create new NFTs and add them to your collection. +- **List NFTs:** List your NFTs for sale in the marketplace. +- **Buy NFTs:** Purchase listed NFTs from other users. +- **Cancel Listings:** Cancel your NFT listings. -1. `$ cd frontend` -2. `$ npm run dev` +## Setup +Follow the setup instructions in each of the subdirectories in this order: `backend`, `subgraph`, and `frontend`. -## Updating the NFT Marketplace contract +## Example workflow when updating contracts -If you want to change anything in the contract `../backend/contracts/NftMarketplaceV2.sol`, you have to follow these steps: +### NftMarketplaceV2 contract +If you want to change anything in the contract `backend/contracts/NftMarketplaceV2.sol`, you have to follow these steps: 1. `$ cd backend` 2. Update the contract 3. `$ npx hardhat deploy --network sepolia --contract NftMarketplaceV2` -4. Copy the contract's deployed address to: `../frontend/utils/deployedContracts.ts` and to `../subgraph/subgraph.yaml` -5. Copy the whole file from `../backend/artifacts/contracts/NftMarketplaceV2.sol/NftMarketplaceV2.json` to `../frontend/contracts` -6. Copy just the ABI array from `../backend/artifacts/contracts/NftMarketplaceV2.sol/NftMarketplaceV2.json` to `../subgraph/abis/NftMarketplaceV2.json` +4. Copy the contract's deployed address to: `frontend/utils/deployedContracts.ts` and to `subgraph/subgraph.yaml` +5. Copy the whole file from `backend/artifacts/contracts/NftMarketplaceV2.sol/NftMarketplaceV2.json` to `frontend/contracts` +6. Copy just the ABI array from `backend/artifacts/contracts/NftMarketplaceV2.sol/NftMarketplaceV2.json` to `subgraph/abis/NftMarketplaceV2.json` 7. `$ cd ../frontend` 8. `$ npm run compile-contract-types` 9. `$ cd ../subgraph` 10. `$ graph codegen` 11. `$ graph build` -12. `$ graph deploy --studio nft-marketplace-sepolia` -13. Update the `graphUrl` in `../frontend/utils/util.ts` +12. `$ graph deploy --studio ` +13. Update the `graphUrl` in `frontend/utils/util.ts` -## Updating the NFT Collection contract +### NftCollection contract -1. Update the `NftCollection.sol` contract in `./backend/contracts`. +1. Update the `NftCollection.sol` contract in `backend/contracts`. 2. Run `$ npx hardhat compile`. -3. Copy the artifact from `./backend/artifacts/contracts/NftCollection.sol/NftCollection.json` to the frontend here: `./frontend/contracts/NftCollection.json`. -4. Copy just the ABI from the artifact from `./backend/artifacts/contracts/NftCollection.sol/NftCollection.json` to the Graph here: `./subgraph/abis/NftCollection.json`. +3. Copy the artifact from `backend/artifacts/contracts/NftCollection.sol/NftCollection.json` to the frontend here: `frontend/contracts/NftCollection.json`. +4. Copy just the ABI from the artifact from `backend/artifacts/contracts/NftCollection.sol/NftCollection.json` to the Graph here: `subgraph/abis/NftCollection.json`. 5. Run `$ npm run compile-contract-types` in the frontend. diff --git a/backend/README.md b/backend/README.md index 263e8ea..b0a2929 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,39 +1,100 @@ -# Advanced Hardhat Project +# NFT Marketplace Hardhat Backend -This project demonstrates an advanced Hardhat use case, integrating other tools commonly used alongside Hardhat in the ecosystem. +This project consists of two main smart contracts: `NftCollection` and `NftMarketplaceV2`. Together, these contracts create a comprehensive NFT ecosystem where users can mint, list, buy, and sell NFTs. The marketplace contract also manages listing fees and interactions between buyers and sellers. -The project comes with smart contracts, tests with 100% coverage, and a script that deploys that contract and verifies it on Etherscan. +## Contracts -Install dependencies: +### 1. NftMarketplaceV2 -```shell -bun install -``` +The `NftMarketplaceV2` contract is a marketplace for listing and trading NFTs. It supports listing fees, buying, and canceling listings. Users can also add their NFT collections to the marketplace. -Fill out the `.env` file with the required information. +#### Features: +- **Listing and Buying:** Users can list their NFTs for sale and buy listed NFTs. +- **Canceling Listings:** Listings can be canceled by the owner of the NFT or the marketplace owner. +- **Listing Fee:** A configurable listing fee is required to list an NFT. +- **Collection Management:** Users can add their deployed NFT collections to the marketplace. -Deploy the contract to the Sepolia network: +#### Events: +- `ItemListed`: Emitted when an NFT is listed for sale. +- `ItemCanceled`: Emitted when a listing is canceled. +- `ItemBought`: Emitted when an NFT is bought. +- `CollectionAdded`: Emitted when a new NFT collection is added to the marketplace. -```shell -bunx hardhat deploy --network sepolia --contract NftMarketplaceV2 -``` +#### Functions: +- `listItem(address _nftAddress, uint256 _tokenId, uint256 _price)`: Lists an NFT for sale with the specified price. +- `cancelListing(address _nftAddress, uint256 _tokenId)`: Cancels a listed NFT. +- `buyItem(address _nftAddress, uint256 _tokenId)`: Buys a listed NFT. +- `addCollection(address _nftAddress)`: Adds an NFT collection to the marketplace. +- `setListingFee(uint256 _newFee)`: Sets a new listing fee. -Also try running some of the following tasks: +### 2. NftCollection -```shell -bunx hardhat accounts -bunx hardhat compile -bunx hardhat clean -bunx hardhat test -bunx hardhat node -bunx hardhat help -bunx hardhat coverage -REPORT_GAS=true bunx hardhat test -bunx eslint '**/*.{js,ts}' -bunx eslint '**/*.{js,ts}' --fix -bunx prettier '**/*.{json,sol,md}' --check -bunx prettier '**/*.{json,sol,md}' --write -bunx solhint 'contracts/**/*.sol' -bunx solhint 'contracts/**/*.sol' --fix -bunx hardhat verify --network sepolia DEPLOYED_CONTRACT_ADDRESS "Hello, Hardhat!" -``` +The `NftCollection` contract is an ERC721 implementation that allows the owner to mint NFTs with specific URIs. It integrates with a marketplace to automatically cancel listings when an NFT is transferred. + +#### Features: +- **Minting:** Only the owner can mint new NFTs. +- **Token URI Management:** Each token has a URI that can be set during minting. +- **Marketplace Integration:** Automatically cancels a listing in the marketplace when the NFT is transferred. +- **ERC721 Extensions:** Supports burnable tokens, enumerable tokens, and URI storage. + +#### Functions: +- `safeMint(address _to, string memory _uri)`: Mints a new token to the specified address with the given URI. +- `_afterTokenTransfer(address _from, address _to, uint256 _tokenId, uint256 amount)`: Checks if the token is listed in the marketplace and cancels the listing if it is. + +## Setup + +To get started with this project, follow these steps: + +### 1. Install dependencies: + Preferably use `bun` to install the dependencies: + ```sh + bun install + ``` + + Or use npm if you prefer: + ```sh + npm install + ``` + + Similary, choose `bunx` or `npx` for the other commands. + +### 2. Set env variables: + Fill out the `.env` file with the required information based on the `.env.example` file. + +### 3. Run tests: + ```sh + npx hardhat test + ``` + + You can also check the test coverage: + ```sh + npx hardhat coverage + ``` + + +### 4. Deploy: + If you want to deploy to your local node, start the node first: + + ```shell + bunx hardhat node + ``` + + Then deploy the contract: + + ```shell + bunx hardhat deploy --network localhost --contract NftMarketplaceV2 + ``` + + Deploy the `NftMarketplaceV2` contract to the blockchain network, for example Sepolia: + + ```shell + bunx hardhat deploy --network sepolia --contract NftMarketplaceV2 + ``` + + **Note 1:** Make sure to note down the contract address for the frontend application. + **Note 2:** The contract will automatically be verified on Etherscan if the API key is provided in the `.env` file. + **Note 3:** There is no need to deploy the `NftCollection` contract, as it is deployed by users on the frontend. + +## Usage + +After deploying the marketplace, you can interact with it through the frontend application. diff --git a/backend/bun.lockb b/backend/bun.lockb index 7f6a84c66b30910849be6c27f8a3e786eaacd8fa..24f90a05fceccf6e20cfc69a60c073be6e14a00c 100644 GIT binary patch delta 79735 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 delta 78038 zcmeFadwkCI5n(=&oJ?_u*@%4PYuD!kA zD7`O#-F;7Y?$G&g)!=E`zEDqrTLA0BKM!TW z|5E`f<7)XDH@({B)IlYgO>$C<8`ZMROmn5AWLqpXz}Y=oJ&OhZMtVR}a;)33ACwVmp*NU8c9I#<^3pxBgVsPJLYqLpfpP+UZb7fd& zrkmwhrXUgvE>$`n%8F%X#>X;7W>Rc?OuWT%v#FXoM=*vwB0}&8~-X^-c?r`Ms`G z&GP?aH8n?kHuQ(7omIm0fNWP{f&~poaiyiZqMWmNi{v1}l`N z1SBNKxH8<(_{8`O%ZhF?+_SA1_3f>4ddNn+(p~mye0qR6HO_&vcb-=~^�A20SYn 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%0DIFQibK5HHgHzVDlu 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 diff --git a/backend/package.json b/backend/package.json index 502675b..bad4144 100644 --- a/backend/package.json +++ b/backend/package.json @@ -2,18 +2,10 @@ "name": "nft-marketplace-backend", "author": "Jan Cibulka", "version": "1.0.0", - "description": "NFT Marketplace using The Graph built as a part of the Lime Academy challenge.", + "description": "A comprehensive NFT ecosystem with smart contracts for minting, listing, buying, and selling NFTs. This project includes an ERC721 NFT collection contract and a marketplace contract.", "url": "https://github.com/jannden/nft-marketplace", - "private": true, "engines": { - "node": ">=16.0.0" - }, - "scripts": { - "test": "npx hardhat test", - "deploy": "npx hardhat deploy --network localhost", - "deploy:sepolia": "npx hardhat deploy --network sepolia", - "interact": "npx hardhat run --network localhost scripts/NftMarketplaceV2.interact.ts", - "interact:sepolia": "npx hardhat run --network sepolia scripts/NftMarketplaceV2.interact.ts" + "node": ">=20.0.0" }, "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.2.3", @@ -27,10 +19,10 @@ "@types/node": "^20.12.13", "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "^7.11.0", - "chai": "^5.1.1", + "chai": "^4.3.10", "dotenv": "^16.4.5", + "eslint": "8.57.0", "es6-promise": "^4.2.8", - "eslint": "^9.3.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.29.1", diff --git a/frontend/.env.example b/frontend/.env.example index 73e378c..e8d7fe7 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -1,5 +1,5 @@ // This can be used in .env.developement and .env.production -NEXT_PUBLIC_SERVER= +NEXT_PUBLIC_SERVER=http://localhost:4001 INFURA_IPFS_ID= INFURA_IPFS_SECRET= \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md index c6093fb..564086e 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,17 +1,38 @@ +# NFT Marketplace Next.js Frontend + +This is a Next.js frontend application for interacting with the NFT Marketplace and NFT Collection smart contracts. It allows users to mint, list, buy, and sell NFTs seamlessly. + ## Features -- Separate packages from [ethers.js](https://docs.ethers.io/v5/) for improved tree-shaking, often only ethers Contracts -- Hooks-first approach to fetching and caching data from Contracts and memoization for performance with [SWR](https://swr.vercel.app) -- [web3-react](https://github.com/NoahZinsmeister/web3-react) for ease of connecting to Web3 providers with a solid API -- Auto-generates types for the contract ABIs in the `/contracts` folder via [TypeChain](https://github.com/ethereum-ts/TypeChain) -- MetaMask connection -- WalletConnect connection +- **Mint NFTs:** Create new NFTs and add them to your collection. +- **List NFTs:** List your NFTs for sale in the marketplace. +- **Buy NFTs:** Purchase listed NFTs from other users. +- **Cancel Listings:** Cancel your NFT listings. + +## Installation + +### 1. Install dependencies: +Preferably use `bun` to install the dependencies: +```sh +bun install +``` -### Auto Contract Type Generation +### 2. Configure the Environment: +Create a `.env.development` and `.env.production` based on the `.env.example` file. Fill in the required values. -**Note**: After adding in your new contract ABIs (in JSON format) to the `/contracts` folder, run `bun run compile-contract-types` to generate the types. +### 3. Update the Contract Addresses: +Follow the instructions in the backend README to compile and deploy the NFT Marketplace contract. + +Update the contract address of NftMarketplaceV2 in `utils/deployedContracts.ts` with the address of your deployed contract. + +Add the full contract ABIs (in JSON format) to the `contracts` folder. You can find the ABIs in the `artifacts` folder of the `../backend` project. + +### 4. Compile Types from ABIs: +```sh +bun run compile-contract-types +``` -You can import these types when declaring a new Contract hook. The types generated show the function params and return types of your functions, among other helpful types. +You can import these types so that you know the function params and return types of the methods, among other helpful things. For example: ```ts import MY_CONTRACT_ABI from "../contracts/MY_CONTRACT.json"; @@ -23,12 +44,14 @@ export default function useMyContract() { } ``` -## Getting Started +### 5. Update the Graph URL: +Follow the instructions in the subgraph README to deploy the subgraph. +Update the `graphUrl` in `utils/util.ts` with the URL of your deployed subgraph. -First, run the development server: +## Running the Application -```bash -bun dev +```sh +bun run dev ``` Open [http://localhost:4001](http://localhost:4001) with your browser to see the result. \ No newline at end of file diff --git a/frontend/bun.lockb b/frontend/bun.lockb index c4158ac34a06df677ab50c7294fdda5729c6faca..9023ee18cebc315d73d03268638fc04b04b92943 100644 GIT binary patch delta 4828 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 delta 1736 zcmX|?U2Icj7{||fkK1AyEz*6ludeM_H$J+u!Nxwsi5oi6VJ0#(@?nH&&@EfBZpnyc z3W`F=9FjLgOdv)QuVhpyfe@CgA~%N33llGli6LrY^a}0_`g_I`pY*r$Kfm*w^FHl4 zYws)sa_0h5@rDDv1H+ll-t#}s|8n%?&tcOR%h=<2;Ujl%T-&+(+P#^tZ+ni^;Ku_Y z)3;}4JQ2*474hdvZ2OtaiQL|xTadY)YYb-o`E%ii>}PXsEOBZ+R(tuL`*zAVwZ|-; z-L=oghfHVB{eK^n$TkkSY)c+2@c+J?QK+t6dt^7DuEWj@nc$Nn3n5Mo3uTj zJg)9Bbp^N`(nNJxci05ekL#g_Q5PO^99dwqIv@E2PU;DDOUNhHb>nzBg)pX*ZPC7^ zxLtCPdQzRAoKyD{TTV$k0pu4t=T>c8hWizyo>BJ*`AZg-L7!E(oO~K5L-nZ(lD{L% zV%yltTt#q;EY;6eVllM1X;F@|9kX~J$gMie3+hU78`bSlSB860-GI6kxUck+*@=@_ z4s-O$P%mp=1^HWbyV5Evk>8W0cB`u*|FviwN1h>BuNwMw;l1iYxGr_C;CMMTa37>z z)xI!!MhD!dE*(K$Ldx{}k-VHJWYoQ;jkUOM^yJsIZzb-s_8m}HhYK@|yz@8p+!(n> z2OLsYkIQqp|5C$xaszpe3(BM;+PI2*16Rv-RNZRw6`Tx^RJVqFT^Bj1ZY?ff-CH<$ z7UEEVlL5vI>&x**C{#JFjS1W=PA)v5ZXLM-Cl`JP$IEGgN_B@3M5h_5)J>{ek1N5+ z0PpI#8|3{LA!UFg+So#theifCs;-qR4~@9@)omnK<7BZ9)U}aIakAJkb?s!iC34*l z)pe*Vk&Aq!azvgA>g=%fCrzDAB+a38H(xG2umy4)oaaglAYWOfPzEcY94ep^s-PM| zPy=CzKon|WCDcI->Y)Kv!D?6oYatGeo)dBsgmusa&9ELeKnt{b*_RHQtM2kQ*cpOh z7=itstxlPERX_Q8=!0$03*FEIo9$@IG`q#w^C|PGYeqfWK4v2MPjhIimmM54SG~L> zJCn9y!bIKAv%M20Rn4n@jD@ zX>&ZkE#4GQIN5f7^-=GzZ&qdMcJ@-#yEtoq Y``znUa#4SY_(igTq^Ysb{o#G`AJ(kLV*mgE diff --git a/frontend/package.json b/frontend/package.json index ac14ee5..0943758 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,9 +2,11 @@ "name": "nft-marketplace-frontend", "author": "Jan Cibulka", "version": "1.0.0", - "description": "NFT Marketplace using The Graph built as a part of the Lime Academy challenge.", + "description": "A Next.js frontend for interacting with the NFT Marketplace and NFT Collection smart contracts, allowing users to mint, list, buy, and sell NFTs seamlessly.", "url": "https://github.com/jannden/nft-marketplace", - "private": true, + "engines": { + "node": ">=20.0.0" + }, "scripts": { "dev": "next dev -p 4001", "build": "next build && next export", @@ -42,13 +44,10 @@ "@typechain/ethers-v5": "^11.1.2", "@types/node": "^20.12.13", "@types/react": "^18.3.3", - "eslint": "^9.2.0", + "eslint": "^8.57.0", "eslint-config-next": "^14.2.3", "ethers": "^5.7.2", "typechain": "^8.3.2", "typescript": "^5.4.5" - }, - "trustedDependencies": [ - "protobufjs" - ] + } } \ No newline at end of file diff --git a/subgraph/README.md b/subgraph/README.md new file mode 100644 index 0000000..d2897ee --- /dev/null +++ b/subgraph/README.md @@ -0,0 +1,55 @@ +# NFT Marketplace Subgraph Database + +This subgraph uses The Graph to gather data about the blockchain for the NFT Marketplace. + +## Setup + +### Installation +Install the dependencies with yarn: + ```sh + yarn install + ``` + +### Configuration + +1. **Update Marketplace Address:** + Modify `subgraph/subgraph.yaml` with the deployed marketplace address (NftMarketplaceV2). + +2. **Copy ABI:** +Copy just the ABI array from `../backend/artifacts/contracts/NftMarketplaceV2.sol/NftMarketplaceV2.json` to `subgraph/abis/NftMarketplaceV2.json`. Important: copy just the ABI array, not the whole file even though the filenames are the same. + +Do the same for the NftCollection contract. + +### Deploying the Subgraph + +If you don't have a subgraph already set up, you just need to install the Graph CLI: +```sh +npm install -g @graphprotocol/graph-cli +``` + +And authenticate: +```sh +graph init --studio +``` + +Once that's out of the way, you can deploy the subgraph: + + +1. **Generate Code:** + ```sh + graph codegen + ``` + +2. **Build the Subgraph:** + ```sh + graph build + ``` + +3. **Deploy the Subgraph:** + ```sh + graph deploy --studio + ``` + +### Frontend Configuration + +Update the `graphUrl` in `../frontend/utils/util.ts` with your deployed subgraph URL. \ No newline at end of file