├── .gitattributes
├── .gitignore
├── README.md
├── package-lock.json
├── package.json
├── public
├── favicon.png
├── img
│ ├── avax.png
│ ├── image-62.png
│ ├── image.jpg
│ ├── images (2).jpg
│ ├── images (3).jpg
│ ├── images.jpg
│ ├── item.jpg
│ ├── like_filled.png
│ ├── like_outline.png
│ ├── store-front.png
│ └── usdt.png
├── index.html
├── logo.png
├── logo192.png
├── logo512.png
├── logo_kadena.jpeg
├── logo_kdasea.png
├── manifest.json
└── robots.txt
└── src
├── App.css
├── App.js
├── App.test.js
├── abi
├── marketplace.abi.json
└── nft.abi.json
├── actionType
├── auth.actionTypes.js
└── walletconnect.actionTypes.js
├── actions
├── auth.actions.js
└── walletconnect.actions.js
├── api
├── api.js
├── index.js
└── pinata.js
├── components
├── AfterLoginFooter.jsx
├── AfterLoginHeader.jsx
├── BootstrapTooltip
│ └── index.js
├── Connectors.js
├── Drop.jsx
├── Footer.js
├── Header.js
├── Item.js
├── Loading.js
├── Nft.jsx
├── PriceInput.js
├── ProfileItem.js
├── Tab
│ ├── Top.jsx
│ └── Trending.jsx
├── WalletProvider.js
├── admin.js
├── assets
│ ├── avax.png
│ ├── close.svg
│ ├── error.svg
│ ├── info.svg
│ ├── like_filled.png
│ ├── like_outline.png
│ ├── nft_loading.json
│ ├── plus.svg
│ ├── success.svg
│ ├── upload.png
│ ├── usdt.png
│ └── warning.svg
├── explorer
│ ├── ExploreCategories.jsx
│ ├── LGBTQIA.jsx
│ ├── NFT101.jsx
│ ├── NotableCollections.jsx
│ ├── TopCollectorBuysToday.jsx
│ ├── TrendingInArt.jsx
│ ├── TrendingInGaming.jsx
│ ├── TrendingInMemberships.jsx
│ ├── TrendingInMusic.jsx
│ ├── TrendingInPFPs.jsx
│ └── TrendingInPhotography.jsx
├── profile.css
└── toast
│ ├── index.js
│ └── styles.module.scss
├── constants
├── errors.js
└── ipfs.constants.js
├── contract
├── abi.js
├── factory.js
├── index.js
└── sales.js
├── errors.js
├── hooks
└── useContract.js
├── images
├── 2Pac Greatest Hits.jpg
├── All Eyez On Me.jpg
├── Dire Straits Brothers in Arms.jpg
├── DownArrow.svg
├── DownIcon.svg
├── FaceBook.svg
├── Filter.svg
├── HIcon.PNG
├── HeaderIcon.PNG
├── Instagram.svg
├── LOGO.svg
├── Notification.svg
├── Private Investigation.jpg
├── Search.svg
├── Twitter.svg
├── UpIcon.svg
├── Upload.svg
├── apple.svg
├── back.svg
├── banner.svg
├── copyIcon.PNG
├── eckoWallet.jpg
├── front.webp
├── googleIcon.svg
├── loveIcon.svg
├── metamask.svg
├── profile.dev.jpeg
├── profile.jpg
├── store-front.png
├── storeFront.PNG
└── storeFront.dev.PNG
├── index.css
├── index.js
├── logo.svg
├── pages
├── CreateAlbum.jsx
├── DetailPage.js
├── LoginPage.jsx
├── MainPage.js
├── MintPage.jsx
├── ProfilePage.js
├── ProfilePage2.jsx
├── SellPage.js
├── StoreFrontPage.jsx
├── detail.css
├── mint.css
├── mint
│ ├── MintPage.jsx
│ ├── index-test.jsx
│ ├── index.jsx
│ └── styles.module.scss
├── profile.css
├── sell.css
├── styles.module.css
└── styles.module.scss
├── reducers
├── auth.reducers.js
├── connectwallet.reducers.js
└── index.js
├── reportWebVitals.js
├── setupTests.js
├── stores
└── reduxStore.js
├── utils.js
└── utils
├── index.js
├── sc.interaction.js
└── wallet.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional stylelint cache
58 | .stylelintcache
59 |
60 | # Microbundle cache
61 | .rpt2_cache/
62 | .rts2_cache_cjs/
63 | .rts2_cache_es/
64 | .rts2_cache_umd/
65 |
66 | # Optional REPL history
67 | .node_repl_history
68 |
69 | # Output of 'npm pack'
70 | *.tgz
71 |
72 | # Yarn Integrity file
73 | .yarn-integrity
74 |
75 | # dotenv environment variable files
76 | .env
77 | .env.development.local
78 | .env.test.local
79 | .env.production.local
80 | .env.local
81 |
82 | # parcel-bundler cache (https://parceljs.org/)
83 | .cache
84 | .parcel-cache
85 |
86 | # Next.js build output
87 | .next
88 | out
89 |
90 | # Nuxt.js build / generate output
91 | .nuxt
92 | dist
93 | build
94 |
95 | # Gatsby files
96 | .cache/
97 | # Comment in the public line in if your project uses Gatsby and not Next.js
98 | # https://nextjs.org/blog/next-9-1#public-directory-support
99 | # public
100 |
101 | # vuepress build output
102 | .vuepress/dist
103 |
104 | # vuepress v2.x temp and cache directory
105 | .temp
106 | .cache
107 |
108 | # Serverless directories
109 | .serverless/
110 |
111 | # FuseBox cache
112 | .fusebox/
113 |
114 | # DynamoDB Local files
115 | .dynamodb/
116 |
117 | # TernJS port file
118 | .tern-port
119 |
120 | # Stores VSCode versions used for testing VSCode extensions
121 | .vscode-test
122 |
123 | # yarn v2
124 | .yarn/cache
125 | .yarn/unplugged
126 | .yarn/build-state.yml
127 | .yarn/install-state.gz
128 | .pnp.*
129 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `npm start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
13 |
14 | The page will reload when you make changes.\
15 | You may also see any lint errors in the console.
16 |
17 | ### `npm test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `npm run build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `npm run eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!**
35 |
36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
39 |
40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `npm run build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "rightsmint.com",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@emotion/react": "^11.8.2",
7 | "@emotion/styled": "^11.8.1",
8 | "@ethersproject/bignumber": "^5.6.0",
9 | "@ethersproject/contracts": "^5.6.0",
10 | "@ethersproject/providers": "^5.6.2",
11 | "@ethersproject/units": "^5.6.0",
12 | "@iconify/icons-ant-design": "^1.1.0",
13 | "@iconify/icons-eva": "^1.1.0",
14 | "@iconify/icons-ic": "^1.1.10",
15 | "@iconify/react": "^3.0.1",
16 | "@material-ui/core": "^4.12.4",
17 | "@material-ui/icons": "^4.11.3",
18 | "@mui/core": "^5.0.0-alpha.54",
19 | "@mui/icons-material": "^5.11.16",
20 | "@mui/lab": "^5.0.0-alpha.68",
21 | "@mui/material": "^5.5.3",
22 | "@mui/styled-engine": "^5.5.2",
23 | "@mui/system": "^5.5.3",
24 | "@testing-library/jest-dom": "^5.16.3",
25 | "@testing-library/react": "^12.1.4",
26 | "@testing-library/user-event": "^13.5.0",
27 | "@web3-react/core": "^6.1.9",
28 | "@web3-react/injected-connector": "^6.0.7",
29 | "axios": "^0.26.1",
30 | "bignumber.js": "^9.0.2",
31 | "classnames": "^2.3.1",
32 | "ethers": "^5.6.2",
33 | "form-data": "^4.0.0",
34 | "lottie-react": "^2.2.1",
35 | "react": "^17.0.2",
36 | "react-dom": "^17.0.2",
37 | "react-dropdown-select": "^4.7.4",
38 | "react-dropzone": "^12.0.4",
39 | "react-hot-toast": "^2.2.0",
40 | "react-loading-skeleton": "^3.0.3",
41 | "react-redux": "^7.2.8",
42 | "react-router": "^6.3.0",
43 | "react-router-dom": "^6.2.2",
44 | "react-scripts": "5.0.0",
45 | "react-slick": "^0.29.0",
46 | "react-spinners": "^0.11.0",
47 | "recharts": "^2.1.9",
48 | "redux-logger": "^3.0.6",
49 | "redux-thunk": "^2.4.1",
50 | "sass": "^1.49.11",
51 | "sass-loader": "^12.6.0",
52 | "slick-carousel": "^1.8.1",
53 | "styled-components": "^5.3.5",
54 | "sweetalert2": "^11.4.7",
55 | "web-vitals": "^2.1.4"
56 | },
57 | "scripts": {
58 | "start": "react-scripts start",
59 | "build": "react-scripts build",
60 | "test": "react-scripts test",
61 | "eject": "react-scripts eject"
62 | },
63 | "eslintConfig": {
64 | "extends": [
65 | "react-app",
66 | "react-app/jest"
67 | ]
68 | },
69 | "browserslist": {
70 | "production": [
71 | ">0.2%",
72 | "not dead",
73 | "not op_mini all"
74 | ],
75 | "development": [
76 | "last 1 chrome version",
77 | "last 1 firefox version",
78 | "last 1 safari version"
79 | ]
80 | },
81 | "engines": {
82 | "node": "16.x"
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/favicon.png
--------------------------------------------------------------------------------
/public/img/avax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/avax.png
--------------------------------------------------------------------------------
/public/img/image-62.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/image-62.png
--------------------------------------------------------------------------------
/public/img/image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/image.jpg
--------------------------------------------------------------------------------
/public/img/images (2).jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/images (2).jpg
--------------------------------------------------------------------------------
/public/img/images (3).jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/images (3).jpg
--------------------------------------------------------------------------------
/public/img/images.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/images.jpg
--------------------------------------------------------------------------------
/public/img/item.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/item.jpg
--------------------------------------------------------------------------------
/public/img/like_filled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/like_filled.png
--------------------------------------------------------------------------------
/public/img/like_outline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/like_outline.png
--------------------------------------------------------------------------------
/public/img/store-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/store-front.png
--------------------------------------------------------------------------------
/public/img/usdt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/img/usdt.png
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 |
28 | KdaSea
29 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/logo.png
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/logo512.png
--------------------------------------------------------------------------------
/public/logo_kadena.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/logo_kadena.jpeg
--------------------------------------------------------------------------------
/public/logo_kdasea.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/public/logo_kdasea.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .header-container {
2 | height: 10vh;
3 | background-color: aquamarine;
4 | }
5 |
6 | .nft-item {
7 | height: 25rem;
8 | border-radius: 10px;
9 | overflow: hidden;
10 | }
11 |
12 | .item-text-title {
13 | font-size: 20px;
14 | font-weight: bold;
15 | color: black;
16 | }
17 |
18 | .item-text-type {
19 | font-size: 12px;
20 | }
21 |
22 | .item-text-price {
23 | font-size: 15px;
24 | }
25 |
26 | .item-text-like {
27 | font-size: 18px;
28 | }
29 |
30 | .item-text-buy {
31 | font-size: 17px;
32 | font-weight: bold;
33 | color: rgb(32, 129, 226);
34 | cursor: pointer;
35 | }
36 |
37 | .text-button-connect {
38 | font-size: 16px;
39 | cursor: pointer;
40 | }
41 |
42 | .img-crypto {
43 | height: 14px;
44 | width: 14px;
45 | }
46 |
47 | .img-like {
48 | height: 16px;
49 | width: 16px;
50 | cursor: pointer;
51 | }
52 |
53 | .footer-container {
54 | background-color: rgb(24, 104, 183);
55 | font-size: 20px;
56 | }
57 |
58 | .button-container {
59 | height: 24px;
60 | }
61 |
62 | .button-address {
63 | cursor: pointer;
64 | }
65 |
66 | .main-container {
67 | min-height: calc(100vh - 122px);
68 | }
69 |
70 | .btn-login:hover {
71 | opacity: 0.8;
72 | transition: all 0.4s;
73 | }
74 |
75 | .dark {
76 | background-color: #282828;
77 | }
78 |
79 |
80 |
81 | /* Opensea css */
82 |
83 | .header {
84 | --transition-curve: cubic-bezier(0.05, 0, 0.2, 1);
85 | box-shadow: rgba(229, 232, 235, 0) 0px 1px 0px 0px;
86 | max-width: 100vw;
87 | height: 72px;
88 | top: 0px;
89 | position: sticky;
90 | z-index: 150;
91 | transition: top 0.5s var(--transition-curve),
92 | background-color 0.2s var(--transition-curve),
93 | box-shadow 0.2s var(--transition-curve),
94 | color 0.2s var(--transition-curve);
95 | background-color: transparent;
96 | }
97 |
98 | .searchInput:focus {
99 | border: none;
100 | outline: none;
101 | }
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import "./App.css";
2 | import React, { useState, useEffect } from "react";
3 | import {
4 | BrowserRouter as Router,
5 | Routes,
6 | Route,
7 | Navigate,
8 | useNavigate,
9 | } from "react-router-dom";
10 | import Loading from "./components/Loading";
11 | import Header from "./components/Header";
12 | import Footer from "./components/Footer";
13 | import MainPage from "./pages/MainPage";
14 | import { useWeb3React } from "@web3-react/core";
15 | import { injected } from "./components/Connectors";
16 | import Swal from "sweetalert2";
17 | import DetailPage from "./pages/DetailPage";
18 | import MintPage from "./pages/mint";
19 | import CreateAlbum from "./pages/CreateAlbum";
20 | import ProfilePage from "./pages/ProfilePage";
21 | import SellPage from "./pages/SellPage";
22 | import { login } from "./api/api";
23 | import LoginPage from "./pages/LoginPage";
24 | import AfterLoginHeader from "./components/AfterLoginHeader";
25 | import StoreFrontPage from "./pages/StoreFrontPage";
26 | import AferLoginFooter from "./components/AfterLoginFooter";
27 | import ProfilePage2 from "./pages/ProfilePage2";
28 | import { createTheme } from "@mui/material";
29 | import { MuiThemeProvider } from "@material-ui/core";
30 | import { pink } from "@mui/material/colors";
31 |
32 | function App() {
33 | const { active, account, library, activate } = useWeb3React();
34 | const [isLoaded, setLoaded] = useState(false);
35 | const [conn, setConn] = useState(false);
36 |
37 | useEffect(() => {
38 | const timer = setTimeout(() => {
39 | setLoaded(true);
40 | }, 5000);
41 |
42 | return () => clearTimeout(timer);
43 | }, []);
44 |
45 | useEffect(() => {
46 | if (active) setConn(true);
47 | else setConn(false);
48 | }, [active]);
49 |
50 | useEffect(() => {
51 | if (conn) {
52 | login(account).then((res) => {
53 | console.log(res);
54 | });
55 | }
56 | }, [conn]);
57 |
58 | const [mode, setMode] = useState("light");
59 |
60 | if (!isLoaded) return ;
61 |
62 | return (
63 |
64 |
65 | {/* {conn?():()} */}
66 |
67 |
68 | }
72 | />
73 | } />
74 | }
78 | />
79 | } />
80 |
81 | {account ? (
82 |
86 | }
87 | />
88 | ) : (
89 | } />
90 | )}
91 |
92 |
98 | ) : (
99 |
100 | )
101 | }
102 | />
103 | :
108 | }
109 | />
110 |
111 |
116 | ) : (
117 |
118 | )
119 | }
120 | />
121 |
122 |
123 |
128 | ) : (
129 |
130 | )
131 | }
132 | />
133 |
134 |
135 |
136 |
137 |
138 | );
139 | }
140 |
141 | export default App;
142 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/src/abi/marketplace.abi.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "constant": false,
4 | "inputs": [
5 | {
6 | "name": "_tokenId",
7 | "type": "uint256"
8 | },
9 | {
10 | "name": "_quoteToken",
11 | "type": "address"
12 | },
13 | {
14 | "name": "_price",
15 | "type": "uint256"
16 | }
17 | ],
18 | "name": "createOrderForSale",
19 | "outputs": [],
20 | "payable": false,
21 | "stateMutability": "nonpayable",
22 | "type": "function"
23 | },
24 | {
25 | "constant": false,
26 | "inputs": [
27 | {
28 | "name": "_orderId",
29 | "type": "uint256"
30 | }
31 | ],
32 | "name": "buyForOrder",
33 | "outputs": [],
34 | "payable": true,
35 | "stateMutability": "payable",
36 | "type": "function"
37 | },
38 | {
39 | "name": "OrderForSale",
40 | "inputs": [
41 | {
42 | "name": "_seller",
43 | "type": "address"
44 | },
45 | {
46 | "name": "_orderId",
47 | "type": "uint256",
48 | "indexed": true
49 | },
50 | {
51 | "name": "_tokenId",
52 | "type": "uint256",
53 | "indexed": true
54 | },
55 | {
56 | "name": "_quoteToken",
57 | "type": "address",
58 | "indexed": true
59 | },
60 | {
61 | "name": "_price",
62 | "type": "uint256"
63 | }
64 | ],
65 | "type": "event"
66 | },
67 | {
68 | "name": "OrderFilled",
69 | "inputs": [
70 | {
71 | "name": "_seller",
72 | "type": "address"
73 | },
74 | {
75 | "name": "_buyer",
76 | "type": "address",
77 | "indexed": true
78 | },
79 | {
80 | "name": "_orderId",
81 | "type": "uint256",
82 | "indexed": true
83 | },
84 | {
85 | "name": "_quoteToken",
86 | "type": "address",
87 | "indexed": true
88 | },
89 | {
90 | "name": "_price",
91 | "type": "uint256"
92 | }
93 | ],
94 | "type": "event"
95 | }
96 | ]
--------------------------------------------------------------------------------
/src/abi/nft.abi.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "constant": false,
4 | "inputs": [
5 | {
6 | "name": "uri",
7 | "type": "string"
8 | }
9 | ],
10 | "name": "mint",
11 | "outputs": [
12 | {
13 | "name": "tokenId",
14 | "type": "uint256"
15 | }
16 | ],
17 | "payable": false,
18 | "stateMutability": "nonpayable",
19 | "type": "function"
20 | },
21 | {
22 | "constant": false,
23 | "inputs": [
24 | {
25 | "name": "uri",
26 | "type": "string[]"
27 | }
28 | ],
29 | "name": "mintBatch",
30 | "outputs": [
31 | {
32 | "name": "tokenIds",
33 | "type": "uint256[]"
34 | }
35 | ],
36 | "payable": false,
37 | "stateMutability": "nonpayable",
38 | "type": "function"
39 | },
40 | {
41 | "constant": false,
42 | "inputs": [
43 | {
44 | "name": "to",
45 | "type": "address"
46 | },
47 | {
48 | "name": "tokenId",
49 | "type": "uint256"
50 | }
51 | ],
52 | "name": "approve",
53 | "outputs": [],
54 | "payable": false,
55 | "stateMutability": "nonpayable",
56 | "type": "function"
57 | },
58 | {
59 | "name": "Transfer",
60 | "inputs": [
61 | {
62 | "name": "from",
63 | "type": "address",
64 | "indexed": true
65 | },
66 | {
67 | "name": "to",
68 | "type": "address",
69 | "indexed": true
70 | },
71 | {
72 | "name": "tokenId",
73 | "type": "uint256",
74 | "indexed": true
75 | }
76 | ],
77 | "type": "event"
78 | },
79 | {
80 | "name": "Approval",
81 | "inputs": [
82 | {
83 | "name": "owner",
84 | "type": "address",
85 | "indexed": true
86 | },
87 | {
88 | "name": "approved",
89 | "type": "address",
90 | "indexed": true
91 | },
92 | {
93 | "name": "tokenId",
94 | "type": "uint256",
95 | "indexed": true
96 | }
97 | ],
98 | "type": "event"
99 | }
100 | ]
--------------------------------------------------------------------------------
/src/actionType/auth.actionTypes.js:
--------------------------------------------------------------------------------
1 | export const AuthConstants = {
2 | PROFILE_GET_START: 'PROFILE_GET_START',
3 | PROFILE_GET_SUCCESS: 'PROFILE_GET_SUCCESS',
4 | PROFILE_GET_FAILED: 'PROFILE_GET_FAILED',
5 | SIGN_OUT: 'SIGN_OUT',
6 | };
7 |
--------------------------------------------------------------------------------
/src/actionType/walletconnect.actionTypes.js:
--------------------------------------------------------------------------------
1 | export const WalletConnectConstants = {
2 | WALLETCONNECTED: 'WALLETCONNECTED',
3 | WALLETDISCONNECTED: 'WALLETDISCONNECTED',
4 | };
5 |
--------------------------------------------------------------------------------
/src/actions/auth.actions.js:
--------------------------------------------------------------------------------
1 | import { AuthConstants } from '../actionType/auth.actionTypes';
2 |
3 | const AuthActions = {
4 | fetchStart,
5 | fetchSuccess,
6 | fetchFailed,
7 | signOut,
8 | };
9 |
10 | function fetchStart() {
11 | return dispatch => {
12 | dispatch(_fetchStart());
13 | };
14 | }
15 |
16 | const _fetchStart = () => {
17 | return {
18 | type: AuthConstants.PROFILE_GET_START,
19 | };
20 | };
21 |
22 | function fetchSuccess(user) {
23 | return dispatch => {
24 | dispatch(_fetchSuccess(user));
25 | };
26 | }
27 |
28 | const _fetchSuccess = user => {
29 | return {
30 | type: AuthConstants.PROFILE_GET_SUCCESS,
31 | payload: user,
32 | };
33 | };
34 |
35 | function fetchFailed() {
36 | return dispatch => {
37 | dispatch(_fetchFailed());
38 | };
39 | }
40 |
41 | const _fetchFailed = () => {
42 | return {
43 | type: AuthConstants.PROFILE_GET_FAILED,
44 | };
45 | };
46 |
47 | function signOut() {
48 | return dispatch => {
49 | dispatch(_signOut());
50 | };
51 | }
52 |
53 | const _signOut = () => {
54 | return {
55 | type: AuthConstants.SIGN_OUT,
56 | };
57 | };
58 |
59 | export default AuthActions;
60 |
--------------------------------------------------------------------------------
/src/actions/walletconnect.actions.js:
--------------------------------------------------------------------------------
1 | import { WalletConnectConstants } from '../actionType/walletconnect.actionTypes';
2 |
3 | const WalletConnectActions = {
4 | connectWallet,
5 | disconnectWallet,
6 | };
7 |
8 | function connectWallet(authToken, isModerator) {
9 | return dispatch => {
10 | dispatch(_connectWallet(authToken, isModerator));
11 | };
12 | }
13 |
14 | const _connectWallet = (authToken, isModerator) => {
15 | return {
16 | type: WalletConnectConstants.WALLETCONNECTED,
17 | token: authToken,
18 | isModerator,
19 | };
20 | };
21 |
22 | function disconnectWallet() {
23 | return dispatch => {
24 | dispatch(_disconnectWallet());
25 | };
26 | }
27 |
28 | const _disconnectWallet = () => {
29 | return {
30 | type: WalletConnectConstants.WALLETDISCONNECTED,
31 | };
32 | };
33 |
34 | export default WalletConnectActions;
35 |
--------------------------------------------------------------------------------
/src/api/api.js:
--------------------------------------------------------------------------------
1 | import Axios from 'axios';
2 |
3 | Axios.defaults.baseURL = 'https://wow-marketplace.herokuapp.com/api/';
4 |
5 | export async function getUserData(addr) {
6 | const result = await Axios.get('/users/current', {
7 | params: {
8 | address: addr
9 | }
10 | }).then(
11 | async function(response) {
12 | return response.data;
13 | }
14 | ).catch(err => {
15 | console.log(err);
16 | return null;
17 | });
18 |
19 | return result;
20 | }
21 |
22 | export async function login(addr) {
23 | const result = await Axios.post('/users/login', {
24 | address: addr
25 | }).then(
26 | async function(response) {
27 | return response.data;
28 | }
29 | ).catch(err => {
30 | console.log(err);
31 | return null;
32 | });
33 |
34 | return result;
35 | }
36 |
37 | export async function getTokenData(tokenIds) {
38 | if(tokenIds.length > 1) {
39 | const result = await Axios.post('/nfts/tokens', {
40 | tokenIds: tokenIds
41 | }).then(
42 | async function(response) {
43 | return response.data;
44 | }
45 | ).catch(err => {
46 | console.log(err);
47 | return null;
48 | });
49 |
50 | return result;
51 | }
52 | if(tokenIds.length < 2) {
53 | const result = await Axios.post('/nfts/token', {
54 | tokenId: tokenIds[0]
55 | }).then(
56 | async function(response) {
57 | const resData = [];
58 | resData.push(response.data);
59 | return resData;
60 | }
61 | ).catch(err => {
62 | console.log(err);
63 | return null;
64 | });
65 |
66 | return result;
67 | }
68 | }
69 |
70 | export async function createNft(tokenId, tokenUri, account) {
71 | const result = await Axios.post('/nfts/create', {
72 | tokenId: tokenId,
73 | tokenUri: tokenUri,
74 | operator: account
75 | }).then(
76 | async function(response) {
77 | return response.data;
78 | }
79 | ).catch(err => {
80 | console.log(err);
81 | return null;
82 | });
83 |
84 | return result;
85 | }
86 |
87 | export async function createOrder(orderId, tokenId, quoteToken, price, seller) {
88 | const result = await Axios.post('/orders/create', {
89 | id: orderId,
90 | tokenId: tokenId,
91 | quoteToken: quoteToken,
92 | price: price,
93 | seller: seller
94 | }).then(
95 | async function(response) {
96 | return response.data;
97 | }
98 | ).catch(err => {
99 | console.log(err);
100 | return null;
101 | });
102 |
103 | return result;
104 | }
105 |
106 | export async function getAllOrders() {
107 | const result = await Axios.get('/orders/allOpenOrders').then(res => {
108 | return res.data;
109 | }).catch(err => {
110 | console.log(err);
111 | return null;
112 | });
113 |
114 | return result;
115 | }
116 |
117 | export async function getOrder(orderId) {
118 | const result = await Axios.post('/orders/order', {
119 | id: orderId
120 | }).then(res => {
121 | return res.data;
122 | }).catch(err => {
123 | console.log(err);
124 | return null;
125 | });
126 |
127 | return result;
128 | }
129 |
130 | export async function addToLike(tokenId, operator) {
131 | const result = await Axios.post('/nfts/like', {
132 | tokenId: tokenId,
133 | operator: operator
134 | }).then(
135 | async function(response) {
136 | return response.data;
137 | }
138 | ).catch(err => {
139 | console.log(err);
140 | return null;
141 | });
142 |
143 | return result;
144 | }
145 |
146 | export async function buyOrder(orderId, buyer) {
147 | const result = await Axios.post('/orders/buy', {
148 | id: orderId,
149 | buyer: buyer
150 | }).then(
151 | async function(response) {
152 | return response.data;
153 | }
154 | ).catch(err => {
155 | console.log(err);
156 | return null;
157 | });
158 |
159 | return result;
160 | }
161 |
--------------------------------------------------------------------------------
/src/api/pinata.js:
--------------------------------------------------------------------------------
1 | import Axios from 'axios';
2 | import FormData from 'form-data';
3 |
4 | const url_file = 'https://api.pinata.cloud/pinning/pinFileToIPFS';
5 | const url_json = 'https://api.pinata.cloud/pinning/pinJSONToIPFS'
6 | const API_KEY = '4faa835f88b04bfff75c';
7 | const API_SECRET = '83ee05be67b55a1ff93c75dd81162ef872a97b6362c4f074e00489c2ab0484cd';
8 |
9 | export async function uploadImageToPinata(data) {
10 | const formData = new FormData();
11 | formData.append('file', data);
12 | const result = await Axios.post(url_file, formData, {
13 | maxContentLength: 'Infinity',
14 | headers: {
15 | 'Content-Type': `multipart/form-data;boundary=${formData._boundary}`,
16 | 'pinata_api_key': API_KEY,
17 | 'pinata_secret_api_key': API_SECRET
18 | }
19 | }).then(
20 | async function(response) {
21 | return response.data;
22 | }
23 | ).catch(err => {
24 | console.log(err);
25 | return null;
26 | });
27 |
28 | return result;
29 | }
30 |
31 | export async function uploadMetaDataToPinata(data) {
32 | const result = await Axios.post(url_json, data, {
33 | headers: {
34 | 'pinata_api_key': API_KEY,
35 | 'pinata_secret_api_key': API_SECRET
36 | }
37 | }).then(
38 | async function(response) {
39 | return response.data;
40 | }
41 | ).catch(err => {
42 | console.log(err);
43 | return null;
44 | });
45 |
46 | return result;
47 | }
48 |
--------------------------------------------------------------------------------
/src/components/AfterLoginFooter.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import styled from "styled-components";
3 | // import HeaderIcon from "../images/HeaderIcon.PNG";
4 | import InstagramIcon from "../images/Instagram.svg";
5 | import TwitterIcon from "../images/Twitter.svg";
6 | import FaceBookIcon from "../images/FaceBook.svg";
7 |
8 | function AfterLoginFooter(props) {
9 | return (
10 |
11 |
12 |
13 |
KdaSea
14 |
15 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
16 | eiusmod tempor
17 |
18 |
29 |
30 |
31 |
32 |
41 |
42 |
51 |
52 |
53 |
Join NewsLetter
54 |
Lorem Ipsum is simply dummy and typesetti
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
© 2023 Copyright ownership • All Rights Reserved
67 |
68 |
69 | );
70 | }
71 |
72 | const Container = styled.div`
73 | display: flex;
74 | flex-direction: column;
75 | background: #282828;
76 | padding: 60px 0px 40px 0px;
77 | align-items: center;
78 | width : 100vw;
79 |
80 | .footer {
81 | display: flex;
82 | width : 70%;
83 |
84 | .social {
85 | .title {
86 | font-weight: 700;
87 | font-size: 28px;
88 | color: white;
89 | }
90 |
91 | .social_info {
92 | width: 200px;
93 | color: white;
94 | margin-top: 20px;
95 | font-size: 14px;
96 | }
97 |
98 | .icons {
99 | margin-top: 25px;
100 | display: flex;
101 | width: fit-content;
102 |
103 | .icon {
104 | display: flex;
105 | padding: 0px 8px 0px 8px;
106 | align-items: center;
107 | justify-content: center;
108 | border: 3px solid white;
109 | border-radius: 50%;
110 | margin-right: 20px;
111 | }
112 |
113 | .facebook_icon {
114 | padding: 8px 14px 8px 14px;
115 | }
116 |
117 | .instagram_icon {
118 | padding: 8px 9px 8px 9px;
119 | }
120 | }
121 | }
122 |
123 | .links_div {
124 | display: flex;
125 | padding-left: 40px;
126 | flex : 1;
127 | width : 100%;
128 | justify-content : space-between;
129 |
130 | .linkquid_div {
131 | margin-left: 20px;
132 | .title {
133 | color: #fb25bd;
134 | margin-bottom: 20px;
135 | font-weight: 600;
136 | font-size: 20px;
137 | }
138 |
139 | .links {
140 | display : flex;
141 | flex-direction: column;
142 | a{
143 | color: white;
144 | font-weight: 500;
145 | font-size: 14px;
146 | margin-bottom : 20px;
147 | text-decoration: none;
148 | }
149 | }
150 | }
151 | }
152 |
153 | .third{
154 | .info{
155 | width: 200px;
156 | color: white;
157 | margin-top: 20px;
158 | font-size: 14px;
159 | }
160 |
161 | input{
162 | border-radius : 5px;
163 | border : 0;
164 | padding : 15px 10px 15px 10px;
165 | width : 250px;
166 | margin-top : 30px;
167 | outline-width : 0;
168 | }
169 | }
170 | }
171 |
172 | .copyright{
173 | p{
174 | text-align : center;
175 | color : white;
176 | font-size: 14px;
177 | margin-top : 30px;
178 | margin-bottom : 15px;
179 | }
180 | }
181 | `;
182 |
183 | export default AfterLoginFooter;
184 |
--------------------------------------------------------------------------------
/src/components/AfterLoginHeader.jsx:
--------------------------------------------------------------------------------
1 | import React , {useState , useEffect} from "react";
2 | import styled from "styled-components";
3 | import HeaderIcon from "../images/HeaderIcon.PNG";
4 | import SearchIcon from "../images/Search.svg";
5 | import NotificationIcon from "../images/Notification.svg";
6 | import Profile from "../images/profile.jpg";
7 | import Avatar from "@mui/material/Avatar";
8 | import {useNavigate} from 'react-router-dom'
9 |
10 |
11 | function AfterLoginHeader({account}) {
12 | const navigate = useNavigate();
13 | const[profileUrl,setProfileUrl] = useState(undefined);
14 | const[name , setName] = useState();
15 |
16 | useEffect(() => {
17 | if(account === '0xce31E9F5503FaBdCBd99137944F6f71933831cb9'){
18 | setName('Thomas Lang');
19 | setProfileUrl('https://dr56wvhu2c8zo.cloudfront.net/drumuniverse/assets/33600dfd-caa5-45b5-9726-44205e9a42d2/Francesco_002.jpg')
20 | }else if(account === '0xF1FDC4eb37a8395858F20AC26F4114330DD62491'){
21 | setName('Mel Bay');
22 | setProfileUrl('http://www.spotlightagency.co.za/photos/2019/20190912/176341_imageorig_513615c4.jpg')
23 | }else{
24 | setName('Craig Austin')
25 | }
26 | } ,[])
27 |
28 | console.log("Account is" ,account);
29 |
30 |
31 | return (
32 |
33 |
34 |

35 |
36 |
37 |
38 |

39 |
43 |
44 |
45 |
46 |
navigate('/home')}>Home
47 |
Resources
48 |
navigate('/create')}>Create
49 |
50 |
51 |

52 |
10
53 |
54 |
55 | {profileUrl?(
navigate(`/profile/${account}`)}/>):( navigate(`/profile/${account}`)}/>)}
56 |
57 |
58 |
59 |
60 | );
61 | }
62 |
63 | const Container = styled.div`
64 | background: #ffffff;
65 | box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1), 0px 10px 40px rgba(0, 0, 0, 0.06);
66 | padding-left : 1vw;
67 | padding-right : 1vw;
68 | display: flex;
69 | justify-content: space-between;
70 | width : 100vw;
71 | padding-top : 1vh;
72 | padding-bottom : 2vh;
73 | height: 10vh;
74 |
75 |
76 | .headerIcon {
77 | img {
78 | width: 40px;
79 | height : 40px;
80 | margin-top : 5px;
81 | }
82 | }
83 |
84 | .headerInfo {
85 | display: flex;
86 |
87 | .search_bar {
88 | display: flex;
89 | width: 40vw;
90 | border: 1px solid lightgray;
91 | border-radius: 5px;
92 | padding: 10px;
93 | margin-right: 20px;
94 | background: #F3F3F4;
95 |
96 | input {
97 | outline-width: 0;
98 | border: 0;
99 | width: 95%;
100 | background: #F3F3F4;
101 | }
102 |
103 | img {
104 | width: 16px;
105 | object-fit: contain;
106 | margin-right: 5px;
107 | }
108 | }
109 |
110 | .header_options {
111 | display: flex;
112 |
113 | .header_tabs {
114 | display: flex;
115 | p {
116 | margin-top: auto;
117 | margin-bottom: auto;
118 | margin-left: 20px;
119 | margin-right: 20px;
120 | font-weight: 600;
121 | /* font-family: "Poppins"; */
122 | font-style: normal;
123 | font-size: 16px;
124 | color: #858fa2;
125 |
126 | &:hover {
127 | cursor: pointer;
128 | }
129 | }
130 | }
131 | }
132 |
133 | .home {
134 | color: black !important;
135 | }
136 |
137 | .notifications_icon {
138 | margin-top: 10px;
139 |
140 | margin-left: 10px;
141 |
142 | img{
143 | width: 29px;
144 | object-fit: contain;
145 | z-index: -1;
146 | }
147 | }
148 |
149 | .number {
150 | width: 21px;
151 | height: 21px;
152 | background: #e0335d;
153 | border: 1px solid #ffffff;
154 | box-sizing: border-box;
155 | border-radius: 50%;
156 | font-size : 13px;
157 | color : #ffffff;
158 | text-align: center;
159 | margin-top : -20px;
160 | z-index: 999;
161 | position : sticky;
162 | margin-left : 13px;
163 | }
164 |
165 | .profile{
166 | margin-left : 30px;
167 | margin-top : auto;
168 |
169 | .avatar{
170 | width : 50px;
171 | height : 50px;
172 |
173 | &:hover {
174 | cursor : pointer;
175 | }
176 | }
177 | }
178 | }
179 | `;
180 |
181 | export default AfterLoginHeader;
182 |
--------------------------------------------------------------------------------
/src/components/BootstrapTooltip/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { makeStyles } from '@material-ui/core/styles';
3 | import { Tooltip } from '@material-ui/core';
4 |
5 | const useStylesBootstrap = makeStyles(theme => ({
6 | arrow: {
7 | color: theme.palette.common.black,
8 | },
9 | tooltip: {
10 | backgroundColor: theme.palette.common.black,
11 | padding: '8px 16px',
12 | fontSize: 14,
13 | },
14 | }));
15 |
16 | function BootstrapTooltip(props) {
17 | const classes = useStylesBootstrap();
18 |
19 | return ;
20 | }
21 |
22 | export default BootstrapTooltip;
23 |
--------------------------------------------------------------------------------
/src/components/Connectors.js:
--------------------------------------------------------------------------------
1 | import { InjectedConnector } from '@web3-react/injected-connector';
2 |
3 | export const injected = new InjectedConnector({ supportedChainIds: [43113, 43114] });
4 |
--------------------------------------------------------------------------------
/src/components/Drop.jsx:
--------------------------------------------------------------------------------
1 | import React , {useState , useEffect} from "react";
2 | import styled from "styled-components";
3 | import Avatar from "@mui/material/Avatar";
4 | import Profile from "../images/profile.jpg";
5 | import {useNavigate} from 'react-router-dom'
6 | import { ethers } from 'ethers';
7 |
8 | function Drop(props) {
9 | const navigate = useNavigate();
10 | const [imgUrl, setImgUrl] = useState('');
11 | const [itemName, setItemName] = useState('');
12 |
13 | // useEffect(() => {
14 | // fetch(props.data.tokenUri).then(res => {
15 | // res.json().then(result => {
16 | // setImgUrl(result.image);
17 | // const item_name = result.name + ' #' + props.data.tokenId;
18 | // setItemName(item_name);
19 | // // setFavCount(props.data.likes.length);
20 | // const idx = props.data.likes.findIndex(element => element == props.account);
21 | // // if(idx > -1)
22 | // // setFav(true);
23 | // });
24 | // });
25 | // }, [props.data]);
26 |
27 | const clickBuy = () => {
28 | const url = '/detail/' + props.orderId;
29 | if(props.account){
30 | navigate(url);
31 | }else{
32 | alert('Please login to buy')
33 | navigate('/login');
34 | }
35 | }
36 |
37 |
38 | return (
39 |
40 |
45 |
49 |
50 |
{itemName}
51 |
52 |
{ethers.utils.formatEther(props.price)} QUID
53 | {/*
$3,594.00
*/}
54 |
55 |
56 |
57 |
58 |
59 |
60 | );
61 | }
62 |
63 | const Container = styled.div`
64 | height: fit-content;
65 | width: 351px;
66 | border-radius: 10px;
67 | border: 1px solid lightgray;
68 | margin-right : 20px;
69 | margin-bottom : 20px;
70 |
71 | .cover_image {
72 | height: 343px;
73 | width : 349px;
74 | /* background-image: url("https://media.npr.org/assets/img/2012/02/02/mona-lisa_custom-31a0453b88a2ebcb12c652bce5a1e9c35730a132.jpg"); */
75 | background-position: center;
76 | background-repeat: no-repeat;
77 | background-size: cover;
78 | border-top-left-radius: 10px;
79 | border-top-right-radius: 10px;
80 | border-bottom: 1px solid lightgray;
81 | }
82 |
83 | .user_info{
84 | width: 170px;
85 | height: 50px;
86 | background-color: white;
87 | display: flex;
88 | margin-left: auto;
89 | margin-right: auto;
90 | margin-top: -25px;
91 | box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.25);
92 | border-radius: 64px;
93 | align-items: center;
94 |
95 | .avatar {
96 | margin-left: 10px;
97 | margin-right: 8px;
98 | }
99 |
100 | p {
101 | font-weight: 600;
102 | font-size: 16px;
103 | margin-top : auto;
104 | margin-bottom : auto;
105 | }
106 | }
107 |
108 | .drop_details {
109 | margin-top: 10px;
110 | display: flex;
111 | padding: 0 15px 0 15px;
112 | width: 100%;
113 | margin-bottom : 20px;
114 |
115 | .name{
116 | font-weight: 500;
117 | font-size: 20px;
118 | margin-right: 40px;
119 | width : 50%;
120 |
121 | }
122 |
123 | .price {
124 | .quid {
125 | font-weight: 700;
126 | font-size: 20px;
127 | color: #e0335d;
128 | }
129 |
130 | .dollar {
131 | font-weight: 400;
132 | font-size: 15px;
133 | color: #858FA2;
134 | }
135 | }
136 | }
137 |
138 | .buttons{
139 | width: 100%;
140 | display : flex;
141 | padding: 0px 0 20px 0;
142 | justify-content: center;
143 | button{
144 | width : 90%;
145 | /* margin-left : auto;
146 | margin-right : auto; */
147 | background-color : #e0335d;
148 | color : white;
149 | padding : 8px 0 8px 0;
150 | border-radius : 5px;
151 | border : 0;
152 |
153 | &:hover {
154 | cursor : pointer;
155 | }
156 |
157 | }
158 | }
159 | `;
160 | export default Drop;
161 |
--------------------------------------------------------------------------------
/src/components/Footer.js:
--------------------------------------------------------------------------------
1 | import { Typography } from '@mui/material';
2 | import { Container, Stack, Box } from '@mui/system';
3 | import React from 'react';
4 |
5 | const Footer = () => {
6 |
7 | return (
8 |
9 |
10 |
11 |
12 |
15 | Stay in the loop
16 |
17 |
20 | Join our mailing list to stay in the loop with our newest feature releases, NFT drops, and tips and tricks for navigating Kadena.
21 |
22 |
23 |
24 |
27 | Join the community
28 |
29 |
30 |
31 |
32 |
33 | );
34 | }
35 |
36 | export default Footer;
37 |
--------------------------------------------------------------------------------
/src/components/Item.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import LikeOutline from './assets/like_outline.png';
3 | import LikeFilled from './assets/like_filled.png';
4 | import AvaxLogo from './assets/avax.png';
5 | import { useNavigate } from 'react-router-dom';
6 | import { ethers } from 'ethers';
7 | import { addToLike } from '../api/api';
8 | import { nonames } from './admin';
9 |
10 |
11 | const NFTItem = props => {
12 |
13 | const navigate = useNavigate();
14 | const [imgUrl, setImgUrl] = useState('');
15 | const [favCount, setFavCount] = useState(0);
16 | const [isFav, setFav] = useState(false);
17 | const [itemName, setItemName] = useState('');
18 |
19 |
20 |
21 |
22 |
23 | useEffect(() => {
24 | fetch(props.data.tokenUri).then(res => {
25 | res.json().then(result => {
26 | setImgUrl(result.image);
27 | const item_name = result.name + ' #' + props.data.tokenId;
28 | setItemName(item_name);
29 | setFavCount(props.data.likes.length);
30 | const idx = props.data.likes.findIndex(element => element == props.account);
31 | if(idx > -1)
32 | setFav(true);
33 | });
34 | });
35 | }, [props.data]);
36 |
37 | const clickBuy = () => {
38 | const url = '/detail/' + props.orderId;
39 | navigate(url);
40 | }
41 |
42 | const clickFavorite = () => {
43 | if(!isFav && props.account) {
44 | addToLike(props.data.tokenId, props.account).then(res => {
45 | if(res != null) {
46 | setFav(true);
47 | setFavCount(favCount => favCount + 1);
48 | }
49 | });
50 | }
51 | }
52 |
53 | return (
54 | <>
55 | {!nonames.includes(itemName) && (
56 | {console.log("Name is " , itemName)}
57 |

58 |
59 |
60 |
{itemName}
61 |
Buy Now
62 |
63 |
64 |
Price
65 |
66 |

67 |
{ethers.utils.formatEther(props.price)}
68 |
69 |
70 |

71 |
{favCount}
72 |
73 |
74 |
75 |
)}
76 | >
77 | );
78 | }
79 |
80 | export default NFTItem;
81 |
--------------------------------------------------------------------------------
/src/components/Loading.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Lottie from 'lottie-react';
3 | import loadingJson from "./assets/nft_loading.json";
4 |
5 | const Loading = () => {
6 |
7 | const style = {
8 | height: 300,
9 | width: 300
10 | };
11 |
12 | return (
13 |
14 |
15 |
16 | );
17 | }
18 |
19 | export default Loading;
20 |
--------------------------------------------------------------------------------
/src/components/Nft.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import styled from "styled-components";
3 | import loveIcon from "../images/loveIcon.svg";
4 | import HeaderIcon from "../images/HeaderIcon.PNG";
5 | import Avatar from "@mui/material/Avatar";
6 | import Profile from "../images/profile.jpg";
7 |
8 | function Nft(props) {
9 | return (
10 |
11 |
12 |
13 |

14 |
15 |
16 | Botto, the decentralized AI/human artwork
17 |
18 |
19 | {/*

*/}
20 |
200.5 KDA
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
Artwork by
30 |
John Harsh
31 |
32 |
33 |
34 | );
35 | }
36 |
37 | const Container = styled.div`
38 | display: flex;
39 | width: 265px;
40 | flex-direction: column;
41 | margin-right : 20px;
42 | margin-bottom : 40px;
43 |
44 | .nft_image {
45 | height: 290px;
46 | border-radius: 10px;
47 | background-image: url("https://i.seadn.io/gcs/files/733b19e8472ceae925248c9365453e8d.jpg?auto=format&dpr=1&w=256");
48 | background-position: center;
49 | background-repeat: no-repeat;
50 | background-size: cover;
51 | }
52 |
53 | .love_circle {
54 | width: 37px;
55 | height: 37px;
56 | border-radius: 50%;
57 | display: flex;
58 | justify-content: center;
59 | align-items: center;
60 | background-color: white;
61 | margin-left: auto;
62 | margin-right: 10px;
63 | margin-top: 10px;
64 |
65 | &:hover {
66 | cursor: pointer;
67 | background-color: #fb25bd;
68 | }
69 | }
70 | .nft_name {
71 | margin-top: 10px;
72 | font-weight: 600;
73 | font-size: 18px;
74 | margin-bottom : 0px;
75 | }
76 | .price_track {
77 | display: flex;
78 | justify-content: space-between;
79 | margin-top: 10px;
80 |
81 | .price {
82 | display: flex;
83 |
84 | img {
85 | width: 38px;
86 | object-fit: contain;
87 | }
88 |
89 | p {
90 | font-style: normal;
91 | font-weight: 600;
92 | font-size: 25px;
93 | color: #fb25bd;
94 | margin-left : 10px;
95 | }
96 | }
97 |
98 | button{
99 | width : 62px;
100 | height : 31px;
101 | border-radius : 5px;
102 | border : 1px solid lightgray;
103 | color: #788191;
104 | background-color: white;
105 |
106 | &:hover {
107 | cursor: pointer;
108 | }
109 | }
110 | }
111 |
112 | .user_info{
113 | display : flex;
114 | margin-top : 10px;
115 |
116 | .user{
117 | margin-left : 10px;
118 | font-size : 14px;
119 | .by{
120 | color: #788191;
121 | }
122 |
123 | .name{
124 | color : black;
125 |
126 | }
127 | }
128 | }
129 | `;
130 |
131 | export default Nft;
132 |
--------------------------------------------------------------------------------
/src/components/PriceInput.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from 'react';
2 |
3 | export const PriceInputErrors = {
4 | MAX_INPUT_EXCEEDED: 'Max input value exceeded',
5 | };
6 |
7 | export const PriceConstants = {
8 | UPDATE_PRICE: 'UPDATE_PRICE',
9 | MAX_PRICE: '999999999',
10 | };
11 |
12 | const PriceInput = ({
13 | value,
14 | decimals = 0,
15 | onChange,
16 | onInputError = err => console.log(err),
17 | max = PriceConstants.MAX_PRICE,
18 | ...rest
19 | }) => {
20 | useEffect(() => {
21 | onChange(checkDecimals(value));
22 | }, [decimals]);
23 |
24 | useEffect(() => {
25 | if (parseInt(value) > parseInt(max)) {
26 | onInputError(PriceInputErrors.MAX_INPUT_EXCEEDED);
27 | } else {
28 | onInputError(null);
29 | }
30 | }, [value]);
31 |
32 | const handleKeyDown = e => {
33 | const key = e.keyCode;
34 | console.log("the key you have downed is ", key)
35 | if (key >= '0'.charCodeAt(0) && key <= '9'.charCodeAt(0)) {
36 | if (value === '0' && key === '0'.charCodeAt(0)) e.preventDefault();
37 | } else if (key === 190) {
38 | if (value.length === 0 || value.includes('.') || decimals === 0)
39 | e.preventDefault();
40 | } else if (key !== 8) {
41 | e.preventDefault();
42 | }
43 | console.log("Inpiut Value is ", value)
44 | };
45 |
46 | const checkDecimals = val => {
47 | if (!val) return '';
48 | if (val.indexOf('.') > -1 && val.length - val.indexOf('.') - 1 > decimals) {
49 | const ret = Math.floor(+val * 10 ** decimals) / 10 ** decimals;
50 | return ret.toString();
51 | }
52 | return val;
53 | };
54 |
55 | const handleChange = e => {
56 | onChange(checkDecimals(e.target.value));
57 | };
58 |
59 | return (
60 |
66 | );
67 | };
68 |
69 | export default PriceInput;
70 |
--------------------------------------------------------------------------------
/src/components/Tab/Top.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import {
3 | Avatar,
4 | Button,
5 | Card,
6 | Divider,
7 | CardHeader,
8 | Stack,
9 | Box,
10 | Table,
11 | TableBody,
12 | TableCell,
13 | TableContainer,
14 | TableHead,
15 | TableRow,
16 | Typography
17 | } from '@mui/material';
18 | import arrowIosForwardFill from '@iconify/icons-eva/arrow-ios-forward-fill';
19 | import { Icon } from '@iconify/react';
20 |
21 | const TopNFTsData = [
22 | {
23 | avatar: 'https://i.seadn.io/gcs/files/d2625a77b485bad7b6fffcd65af3c461.png?auto=format&dpr=1&h=500',
24 | collectionName: 'BoringPunks',
25 | floorPrice: '0.06',
26 | volumn: '47'
27 | },
28 | {
29 | avatar: 'https://i.seadn.io/gcs/files/50182b51b061766036ee3912a6117873.png?auto=format&dpr=1&h=500',
30 | collectionName: 'Momoguro: Holoself',
31 | floorPrice: '0.02',
32 | volumn: '1'
33 | },{
34 | avatar: 'https://i.seadn.io/s/production/dad50fcb-455d-42d9-af33-94b41cf21c7a.png?w=500&auto=format',
35 | collectionName: 'I Live Here Now',
36 | floorPrice: '1.75',
37 | volumn: '78'
38 | },{
39 | avatar: 'https://i.seadn.io/s/production/dba15a19-5a3b-4c7e-b93c-3b4f21d348b6.png?w=500&auto=format',
40 | collectionName: 'Shakti Gomez Editions',
41 | floorPrice: '0.05',
42 | volumn: '0.03'
43 | },{
44 | avatar: 'https://i.seadn.io/s/production/6693ad5c-3880-4e87-987a-ac3d62fa1e39.png?w=500&auto=format',
45 | collectionName: 'ClownVamp Editions',
46 | floorPrice: '0.05',
47 | volumn: '15'
48 | },
49 | ]
50 |
51 | export default function Top() {
52 | return (
53 | <>
54 |
55 |
56 |
57 |
58 |
59 | Rank
60 | Collection
61 | Floor Price
62 | Volumn
63 |
64 |
65 |
66 | {TopNFTsData.map((row, index) => (
67 |
68 |
69 | {index+1}
70 |
71 |
72 |
73 |
74 | {row.collectionName}
75 |
76 |
77 |
78 |
79 | {row.floorPrice} ETH
80 |
81 |
82 |
83 | {row.volumn} ETH
84 |
85 |
86 | ))}
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 | }
99 | sx={{ fontSize: 14, fontWeight: 700 }}
100 | >
101 | View All
102 |
103 |
104 |
105 | >
106 | )
107 | }
--------------------------------------------------------------------------------
/src/components/WalletProvider.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Web3ReactProvider } from '@web3-react/core';
3 | import { Web3Provider } from '@ethersproject/providers';
4 |
5 | const WalletProvider = ({ children }) => {
6 |
7 | const getLibrary = provider => {
8 | const library = new Web3Provider(provider);
9 | library.pollingInterval = 12000;
10 | return library;
11 | }
12 |
13 | return (
14 |
15 | { children }
16 |
17 | );
18 | }
19 |
20 | export default WalletProvider;
21 |
--------------------------------------------------------------------------------
/src/components/admin.js:
--------------------------------------------------------------------------------
1 | export const nonames = [
2 | 'asdfaasdfas #45',
3 | ];
--------------------------------------------------------------------------------
/src/components/assets/avax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/components/assets/avax.png
--------------------------------------------------------------------------------
/src/components/assets/close.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/components/assets/error.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/src/components/assets/info.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/components/assets/like_filled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/components/assets/like_filled.png
--------------------------------------------------------------------------------
/src/components/assets/like_outline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/components/assets/like_outline.png
--------------------------------------------------------------------------------
/src/components/assets/plus.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/components/assets/success.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/components/assets/upload.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/components/assets/upload.png
--------------------------------------------------------------------------------
/src/components/assets/usdt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/components/assets/usdt.png
--------------------------------------------------------------------------------
/src/components/assets/warning.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/components/explorer/ExploreCategories.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const ExploreCategoriesData = [
8 | {
9 | title: 'Art',
10 | avatar: 'https://opensea.io/static/images/categories/maverick-art.png',
11 | },
12 | {
13 | title: 'Gaming',
14 | avatar: 'https://opensea.io/static/images/categories/maverick-gaming.png',
15 | },
16 | {
17 | title: 'Memberships',
18 | avatar: 'https://opensea.io/static/images/categories/maverick-membership.png',
19 | },
20 | {
21 | title: 'Music',
22 | avatar: 'https://opensea.io/static/images/categories/maverick-music.png',
23 | },
24 | {
25 | title: 'PFPs',
26 | avatar: 'https://opensea.io/static/images/categories/maverick-pfps.png',
27 | },
28 | {
29 | title: 'Photography',
30 | avatar: 'https://opensea.io/static/images/categories/maverick-photography.png',
31 | },
32 | ]
33 |
34 | export default function ExploreCategories(){
35 | var settings = {
36 | dots: true,
37 | infinite: false,
38 | speed: 500,
39 | slidesToShow: 5,
40 | slidesToScroll: 5,
41 | initialSlide: 0,
42 | responsive: [
43 | {
44 | breakpoint: 1200,
45 | settings: {
46 | slidesToShow: 4,
47 | slidesToScroll: 4,
48 | infinite: true,
49 | dots: true,
50 | },
51 | },
52 | {
53 | breakpoint: 1024,
54 | settings: {
55 | slidesToShow: 3,
56 | slidesToScroll: 3,
57 | infinite: true,
58 | dots: true
59 | }
60 | },
61 | {
62 | breakpoint: 600,
63 | settings: {
64 | slidesToShow: 2,
65 | slidesToScroll: 2,
66 | initialSlide: 2
67 | }
68 | },
69 | {
70 | breakpoint: 480,
71 | settings: {
72 | slidesToShow: 1,
73 | slidesToScroll: 1
74 | }
75 | }
76 | ]
77 | };
78 | return (
79 |
80 |
81 | {ExploreCategoriesData.map((item, index) => (
82 |
83 |
93 |
98 | {item.collectionName}
99 |
105 |
106 |
113 | Floor
114 |
115 | {item.floorPrice} ETH
116 |
117 |
118 |
125 | {" "}
126 | Total Volumn{" "}
127 |
128 | {item.totalVolumn} ETH
129 |
130 |
131 |
132 |
133 | ))}
134 |
135 |
136 | );
137 | }
--------------------------------------------------------------------------------
/src/components/explorer/LGBTQIA.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const LGBTQIAData = [
8 | {
9 | collectionName: 'I Live Here Now',
10 | avatar: 'https://i.seadn.io/s/production/dad50fcb-455d-42d9-af33-94b41cf21c7a.png?w=500&auto=format',
11 | floorPrice: '1.75',
12 | totalVolumn: '78'
13 | },
14 | {
15 | collectionName: 'Shakti Gomez',
16 | avatar: 'https://i.seadn.io/s/production/dba15a19-5a3b-4c7e-b93c-3b4f21d348b6.png?w=500&auto=format',
17 | floorPrice: '0.05',
18 | totalVolumn: '0.03'
19 | },
20 | {
21 | collectionName: 'ClownVamp',
22 | avatar: 'https://i.seadn.io/s/production/38d851cc-474f-48bd-bd5f-636a7d9ff75c.png?w=500&auto=format',
23 | floorPrice: '0.03',
24 | totalVolumn: '82'
25 | },
26 | {
27 | collectionName: 'Emotion Check-In',
28 | avatar: 'https://i.seadn.io/s/production/34f5e483-ffc3-45cb-81b0-ba31c263e128.png?w=500&auto=format',
29 | floorPrice: '0.05',
30 | totalVolumn: '26'
31 | },
32 | {
33 | collectionName: 'Middle Of Nowhere',
34 | avatar: 'https://i.seadn.io/s/production/8659f6e4-d1fd-4585-91f3-5940cf33db4c.png?w=500&auto=format',
35 | floorPrice: '0.05',
36 | totalVolumn: '0.27'
37 | },
38 | {
39 | collectionName: 'Midnight Meta',
40 | avatar: 'https://i.seadn.io/s/production/8b7d00fa-2bd8-41ef-a0f5-3d32faa0e317.png?w=500&auto=format',
41 | floorPrice: '<0.01',
42 | totalVolumn: '0.11'
43 | },
44 | {
45 | collectionName: 'Memorias Fer RAW',
46 | avatar: 'https://i.seadn.io/s/production/c0ad500e-2602-4fb4-ac65-901233c20abc.png?w=500&auto=format',
47 | floorPrice: '<0.01',
48 | totalVolumn: '0.06'
49 | },
50 | {
51 | collectionName: 'Whatsherface Editions',
52 | avatar: 'https://i.seadn.io/s/production/17b7e0cc-af72-477f-9d33-666724e8013d.png?w=500&auto=format',
53 | floorPrice: '0.02',
54 | totalVolumn: '0.21'
55 | },
56 | ]
57 |
58 | export default function LGBTQIA(){
59 | var settings = {
60 | dots: true,
61 | infinite: false,
62 | speed: 500,
63 | slidesToShow: 5,
64 | slidesToScroll: 5,
65 | initialSlide: 0,
66 | responsive: [
67 | {
68 | breakpoint: 1200,
69 | settings: {
70 | slidesToShow: 4,
71 | slidesToScroll: 4,
72 | infinite: true,
73 | dots: true,
74 | },
75 | },
76 | {
77 | breakpoint: 1024,
78 | settings: {
79 | slidesToShow: 3,
80 | slidesToScroll: 3,
81 | infinite: true,
82 | dots: true
83 | }
84 | },
85 | {
86 | breakpoint: 600,
87 | settings: {
88 | slidesToShow: 2,
89 | slidesToScroll: 2,
90 | initialSlide: 2
91 | }
92 | },
93 | {
94 | breakpoint: 480,
95 | settings: {
96 | slidesToShow: 1,
97 | slidesToScroll: 1
98 | }
99 | }
100 | ]
101 | };
102 | return (
103 |
104 |
105 | {LGBTQIAData.map((item, index) => (
106 |
107 |
117 |
122 | {item.collectionName}
123 |
129 |
130 |
137 | Floor
138 |
139 | {item.floorPrice} ETH
140 |
141 |
142 |
149 | {" "}
150 | Total Volumn{" "}
151 |
152 | {item.totalVolumn} ETH
153 |
154 |
155 |
156 |
157 | ))}
158 |
159 |
160 | );
161 | }
--------------------------------------------------------------------------------
/src/components/explorer/NFT101.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const NFT101Data = [
8 | {
9 | title: 'What is an NFT?',
10 | avatar: 'https://opensea.io/static/images/learn-center//what-is-nft.png',
11 | },
12 | {
13 | title: 'How to buy an NFT',
14 | avatar: 'https://opensea.io/static/images/learn-center//how-to-buy-nft.png',
15 | },
16 | {
17 | title: 'What is minting?',
18 | avatar: 'https://opensea.io/static/images/learn-center//what-is-minting.png',
19 | },
20 | {
21 | title: 'How to stay protected in web3',
22 | avatar: 'https://opensea.io/static/images/learn-center//stay-protected-web3.png',
23 | },
24 | {
25 | title: 'How to create an NFT on Kadena',
26 | avatar: 'https://opensea.io/static/images/learn-center//how-to-create-nft.png',
27 | },
28 | {
29 | title: 'How to sell an NFT using Kadena',
30 | avatar: 'https://opensea.io/static/images/learn-center//how-to-sell-nft.png',
31 | },
32 | {
33 | title: 'What is a crypto wallet?',
34 | avatar: 'https://opensea.io/static/images/learn-center//what-is-crypto-wallet.png',
35 | },
36 | {
37 | title: 'Who is Kadena',
38 | avatar: 'https://opensea.io/static/images/learn-center//who-is-opensea.png',
39 | },
40 | ]
41 |
42 | export default function NFT101(){
43 | var settings = {
44 | dots: true,
45 | infinite: false,
46 | speed: 500,
47 | slidesToShow: 5,
48 | slidesToScroll: 5,
49 | initialSlide: 0,
50 | responsive: [
51 | {
52 | breakpoint: 1200,
53 | settings: {
54 | slidesToShow: 4,
55 | slidesToScroll: 4,
56 | infinite: true,
57 | dots: true,
58 | },
59 | },
60 | {
61 | breakpoint: 1024,
62 | settings: {
63 | slidesToShow: 3,
64 | slidesToScroll: 3,
65 | infinite: true,
66 | dots: true
67 | }
68 | },
69 | {
70 | breakpoint: 600,
71 | settings: {
72 | slidesToShow: 2,
73 | slidesToScroll: 2,
74 | initialSlide: 2
75 | }
76 | },
77 | {
78 | breakpoint: 480,
79 | settings: {
80 | slidesToShow: 1,
81 | slidesToScroll: 1
82 | }
83 | }
84 | ]
85 | };
86 | return (
87 |
88 |
89 | {NFT101Data.map((item, index) => (
90 |
91 |
101 |
106 | {item.collectionName}
107 |
113 |
114 |
121 | Floor
122 |
123 | {item.floorPrice} ETH
124 |
125 |
126 |
133 | {" "}
134 | Total Volumn{" "}
135 |
136 | {item.totalVolumn} ETH
137 |
138 |
139 |
140 |
141 | ))}
142 |
143 |
144 | );
145 | }
--------------------------------------------------------------------------------
/src/components/explorer/TopCollectorBuysToday.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const TopCollectorBuysTodayData = [
8 | {
9 | collectionName: 'BEANZ Official',
10 | avatar: 'https://i.seadn.io/gae/WRcl2YH8E3_7884mcJ0DRN7STGqA8xZQKd-0MFmPftlxUR6i1xB9todMXRW2M6SIpXKAZ842UqKDm1UrkKG8nr7l9NjCkIw-GLQSFQ?auto=format&dpr=1&h=500',
11 | floorPrice: '1.28',
12 | totalVolumn: '1373'
13 | },
14 | {
15 | collectionName: 'BoringPunks',
16 | avatar: 'https://i.seadn.io/gcs/files/d2625a77b485bad7b6fffcd65af3c461.png?auto=format&dpr=1&h=500',
17 | floorPrice: '0.06',
18 | totalVolumn: '47'
19 | },
20 | {
21 | collectionName: 'Ethscriptions',
22 | avatar: 'https://i.seadn.io/gcs/files/d314228041840fda1137a562479ca0b6.png?auto=format&dpr=1&h=500',
23 | floorPrice: '-',
24 | totalVolumn: '19'
25 | },
26 | {
27 | collectionName: 'Kubz Relic',
28 | avatar: 'https://i.seadn.io/gcs/files/db2992cf06544d02438035695ecd9de7.gif?auto=format&dpr=1&h=500',
29 | floorPrice: '<0.01',
30 | totalVolumn: '0.97'
31 | },
32 | {
33 | collectionName: 'Momoguro: Holoself',
34 | avatar: 'https://i.seadn.io/gcs/files/50182b51b061766036ee3912a6117873.png?auto=format&dpr=1&h=500',
35 | floorPrice: '0.02',
36 | totalVolumn: '1'
37 | },
38 | {
39 | collectionName: 'Lil Pudgys',
40 | avatar: 'https://i.seadn.io/gcs/files/ff12374123ac5e8571b01d03874e8a76.png?auto=format&dpr=1&h=500',
41 | floorPrice: '0.35',
42 | totalVolumn: '37'
43 | },
44 | {
45 | collectionName: 'HV-MTL',
46 | avatar: 'https://i.seadn.io/gcs/files/c3e23f87e1f8cb30837ec3ac3d9db808.png?auto=format&dpr=1&h=500',
47 | floorPrice: '0.73',
48 | totalVolumn: '96'
49 | },
50 | {
51 | collectionName: 'Doodles',
52 | avatar: 'https://i.seadn.io/gcs/files/ad1e55ac8d380714566a3ecfe2a7dbcb.png?auto=format&dpr=1&h=500',
53 | floorPrice: '1.72',
54 | totalVolumn: '68'
55 | },
56 | {
57 | collectionName: 'Azuki',
58 | avatar: 'https://i.seadn.io/gae/O0XkiR_Z2--OPa_RA6FhXrR16yBOgIJqSLdHTGA0-LAhyzjSYcb3WEPaCYZHeh19JIUEAUazofVKXcY2qOylWCdoeBN6IfGZLJ3I4A?auto=format&dpr=1&h=500',
59 | floorPrice: '14.80',
60 | totalVolumn: '2331'
61 | },
62 | {
63 | collectionName: 'Bored Ape',
64 | avatar: 'https://i.seadn.io/gae/RBX3jwgykdaQO3rjTcKNf5OVwdukKO46oOAV3zZeiaMb8VER6cKxPDTdGZQdfWcDou75A8KtVZWM_fEnHG4d4q6Um8MeZIlw79BpWPA?auto=format&dpr=1&h=500',
65 | floorPrice: '38.69',
66 | totalVolumn: '1354'
67 | },
68 | ]
69 |
70 | export default function TopCollectorBuysToday(){
71 | var settings = {
72 | dots: true,
73 | infinite: false,
74 | speed: 500,
75 | slidesToShow: 5,
76 | slidesToScroll: 5,
77 | initialSlide: 0,
78 | responsive: [
79 | {
80 | breakpoint: 1200,
81 | settings: {
82 | slidesToShow: 4,
83 | slidesToScroll: 4,
84 | infinite: true,
85 | dots: true,
86 | },
87 | },
88 | {
89 | breakpoint: 1024,
90 | settings: {
91 | slidesToShow: 3,
92 | slidesToScroll: 3,
93 | infinite: true,
94 | dots: true
95 | }
96 | },
97 | {
98 | breakpoint: 600,
99 | settings: {
100 | slidesToShow: 2,
101 | slidesToScroll: 2,
102 | initialSlide: 2
103 | }
104 | },
105 | {
106 | breakpoint: 480,
107 | settings: {
108 | slidesToShow: 1,
109 | slidesToScroll: 1
110 | }
111 | }
112 | ],
113 | };
114 | return (
115 |
116 |
117 | {TopCollectorBuysTodayData.map((item, index) => (
118 |
119 |
129 |
134 | {item.collectionName}
135 |
141 |
142 |
149 | Floor
150 |
151 | {item.floorPrice} ETH
152 |
153 |
154 |
161 | {" "}
162 | Total Volumn{" "}
163 |
164 | {item.totalVolumn} ETH
165 |
166 |
167 |
168 |
169 | ))}
170 |
171 |
172 | );
173 | }
--------------------------------------------------------------------------------
/src/components/explorer/TrendingInArt.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const TrendingInArtData = [
8 | {
9 | collectionName: 'Opepen Edition',
10 | avatar: 'https://openseauserdata.com/files/d49add1f1c59ec1f3d808e4c81ae4065.svg',
11 | floorPrice: '0.70',
12 | totalVolumn: '105'
13 | },
14 | {
15 | collectionName: 'Ethernal Butterfly',
16 | avatar: 'https://i.seadn.io/gcs/files/eba95cbc69c5d7e18b66175ce6bec5d3.png?auto=format&dpr=1&h=500',
17 | floorPrice: '<0.01',
18 | totalVolumn: '7'
19 | },
20 | {
21 | collectionName: 'Saved Souls',
22 | avatar: 'https://i.seadn.io/gcs/files/20b7d08ab3a1604b6548c89d16dfec95.png?auto=format&dpr=1&h=500',
23 | floorPrice: '0.05',
24 | totalVolumn: '8'
25 | },
26 | {
27 | collectionName: 'Bitlady Maker',
28 | avatar: 'https://i.seadn.io/gcs/files/eecf5cd71f7d00ea97d59aad35876f47.gif?auto=format&dpr=1&h=500',
29 | floorPrice: '<0.01',
30 | totalVolumn: '1'
31 | },
32 | {
33 | collectionName: 'AIORBIT',
34 | avatar: 'https://i.seadn.io/gcs/files/af77635f88a552e0257f562fb820d17c.gif?auto=format&dpr=1&h=500',
35 | floorPrice: '<0.01',
36 | totalVolumn: '2'
37 | },
38 | {
39 | collectionName: 'Checks-VV Originals',
40 | avatar: 'https://openseauserdata.com/files/017514265b66647dad5f58ab55cc0ab1.svg',
41 | floorPrice: '0.54',
42 | totalVolumn: '40'
43 | },
44 | {
45 | collectionName: 'The Broken Keys',
46 | avatar: 'https://i.seadn.io/gcs/files/2a920ef8fff5a3a2ac191d68fd647ac8.png?auto=format&dpr=1&h=500',
47 | floorPrice: '38.89',
48 | totalVolumn: '27'
49 | },
50 | ]
51 |
52 | export default function TrendingInArt(){
53 | var settings = {
54 | dots: true,
55 | infinite: false,
56 | speed: 500,
57 | slidesToShow: 5,
58 | slidesToScroll: 5,
59 | initialSlide: 0,
60 | responsive: [
61 | {
62 | breakpoint: 1200,
63 | settings: {
64 | slidesToShow: 4,
65 | slidesToScroll: 4,
66 | infinite: true,
67 | dots: true,
68 | },
69 | },
70 | {
71 | breakpoint: 1024,
72 | settings: {
73 | slidesToShow: 3,
74 | slidesToScroll: 3,
75 | infinite: true,
76 | dots: true
77 | }
78 | },
79 | {
80 | breakpoint: 600,
81 | settings: {
82 | slidesToShow: 2,
83 | slidesToScroll: 2,
84 | initialSlide: 2
85 | }
86 | },
87 | {
88 | breakpoint: 480,
89 | settings: {
90 | slidesToShow: 1,
91 | slidesToScroll: 1
92 | }
93 | }
94 | ]
95 | };
96 | return (
97 |
98 |
99 | {TrendingInArtData.map((item, index) => (
100 |
101 |
111 |
116 | {item.collectionName}
117 |
123 |
124 |
131 | Floor
132 |
133 | {item.floorPrice} ETH
134 |
135 |
136 |
143 | {" "}
144 | Total Volumn{" "}
145 |
146 | {item.totalVolumn} ETH
147 |
148 |
149 |
150 |
151 | ))}
152 |
153 |
154 | );
155 | }
--------------------------------------------------------------------------------
/src/components/explorer/TrendingInGaming.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const TrendingInGamingData = [
8 | {
9 | collectionName: 'HV-MTL',
10 | avatar: 'https://i.seadn.io/gcs/files/c3e23f87e1f8cb30837ec3ac3d9db808.png?auto=format&dpr=1&h=500',
11 | floorPrice: '0.73',
12 | totalVolumn: '96'
13 | },
14 | {
15 | collectionName: 'AQUA FARM NFTs: Aree',
16 | avatar: 'https://i.seadn.io/gae/aIE-KdRyQXVZAI3QDsiXTIp4wC-QzwOg8XV4BnDN2sUmmwXd9HqYWsHeYbUYCx0JWd8iSqZAnbjjjsiavSFe-QjkACCfhVibza__Ng?auto=format&dpr=1&h=500',
17 | floorPrice: '0.33',
18 | totalVolumn: '0.40'
19 | },
20 | {
21 | collectionName: 'League of Kingdoms',
22 | avatar: 'https://i.seadn.io/gcs/files/4965e5bc08af5969d2a5b711e277e70a.png?auto=format&dpr=1&h=500',
23 | floorPrice: '58.99',
24 | totalVolumn: '4'
25 | },
26 | {
27 | collectionName: 'The Beacon',
28 | avatar: 'https://i.seadn.io/gcs/files/acc49678ae67e78a18f868dc23e5c6dc.png?auto=format&dpr=1&h=500',
29 | floorPrice: '0.01',
30 | totalVolumn: '2'
31 | },
32 | {
33 | collectionName: 'Otherside Koda',
34 | avatar: 'https://i.seadn.io/gcs/files/90319cbe55a88e2051b09e5d4058ce43.png?auto=format&dpr=1&h=500',
35 | floorPrice: '5.69',
36 | totalVolumn: '34'
37 | },
38 | {
39 | collectionName: 'Otherdeed Expanded',
40 | avatar: 'https://i.seadn.io/gcs/files/993fb5fc51ba0ad55f15e2856bc32f83.png?auto=format&dpr=1&h=500&fr=1',
41 | floorPrice: '0.59',
42 | totalVolumn: '33'
43 | },
44 | {
45 | collectionName: 'Pixelmon',
46 | avatar: 'https://i.seadn.io/gcs/files/15253f057fda61d8498f3e8264c2be23.png?auto=format&dpr=1&h=500',
47 | floorPrice: '0.54',
48 | totalVolumn: '30'
49 | },
50 | ]
51 |
52 | export default function TrendingInGaming(){
53 | var settings = {
54 | dots: true,
55 | infinite: false,
56 | speed: 500,
57 | slidesToShow: 5,
58 | slidesToScroll: 5,
59 | initialSlide: 0,
60 | responsive: [
61 | {
62 | breakpoint: 1200,
63 | settings: {
64 | slidesToShow: 4,
65 | slidesToScroll: 4,
66 | infinite: true,
67 | dots: true,
68 | },
69 | },
70 | {
71 | breakpoint: 1024,
72 | settings: {
73 | slidesToShow: 3,
74 | slidesToScroll: 3,
75 | infinite: true,
76 | dots: true
77 | }
78 | },
79 | {
80 | breakpoint: 600,
81 | settings: {
82 | slidesToShow: 2,
83 | slidesToScroll: 2,
84 | initialSlide: 2
85 | }
86 | },
87 | {
88 | breakpoint: 480,
89 | settings: {
90 | slidesToShow: 1,
91 | slidesToScroll: 1
92 | }
93 | }
94 | ]
95 | };
96 | return (
97 |
98 |
99 | {TrendingInGamingData.map((item, index) => (
100 |
101 |
111 |
116 | {item.collectionName}
117 |
123 |
124 |
131 | Floor
132 |
133 | {item.floorPrice} ETH
134 |
135 |
136 |
143 | {" "}
144 | Total Volumn{" "}
145 |
146 | {item.totalVolumn} ETH
147 |
148 |
149 |
150 |
151 | ))}
152 |
153 |
154 | );
155 | }
--------------------------------------------------------------------------------
/src/components/explorer/TrendingInMemberships.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const TrendingInMembershipsData = [
8 | {
9 | collectionName: 'Utility Wen',
10 | avatar: 'https://i.seadn.io/gcs/files/8b7f62949fdf907b557995dcb36eb7d9.jpg?auto=format&dpr=1&h=500',
11 | floorPrice: '0.13',
12 | totalVolumn: '144'
13 | },
14 | {
15 | collectionName: 'FF6000',
16 | avatar: 'https://i.seadn.io/gcs/files/fd06ceb05c6939fcd7ba0efac8600a56.png?auto=format&dpr=1&h=500',
17 | floorPrice: '0.06',
18 | totalVolumn: '15'
19 | },
20 | {
21 | collectionName: 'BlackRock',
22 | avatar: 'https://i.seadn.io/gcs/files/11b45cbdd42ba340294d208d44b863c6.png?auto=format&dpr=1&h=500',
23 | floorPrice: '0.18',
24 | totalVolumn: '14'
25 | },
26 | {
27 | collectionName: 'Steady Stack',
28 | avatar: 'https://i.seadn.io/gcs/files/d34ed1514aa22989df91aec0feda0aba.gif?auto=format&dpr=1&h=500',
29 | floorPrice: '0.30',
30 | totalVolumn: '6'
31 | },
32 | {
33 | collectionName: 'AlfaDAO Access Cards',
34 | avatar: 'https://i.seadn.io/gae/PwFTjdcKHO7r-z5MZKDUfvMe6bidJOcox5pvm-iFOwcnNMZwnKxffLjFRtApDSTLt_1rz0fwaQiFfApmSps3NsVPRTlyydVkVW7l4Q?auto=format&dpr=1&h=500',
35 | floorPrice: '2.60',
36 | totalVolumn: '5'
37 | },
38 | {
39 | collectionName: 'Social Bear',
40 | avatar: 'https://i.seadn.io/gcs/files/39247760241721deff6ad36870e59bf7.png?auto=format&dpr=1&h=500',
41 | floorPrice: '0.25',
42 | totalVolumn: '4'
43 | },
44 | {
45 | collectionName: 'Consortium Key',
46 | avatar: 'https://i.seadn.io/gcs/files/8bc879f0a6c5f92993686103285ce454.jpg?auto=format&dpr=1&h=500',
47 | floorPrice: '2.11',
48 | totalVolumn: '4'
49 | },
50 | ]
51 |
52 | export default function TrendingInMemberships(){
53 | var settings = {
54 | dots: true,
55 | infinite: false,
56 | speed: 500,
57 | slidesToShow: 5,
58 | slidesToScroll: 5,
59 | initialSlide: 0,
60 | responsive: [
61 | {
62 | breakpoint: 1200,
63 | settings: {
64 | slidesToShow: 4,
65 | slidesToScroll: 4,
66 | infinite: true,
67 | dots: true,
68 | },
69 | },
70 | {
71 | breakpoint: 1024,
72 | settings: {
73 | slidesToShow: 3,
74 | slidesToScroll: 3,
75 | infinite: true,
76 | dots: true
77 | }
78 | },
79 | {
80 | breakpoint: 600,
81 | settings: {
82 | slidesToShow: 2,
83 | slidesToScroll: 2,
84 | initialSlide: 2
85 | }
86 | },
87 | {
88 | breakpoint: 480,
89 | settings: {
90 | slidesToShow: 1,
91 | slidesToScroll: 1
92 | }
93 | }
94 | ]
95 | };
96 | return (
97 |
98 |
99 | {TrendingInMembershipsData.map((item, index) => (
100 |
101 |
111 |
116 | {item.collectionName}
117 |
123 |
124 |
131 | Floor
132 |
133 | {item.floorPrice} ETH
134 |
135 |
136 |
143 | {" "}
144 | Total Volumn{" "}
145 |
146 | {item.totalVolumn} ETH
147 |
148 |
149 |
150 |
151 | ))}
152 |
153 |
154 | );
155 | }
--------------------------------------------------------------------------------
/src/components/explorer/TrendingInMusic.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const TrendingInMusicData = [
8 | {
9 | collectionName: 'PIXELATED',
10 | avatar: 'https://i.seadn.io/gcs/files/697002d708a060a18d490c3213627ecd.jpg?auto=format&dpr=1&h=500',
11 | floorPrice: '0.10',
12 | totalVolumn: '2'
13 | },
14 | {
15 | collectionName: 'A0K1VERSE Passport',
16 | avatar: 'https://i.seadn.io/gcs/files/03812601d31dc45ac91e69a6afc0a93f.png?auto=format&dpr=1&h=500',
17 | floorPrice: '0.04',
18 | totalVolumn: '2'
19 | },
20 | {
21 | collectionName: 'Stickmen Toys',
22 | avatar: 'https://i.seadn.io/gcs/files/2d21367a0bdef1d9db4505e86dba8fdd.gif?auto=format&dpr=1&h=500',
23 | floorPrice: '0.02',
24 | totalVolumn: '1'
25 | },
26 | {
27 | collectionName: 'WVRPS by WarpSound',
28 | avatar: 'https://i.seadn.io/gcs/files/696760b3a50f8f59bcccadd190e3abe0.jpg?auto=format&dpr=1&h=500',
29 | floorPrice: '0.04',
30 | totalVolumn: '0.87'
31 | },
32 | {
33 | collectionName: 'SAN Origin',
34 | avatar: 'https://i.seadn.io/gcs/files/5afb86d58153fdaa435143f57d7c62b5.png?auto=format&dpr=1&h=500',
35 | floorPrice: '0.03',
36 | totalVolumn: '0.59'
37 | },
38 | {
39 | collectionName: 'Another Life by Violetta',
40 | avatar: 'https://i.seadn.io/gcs/files/5672ef507be9e77938bd467ce0eabe22.png?auto=format&dpr=1&h=500',
41 | floorPrice: '0.02',
42 | totalVolumn: '0.42'
43 | },
44 | ]
45 |
46 | export default function TrendingInMusic(){
47 | var settings = {
48 | dots: true,
49 | infinite: false,
50 | speed: 500,
51 | slidesToShow: 5,
52 | slidesToScroll: 5,
53 | initialSlide: 0,
54 | responsive: [
55 | {
56 | breakpoint: 1200,
57 | settings: {
58 | slidesToShow: 4,
59 | slidesToScroll: 4,
60 | infinite: true,
61 | dots: true,
62 | },
63 | },
64 | {
65 | breakpoint: 1024,
66 | settings: {
67 | slidesToShow: 3,
68 | slidesToScroll: 3,
69 | infinite: true,
70 | dots: true
71 | }
72 | },
73 | {
74 | breakpoint: 600,
75 | settings: {
76 | slidesToShow: 2,
77 | slidesToScroll: 2,
78 | initialSlide: 2
79 | }
80 | },
81 | {
82 | breakpoint: 480,
83 | settings: {
84 | slidesToShow: 1,
85 | slidesToScroll: 1
86 | }
87 | }
88 | ]
89 | };
90 | return (
91 |
92 |
93 | {TrendingInMusicData.map((item, index) => (
94 |
95 |
105 |
110 | {item.collectionName}
111 |
117 |
118 |
125 | Floor
126 |
127 | {item.floorPrice} ETH
128 |
129 |
130 |
137 | {" "}
138 | Total Volumn{" "}
139 |
140 | {item.totalVolumn} ETH
141 |
142 |
143 |
144 |
145 | ))}
146 |
147 |
148 | );
149 | }
--------------------------------------------------------------------------------
/src/components/explorer/TrendingInPFPs.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const TrendingInPFPsData = [
8 | {
9 | collectionName: 'Azuki',
10 | avatar: 'https://i.seadn.io/gae/O0XkiR_Z2--OPa_RA6FhXrR16yBOgIJqSLdHTGA0-LAhyzjSYcb3WEPaCYZHeh19JIUEAUazofVKXcY2qOylWCdoeBN6IfGZLJ3I4A?auto=format&dpr=1&h=500',
11 | floorPrice: '14.80',
12 | totalVolumn: '2331'
13 | },
14 | {
15 | collectionName: 'BEANZ Official',
16 | avatar: 'https://i.seadn.io/gae/WRcl2YH8E3_7884mcJ0DRN7STGqA8xZQKd-0MFmPftlxUR6i1xB9todMXRW2M6SIpXKAZ842UqKDm1UrkKG8nr7l9NjCkIw-GLQSFQ?auto=format&dpr=1&h=500',
17 | floorPrice: '1.28',
18 | totalVolumn: '1373'
19 | },
20 | {
21 | collectionName: 'Lil Pudgys',
22 | avatar: 'https://i.seadn.io/gcs/files/ff12374123ac5e8571b01d03874e8a76.png?auto=format&dpr=1&h=500',
23 | floorPrice: '0.35',
24 | totalVolumn: '37'
25 | },
26 | {
27 | collectionName: 'internet swag',
28 | avatar: 'https://i.seadn.io/gcs/files/0531e051c6c5193ba067e54e9a7a5dd4.jpg?auto=format&dpr=1&h=500',
29 | floorPrice: '<0.01',
30 | totalVolumn: '19'
31 | },
32 | {
33 | collectionName: 'Nakamigos',
34 | avatar: 'https://i.seadn.io/gcs/files/4582367dff6ee62dcc023a2339a5fdea.png?auto=format&dpr=1&h=500',
35 | floorPrice: '0.25',
36 | totalVolumn: '45'
37 | },
38 | {
39 | collectionName: 'reepz',
40 | avatar: 'https://i.seadn.io/gcs/files/bfd85085ffeca0147b22808813630075.png?auto=format&dpr=1&h=500',
41 | floorPrice: '0.07',
42 | totalVolumn: '13'
43 | },
44 | {
45 | collectionName: 'Fumo Maker',
46 | avatar: 'https://i.seadn.io/gcs/files/0ed12fe92220f123944fc69a0cf5861b.png?auto=format&dpr=1&h=500',
47 | floorPrice: '<0.01',
48 | totalVolumn: '2'
49 | },
50 | ]
51 |
52 | export default function TrendingInPFPs(){
53 | var settings = {
54 | dots: true,
55 | infinite: false,
56 | speed: 500,
57 | slidesToShow: 5,
58 | slidesToScroll: 5,
59 | initialSlide: 0,
60 | responsive: [
61 | {
62 | breakpoint: 1200,
63 | settings: {
64 | slidesToShow: 4,
65 | slidesToScroll: 4,
66 | infinite: true,
67 | dots: true,
68 | },
69 | },
70 | {
71 | breakpoint: 1024,
72 | settings: {
73 | slidesToShow: 3,
74 | slidesToScroll: 3,
75 | infinite: true,
76 | dots: true
77 | }
78 | },
79 | {
80 | breakpoint: 600,
81 | settings: {
82 | slidesToShow: 2,
83 | slidesToScroll: 2,
84 | initialSlide: 2
85 | }
86 | },
87 | {
88 | breakpoint: 480,
89 | settings: {
90 | slidesToShow: 1,
91 | slidesToScroll: 1
92 | }
93 | }
94 | ]
95 | };
96 | return (
97 |
98 |
99 | {TrendingInPFPsData.map((item, index) => (
100 |
101 |
111 |
116 | {item.collectionName}
117 |
123 |
124 |
131 | Floor
132 |
133 | {item.floorPrice} ETH
134 |
135 |
136 |
143 | {" "}
144 | Total Volumn{" "}
145 |
146 | {item.totalVolumn} ETH
147 |
148 |
149 |
150 |
151 | ))}
152 |
153 |
154 | );
155 | }
--------------------------------------------------------------------------------
/src/components/explorer/TrendingInPhotography.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Slider from "react-slick";
3 | import "slick-carousel/slick/slick.css";
4 | import "slick-carousel/slick/slick-theme.css";
5 | import { Box, Stack, Typography } from '@mui/material'
6 |
7 | const TrendingInPhotographyData = [
8 | {
9 | collectionName: 'Justin Aversano',
10 | avatar: 'https://i.seadn.io/gae/9nZWLd8XGK7afpwcSiv8T6KGFXqumlWMmPH0HfeqAY9ly6w1D_qP3b3-4F3pTdE8gXn-6AReXWHr1gvtBoWDYTCo80oPxz_KIFDSNnQ?auto=format&dpr=1&h=500',
11 | floorPrice: '16.90',
12 | totalVolumn: '4'
13 | },
14 | {
15 | collectionName: 'Every Day is a Gift',
16 | avatar: 'https://i.seadn.io/gcs/files/4bb654a5699142a3cef14e0a3a98058a.jpg?auto=format&dpr=1&h=500',
17 | floorPrice: '0.44',
18 | totalVolumn: '2'
19 | },
20 | {
21 | collectionName: 'Rad by Barry Sutton',
22 | avatar: 'https://i.seadn.io/gcs/files/617b6dcd87c841be305d0df7b7c6af30.png?auto=format&dpr=1&h=500',
23 | floorPrice: '0.11',
24 | totalVolumn: '0.73'
25 | },
26 | {
27 | collectionName: 'Auf Reisen',
28 | avatar: 'https://i.seadn.io/gcs/files/b7a53535f01ce4722583b9ded87a4bcd.jpg?auto=format&dpr=1&h=500',
29 | floorPrice: '<0.01',
30 | totalVolumn: '0.62'
31 | },
32 | {
33 | collectionName: 'Women Unite',
34 | avatar: 'https://i.seadn.io/gae/DLA-sw1dn7YIpH-OCaY1Ci9GAO7Vc6tMlKV-46PqvdS7quNvRXfZB214rbFAv1qG7eKx8rqqS5qgNAATHQcy-tej1BPWrqeMDWPs?auto=format&dpr=1&h=500',
35 | floorPrice: '0.09',
36 | totalVolumn: '0.43'
37 | },
38 | {
39 | collectionName: 'Fellowship Print Deeds',
40 | avatar: 'https://i.seadn.io/gcs/files/469bc1fe6c954a2c65ad8379bb871af0.png?auto=format&dpr=1&h=500',
41 | floorPrice: '0.30',
42 | totalVolumn: '0.30'
43 | },
44 | ]
45 |
46 | export default function TrendingInPhotography(){
47 | var settings = {
48 | dots: true,
49 | infinite: false,
50 | speed: 500,
51 | slidesToShow: 5,
52 | slidesToScroll: 5,
53 | initialSlide: 0,
54 | responsive: [
55 | {
56 | breakpoint: 1200,
57 | settings: {
58 | slidesToShow: 4,
59 | slidesToScroll: 4,
60 | infinite: true,
61 | dots: true,
62 | },
63 | },
64 | {
65 | breakpoint: 1024,
66 | settings: {
67 | slidesToShow: 3,
68 | slidesToScroll: 3,
69 | infinite: true,
70 | dots: true
71 | }
72 | },
73 | {
74 | breakpoint: 600,
75 | settings: {
76 | slidesToShow: 2,
77 | slidesToScroll: 2,
78 | initialSlide: 2
79 | }
80 | },
81 | {
82 | breakpoint: 480,
83 | settings: {
84 | slidesToShow: 1,
85 | slidesToScroll: 1
86 | }
87 | }
88 | ]
89 | };
90 | return (
91 |
92 |
93 | {TrendingInPhotographyData.map((item, index) => (
94 |
95 |
105 |
110 | {item.collectionName}
111 |
117 |
118 |
125 | Floor
126 |
127 | {item.floorPrice} ETH
128 |
129 |
130 |
137 | {" "}
138 | Total Volumn{" "}
139 |
140 | {item.totalVolumn} ETH
141 |
142 |
143 |
144 |
145 | ))}
146 |
147 |
148 | );
149 | }
--------------------------------------------------------------------------------
/src/components/profile.css:
--------------------------------------------------------------------------------
1 | .profile-item {
2 | display: flex;
3 | flex-direction: column;
4 | background-color: rgb(255, 255, 255);
5 | border: 1px solid rgb(229, 232, 235);
6 | border-radius: 10px;
7 | position: relative;
8 | z-index: 2;
9 | }
10 | .profile-item:hover {
11 | transform: translateY(-2px);
12 | box-shadow: rgb(4 17 29 / 25%) 0px 0px 8px 0px;
13 | transition: all 0.1s ease 0s;
14 | }
15 | .profile-item img {
16 | width: 100%;
17 | }
18 | .profile-item .title-div {
19 | padding: 12px;
20 | }
21 | .profile-item .collection-title {
22 | color: #707a83;
23 | font-size: 12px;
24 | }
25 |
26 | .profile-item .item-title {
27 | color: rgb(53, 56, 64);
28 | font-size: 12px;
29 | letter-spacing: 0.1px;
30 | font-weight: 600;
31 | text-align: left;
32 | }
33 | .profile-item .bottom-div {
34 | align-items: center;
35 | display: flex;
36 | font-weight: 500;
37 | padding: 12px;
38 | height: 42px;
39 | width: 100%;
40 | border-bottom-left-radius: 10px;
41 | border-bottom-right-radius: 10px;
42 | background: linear-gradient(rgba(229, 232, 235, 0.392) 0%, rgb(255, 255, 255) 20%);
43 | }
44 | .profile-item .icon-favorite:hover {
45 | color: rgb(235, 87, 87);
46 | transition: all 0.1s ease 0s;
47 | }
48 | .icon-favorite-select {
49 | color: rgb(235, 87, 87);
50 | }
51 | .profile-item .dropdown-menu {
52 | max-width: 350px;
53 | transition-duration: 300ms;
54 | overflow-y: auto;
55 | box-shadow: rgb(0 0 0 / 16%) 0px 4px 16px;
56 | background-color: rgb(255, 255, 255);
57 | color: rgb(4, 17, 29);
58 | max-width: initial;
59 | min-width: 220px;
60 | border-top-left-radius: 10px;
61 | border-top-right-radius: 10px;
62 | padding: 0 !important;
63 | }
64 | .dropdown-menu ul {
65 | padding-left: 0 !important;
66 | margin: 0;
67 | }
68 | .dropdown-menu li {
69 | border-bottom: 1px solid rgb(229, 232, 235);
70 | text-decoration: none;
71 | list-style-type: none;
72 | }
73 | .dropdown-menu li:hover {
74 | transition: all 0.2s ease 0s;
75 | box-shadow: rgb(4 17 29 / 25%) 0px 0px 8px 0px;
76 | background-color: rgb(251, 253, 255);
77 | }
78 | .dropdown-menu li span {
79 | font-weight: 600;
80 | font-size: 14px;
81 | color: rgb(4, 17, 29);
82 | }
83 | .sell-caption:hover {
84 | color: rgba(4, 17, 29, 0.7);
85 | transition: all 0.1s ease 0s;
86 | }
87 |
88 | .preview-item {
89 | width: 280px;
90 | }
--------------------------------------------------------------------------------
/src/components/toast/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import toast from 'react-hot-toast';
3 |
4 | import iconInfo from '../assets/info.svg';
5 | import iconSuccess from '../assets/success.svg';
6 | import iconError from '../assets/error.svg';
7 | import iconWarning from '../assets/warning.svg';
8 |
9 | import styles from './styles.module.scss';
10 |
11 | const icons = {
12 | info: iconInfo,
13 | success: iconSuccess,
14 | error: iconError,
15 | warning: iconWarning,
16 | };
17 |
18 | export default (type, title, body, onClick = () => {}) => {
19 | console.log('Toast type is ', type);
20 | console.log('Toast title is ', title);
21 | console.log('Toast body is ', body);
22 | return toast(
23 | () => (
24 |
25 | {console.log('here is okay')}
26 |
27 |

28 |
{title}
29 |
30 | {body.length > 0 &&
{body}
}
31 |
32 | ),
33 | {
34 | duration: 5000,
35 | className: styles.toast,
36 | }
37 | );
38 | };
39 |
--------------------------------------------------------------------------------
/src/components/toast/styles.module.scss:
--------------------------------------------------------------------------------
1 | .toast {
2 | cursor: pointer;
3 | padding: 0;
4 | border-radius: 10px;
5 | background-color: #FFF;
6 | box-shadow: 0 4px 40px rgba(0, 0, 0, .1);
7 | }
8 |
9 | .toastInner {
10 | margin: -4px -10px;
11 | padding: 24px;
12 | }
13 |
14 | .header {
15 | display: flex;
16 | align-items: center;
17 |
18 | .icon {
19 | width: 24px;
20 | height: 24px;
21 | object-fit: contain;
22 | margin-right: 14px;
23 | }
24 |
25 | span {
26 | font-weight: 700;
27 | font-size: 20px;
28 | line-height: 24.36px;
29 | color: #3D3D3D;
30 | white-space: pre-line;
31 | }
32 | }
33 |
34 | .body {
35 | margin-top: 12px;
36 | font-weight: 400;
37 | font-size: 16px;
38 | line-height: 25.6px;
39 | color: #3D3D3D;
40 | white-space: pre-line;
41 | }
--------------------------------------------------------------------------------
/src/constants/errors.js:
--------------------------------------------------------------------------------
1 | export default {
2 | '-32700':
3 | 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text!',
4 | '-32600': 'The JSON sent is not a valid Request object!',
5 | '-32601': 'The method does not exist / is not available!',
6 | '-32602': 'Invalid method parameter(s)!',
7 | '-32603': 'Internal JSON-RPC error!',
8 | '-32000': 'Invalid input',
9 | '-32001': 'Resource not found!',
10 | '-32002': 'Resource unavailable!',
11 | '-32003': 'Transaction rejected!',
12 | '-32004': 'Method not supported!',
13 | '-32005': 'Request limit exceeded!',
14 | '4001': 'User rejected the request!',
15 | '4100':
16 | 'The requested account and/or method has not been authorized by the user!',
17 | '4200': 'The requested method is not supported by this Ethereum provider!',
18 | '4900': 'The provider is disconnected from all chains!',
19 | '4901': 'The provider is disconnected from the specified chain!',
20 | };
21 |
--------------------------------------------------------------------------------
/src/constants/ipfs.constants.js:
--------------------------------------------------------------------------------
1 | export const IPFSConstants = {
2 | HashURI: 'https://cloudflare-ipfs.com/ipfs/',
3 | };
4 |
5 | export const IPFSUris = [
6 | 'https://artion.mypinata.cloud/ipfs/',
7 | 'https://artion1.mypinata.cloud/ipfs/',
8 | 'https://artion2.mypinata.cloud/ipfs/',
9 | 'https://artion3.mypinata.cloud/ipfs/',
10 | 'https://artion4.mypinata.cloud/ipfs/',
11 | 'https://artion5.mypinata.cloud/ipfs/',
12 | 'https://artion6.mypinata.cloud/ipfs/',
13 | 'https://artion7.mypinata.cloud/ipfs/',
14 | 'https://artion8.mypinata.cloud/ipfs/',
15 | 'https://artion9.mypinata.cloud/ipfs/',
16 | 'https://artion10.mypinata.cloud/ipfs/',
17 | 'https://artion11.mypinata.cloud/ipfs/',
18 | 'https://artion12.mypinata.cloud/ipfs/',
19 | 'https://artion13.mypinata.cloud/ipfs/',
20 | ];
21 |
--------------------------------------------------------------------------------
/src/contract/factory.js:
--------------------------------------------------------------------------------
1 | import { calculateGasMargin, getHigherGWEI } from '../utils';
2 | import useContract from '../hooks/useContract';
3 | import { ethers } from 'ethers';
4 |
5 | export const getSigner = async () => {
6 | await window.ethereum.enable();
7 | const provider = new ethers.providers.Web3Provider(window.ethereum);
8 | const signer = provider.getSigner();
9 | return signer;
10 | };
11 |
12 | export const useFactoryContract = () => {
13 | const { getContract } = useContract();
14 |
15 | const Contracts = {
16 | songAlbumSingle: "0x0cf7A427Ad8b5472cAdFCaC6898Df9E921Cbe119", //ERC721 NFT factory address : 1song = 1NFT
17 | songAlbum: "0xD88dA5Eb6474FeaFC29c47E52F102eA23947e3E3" // ERC1155 NFT factory address : 1song=1000NFT
18 | };
19 |
20 | const FACTORY_ABI = [
21 | {
22 | inputs: [
23 | { internalType: 'string', name: '_name', type: 'string' },
24 | { internalType: 'string', name: '_symbol', type: 'string' },
25 | ],
26 | name: 'createNFTContract',
27 | outputs: [{ internalType: 'address', name: '', type: 'address' }],
28 | stateMutability: 'payable',
29 | type: 'function',
30 | },
31 | {
32 | inputs: [],
33 | name: 'platformFee',
34 | outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
35 | stateMutability: 'view',
36 | type: 'function',
37 | },
38 | {
39 | inputs: [],
40 | name: "getValue",
41 | outputs: [
42 | {
43 | internalType: "uint256",
44 | name: "value",
45 | type: "uint256"
46 | }
47 | ],
48 | stateMutability: "payable",
49 | type: "function"
50 | },
51 | ];
52 |
53 | const getSongAlbumSingleFactoryContract = async () =>
54 | await getContract(Contracts.songAlbumSingle, FACTORY_ABI);
55 |
56 | const getSongAlbumFactoryContract = async () =>
57 | await getContract(Contracts.songAlbum, FACTORY_ABI);
58 |
59 |
60 | const createNFTContract = async (contract, name, symbol, value, from) => {
61 | const args = [name, symbol];
62 |
63 | const options = {
64 | value,
65 | from,
66 | gasPrice: await getHigherGWEI(),
67 | };
68 | const platformFee = await contract.platformFee()
69 | console.log({platformFee: platformFee.toString(), value:value, gasPrice:options.gasPrice})
70 |
71 | const gasEstimate = await contract.estimateGas.createNFTContract(
72 | ...args,
73 | options
74 | );
75 | console.log('Gas Estimat is ', gasEstimate);
76 | options.gasLimit = calculateGasMargin(gasEstimate);
77 | console.log('Gas Limit is ', options.gasLimit.toString());
78 | return await contract.createNFTContract(...args, options);
79 | };
80 |
81 | return {
82 | getSongAlbumSingleFactoryContract,
83 | getSongAlbumFactoryContract,
84 | createNFTContract,
85 | };
86 | };
87 |
--------------------------------------------------------------------------------
/src/contract/index.js:
--------------------------------------------------------------------------------
1 | import { ethers } from 'ethers';
2 |
3 | export * from './abi';
4 | export * from './sales';
5 | export * from './factory';
6 |
7 | export const getSigner = async () => {
8 | await window.ethereum.enable();
9 | const provider = new ethers.providers.Web3Provider(window.ethereum);
10 | const signer = provider.getSigner();
11 | return signer;
12 | };
13 |
--------------------------------------------------------------------------------
/src/contract/sales.js:
--------------------------------------------------------------------------------
1 | import { calculateGasMargin, getHigherGWEI } from '../utils/index';
2 |
3 | import useContract from '../hooks/useContract';
4 | import { ethers } from 'ethers';
5 |
6 | import { SALES_CONTRACT_ABI } from './abi';
7 |
8 | export const useSalesContract = () => {
9 | const { getContract } = useContract();
10 | const Contracts = {
11 | songAlbumMarketplace: "0x0cf7A427Ad8b5472cAdFCaC6898Df9E921Cbe119", //ERC721 NFT factory address : 1song = 1NFT
12 | };
13 |
14 | const getSalesContract = async () =>
15 | await getContract(Contracts.songAlbumMarketplace, SALES_CONTRACT_ABI);
16 |
17 | const buyItemETH = async (nftAddress, tokenId, owner, value, from) => {
18 | const contract = await getSalesContract();
19 | const args = [nftAddress, tokenId, owner];
20 |
21 | const options = {
22 | value,
23 | from,
24 | gasPrice: await getHigherGWEI(),
25 | };
26 |
27 | const gasEstimate = await contract.estimateGas[
28 | 'buyItem(address,uint256,address)'
29 | ](...args, options);
30 | options.gasLimit = calculateGasMargin(gasEstimate);
31 | return await contract['buyItem(address,uint256,address)'](...args, options);
32 | };
33 |
34 | const buyItemERC20 = async (nftAddress, tokenId, payToken, owner) => {
35 | const contract = await getSalesContract();
36 | const options = {
37 | gasPrice: await getHigherGWEI(),
38 | };
39 |
40 | return await contract['buyItem(address,uint256,address,address)'](
41 | nftAddress,
42 | tokenId,
43 | payToken,
44 | owner,
45 | options
46 | );
47 | };
48 |
49 | const cancelListing = async (nftAddress, tokenId) => {
50 | const contract = await getSalesContract();
51 | const options = {
52 | gasPrice: await getHigherGWEI(),
53 | };
54 |
55 | const tx = await contract.cancelListing(nftAddress, tokenId, options);
56 | await tx.wait();
57 | };
58 |
59 | const listItem = async (
60 | nftAddress,
61 | tokenId,
62 | quantity,
63 | payToken,
64 | pricePerItem,
65 | startingTime
66 | ) => {
67 | const contract = await getSalesContract();
68 |
69 | const options = {
70 | gasPrice: await getHigherGWEI(),
71 | };
72 |
73 | return await contract.listItem(
74 | nftAddress,
75 | tokenId,
76 | quantity,
77 | payToken,
78 | pricePerItem,
79 | startingTime,
80 | options
81 | );
82 | };
83 |
84 | const updateListing = async (
85 | nftAddress,
86 | tokenId,
87 | payToken,
88 | newPrice
89 | // quantity
90 | ) => {
91 | const contract = await getSalesContract();
92 |
93 | const options = {
94 | gasPrice: await getHigherGWEI(),
95 | };
96 |
97 | return await contract.updateListing(
98 | nftAddress,
99 | tokenId,
100 | payToken,
101 | newPrice,
102 | options
103 | );
104 | };
105 |
106 | const createOffer = async (
107 | nftAddress,
108 | tokenId,
109 | payToken,
110 | quantity,
111 | pricePerItem,
112 | deadline
113 | ) => {
114 | const contract = await getSalesContract();
115 |
116 | const options = {
117 | gasPrice: await getHigherGWEI(),
118 | };
119 |
120 | return await contract.createOffer(
121 | nftAddress,
122 | tokenId,
123 | payToken,
124 | quantity,
125 | pricePerItem,
126 | deadline,
127 | options
128 | );
129 | };
130 |
131 | const cancelOffer = async (nftAddress, tokenId) => {
132 | const contract = await getSalesContract();
133 | const options = {
134 | gasPrice: await getHigherGWEI(),
135 | };
136 |
137 | return await contract.cancelOffer(nftAddress, tokenId, options);
138 | };
139 |
140 | const acceptOffer = async (nftAddress, tokenId, creator) => {
141 | const contract = await getSalesContract();
142 | const options = {
143 | gasPrice: await getHigherGWEI(),
144 | };
145 |
146 | return await contract.acceptOffer(nftAddress, tokenId, creator, options);
147 | };
148 |
149 | const registerRoyalty = async (nftAddress, tokenId, royalty) => {
150 | const contract = await getSalesContract();
151 | const options = {
152 | gasPrice: await getHigherGWEI(),
153 | gasLimit: ethers.BigNumber.from(360000),
154 | };
155 | console.log('Royalty is ', royalty, ' and Gas Price is ', options.gasPrice,' and NFT address is ', nftAddress, ' and TokenID is ', tokenId, ' and Gas Limit is ', options.gasLimit);
156 | console.log('SalesContract is ', contract);
157 | return await contract.registerRoyalty(
158 | nftAddress,
159 | tokenId,
160 | royalty,
161 | options
162 | );
163 | };
164 |
165 | const getCollectionRoyalty = async nftAddress => {
166 | const contract = await getSalesContract();
167 | return await contract.collectionRoyalties(nftAddress);
168 | };
169 |
170 | return {
171 | getSalesContract,
172 | buyItemETH,
173 | buyItemERC20,
174 | cancelListing,
175 | listItem,
176 | updateListing,
177 | createOffer,
178 | cancelOffer,
179 | acceptOffer,
180 | registerRoyalty,
181 | getCollectionRoyalty,
182 | };
183 | };
184 |
--------------------------------------------------------------------------------
/src/errors.js:
--------------------------------------------------------------------------------
1 | export default {
2 | '-32700':
3 | 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text!',
4 | '-32600': 'The JSON sent is not a valid Request object!',
5 | '-32601': 'The method does not exist / is not available!',
6 | '-32602': 'Invalid method parameter(s)!',
7 | '-32603': 'Internal JSON-RPC error!',
8 | '-32000': 'Invalid input',
9 | '-32001': 'Resource not found!',
10 | '-32002': 'Resource unavailable!',
11 | '-32003': 'Transaction rejected!',
12 | '-32004': 'Method not supported!',
13 | '-32005': 'Request limit exceeded!',
14 | '4001': 'User rejected the request!',
15 | '4100':
16 | 'The requested account and/or method has not been authorized by the user!',
17 | '4200': 'The requested method is not supported by this Ethereum provider!',
18 | '4900': 'The provider is disconnected from all chains!',
19 | '4901': 'The provider is disconnected from the specified chain!',
20 | };
21 |
--------------------------------------------------------------------------------
/src/hooks/useContract.js:
--------------------------------------------------------------------------------
1 | import { useCallback } from 'react';
2 | import { ethers } from 'ethers';
3 | import { useWeb3React } from '@web3-react/core';
4 |
5 | // eslint-disable-next-line no-undef
6 | const RPCurl = "https://api.avax.network/ext/bc/C/rpc";
7 | const RPCurlTest = "https://api.avax-test.network/ext/bc/C/rpc";
8 | // const ChainID = 43113;
9 | // const ChainIDTest = 43114;
10 |
11 | export default () => {
12 | const { chainId } = useWeb3React();
13 |
14 | const getContract = useCallback(
15 | async (address, abi) => {
16 | if (chainId) {
17 | await window.ethereum.enable();
18 | const provider = new ethers.providers.Web3Provider(window.ethereum);
19 | const signer = provider.getSigner();
20 | return new ethers.Contract(address, abi, signer);
21 | } else {
22 | const provider = new ethers.providers.JsonRpcProvider(
23 | RPCurlTest,
24 | chainId
25 | );
26 |
27 | return new ethers.Contract(address, abi, provider);
28 | }
29 | },
30 | [chainId]
31 | );
32 |
33 | return { getContract };
34 | };
35 |
--------------------------------------------------------------------------------
/src/images/2Pac Greatest Hits.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/2Pac Greatest Hits.jpg
--------------------------------------------------------------------------------
/src/images/All Eyez On Me.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/All Eyez On Me.jpg
--------------------------------------------------------------------------------
/src/images/Dire Straits Brothers in Arms.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/Dire Straits Brothers in Arms.jpg
--------------------------------------------------------------------------------
/src/images/DownArrow.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/DownIcon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/FaceBook.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/Filter.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/HIcon.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/HIcon.PNG
--------------------------------------------------------------------------------
/src/images/HeaderIcon.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/HeaderIcon.PNG
--------------------------------------------------------------------------------
/src/images/Instagram.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/Notification.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/Private Investigation.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/Private Investigation.jpg
--------------------------------------------------------------------------------
/src/images/Search.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/Twitter.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/UpIcon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/Upload.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/apple.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/back.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/copyIcon.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/copyIcon.PNG
--------------------------------------------------------------------------------
/src/images/eckoWallet.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/eckoWallet.jpg
--------------------------------------------------------------------------------
/src/images/front.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/front.webp
--------------------------------------------------------------------------------
/src/images/loveIcon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/images/profile.dev.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/profile.dev.jpeg
--------------------------------------------------------------------------------
/src/images/profile.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/profile.jpg
--------------------------------------------------------------------------------
/src/images/store-front.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/store-front.png
--------------------------------------------------------------------------------
/src/images/storeFront.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/storeFront.PNG
--------------------------------------------------------------------------------
/src/images/storeFront.dev.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Cosmos-AI/KdaSea-Frontend/f1c051b0cfa86ffc2d5061700eb4eb1c99c18c28/src/images/storeFront.dev.PNG
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import { Provider } from "react-redux";
4 | import { store } from "../src/stores/reduxStore";
5 | import "./index.css";
6 | import App from "./App";
7 | import reportWebVitals from "./reportWebVitals";
8 | import WalletProvider from "./components/WalletProvider";
9 | import { createTheme, MuiThemeProvider } from "@material-ui/core";
10 |
11 | const theme = createTheme({
12 | palette: {
13 | primary: {
14 | main: "#E33E7F",
15 | },
16 | },
17 | });
18 |
19 | ReactDOM.render(
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | ,
29 | document.getElementById("root")
30 | );
31 |
32 | // If you want to start measuring performance in your app, pass a function
33 | // to log results (for example: reportWebVitals(console.log))
34 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
35 | reportWebVitals();
36 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/MainPage.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import NFTItem from '../components/Item';
3 | import { getAllOrders, getTokenData } from '../api/api';
4 | import Loading from '../components/Loading';
5 |
6 | const MainPage = props => {
7 |
8 | const [orderData, setOrderData] = useState([]);
9 | const [tokenData, setTokenData] = useState([]);
10 | const [loading, setLoading] = useState(false);
11 | useEffect(() => {
12 | setLoading(true);
13 | getAllOrders().then(res => {
14 | setOrderData(res);
15 | const tokenIds = [];
16 | res.forEach(order => {
17 | tokenIds.push(order.tokenId);
18 | });
19 | getTokenData(tokenIds).then(result => {
20 | setTokenData(result);
21 | setLoading(false)
22 | });
23 | })
24 | }, []);
25 |
26 | return (
27 |
28 | {!loading &&
29 | {
30 | tokenData.map((item, index) => {
31 | return (
32 |
33 |
34 |
35 | );
36 | })
37 | }
38 |
}
39 | {loading && }
40 |
41 | );
42 | }
43 |
44 | export default MainPage;
45 |
--------------------------------------------------------------------------------
/src/pages/ProfilePage.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from 'react';
2 | import './profile.css'
3 | import { useState, useRef } from "react";
4 | import ProfileItem from '../components/ProfileItem';
5 | import { useNavigate } from 'react-router-dom';
6 | import { login, getTokenData } from '../api/api';
7 | import Loading from '../components/Loading';
8 |
9 | const ProfilePage = props => {
10 |
11 | const navigate = useNavigate();
12 | //const [userInfo, setUserInfo] = useState({});
13 | const [collectedData, setCollectedData] = useState([]);
14 | const [createdData, setCreatedData] = useState([]);
15 | const [navIndex, setNavIndex] = useState(0)
16 | const [loading, setLoading] = useState(true)
17 | const navCollected = useRef();
18 | const navCreated = useRef();
19 |
20 | useEffect(() => {
21 | login(props.account).then(res => {
22 | if (res != null) {
23 | //setUserInfo(res);
24 | (async () => {
25 | if (res.owned.length > 0) {
26 | const collected = await getTokenData(res.owned);
27 | setCollectedData(collected);
28 | setLoading(false);
29 | } else setLoading(false);
30 | if (res.created.length > 0) {
31 | const created = await getTokenData(res.created);
32 | setCreatedData(created);
33 | }
34 | })();
35 | }
36 | });
37 | }, []);
38 |
39 | useEffect(() => {
40 | if (navIndex == 0 && !loading) {
41 | navCollected.current.classList.add('active')
42 | navCreated.current.classList.remove('active')
43 | } else if (navIndex == 1 && !loading) {
44 | navCollected.current.classList.remove('active')
45 | navCreated.current.classList.add('active')
46 | }
47 | return true
48 | }, ([navIndex]));
49 |
50 | const clickCreate = () => {
51 | navigate('/create');
52 | }
53 |
54 | return (
55 |
56 | {loading && }
57 | {!loading &&
58 |
59 |
78 | {navIndex == 0 ?
79 |
80 |
81 | {
82 | collectedData.map((item, index) => {
83 | return (
84 |
87 | );
88 | })
89 | }
90 |
91 |
:
92 |
93 |
94 | {
95 | createdData.map((item, index) => {
96 | return (
97 |
100 | );
101 | })
102 | }
103 |
104 |
105 | }
106 |
107 | }
108 | );
109 | }
110 |
111 |
112 | export default ProfilePage;
113 |
--------------------------------------------------------------------------------
/src/pages/SellPage.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import './sell.css';
3 | import { useLocation, useNavigate } from 'react-router-dom';
4 | import ProfileItem from '../components/ProfileItem';
5 | import { getTokenData, createOrder } from '../api/api';
6 | import { Contract } from '@ethersproject/contracts';
7 | import { parseEther } from '@ethersproject/units';
8 | import marketplaceABI from '../abi/marketplace.abi.json';
9 | import nftABI from '../abi/nft.abi.json';
10 | import Swal from 'sweetalert2';
11 | import Loading from '../components/Loading';
12 |
13 | const AVAX_ICON = '/img/avax.png'
14 | const SellPage = props => {
15 |
16 | const [price, setPrice] = useState(0);
17 | const [data, setData] = useState({});
18 | const [tokenId, setTokenId] = useState(0);
19 | const { pathname } = useLocation();
20 | const [selling, setSelling] = useState(false);
21 | const navigate = useNavigate();
22 |
23 | const contractAddress = '0x6be1203c494601d1EBEb59e66c31BFFeC0231f97';
24 | const contractNftAddress = '0xdC16363e321fa962A85D5455c71572F35d7aB576';
25 |
26 | useEffect(() => {
27 | const path_parts = pathname.split('/');
28 | const tokenId = parseInt(path_parts[2]);
29 | setTokenId(tokenId);
30 | const token_array = [];
31 | token_array.push(tokenId);
32 | getTokenData(token_array).then(res => {
33 | if (res != null)
34 | setData(res[0]);
35 | });
36 | }, []);
37 |
38 | const clickCreateOrder = (e) => {
39 | e.preventDefault();
40 | const contract = new Contract(contractAddress, marketplaceABI, props.library).connect(props.library.getSigner(props.account));
41 | const contractNft = new Contract(contractNftAddress, nftABI, props.library).connect(props.library.getSigner(props.account));
42 |
43 | if (price == 0) {
44 | Swal.fire({
45 | title: 'Creating Order',
46 | text: 'Price is invalid',
47 | icon: 'error',
48 | confirmButtonText: 'OK'
49 | });
50 | return;
51 | }
52 | if (tokenId > 0 && props.library && price > 0) {
53 | setSelling(true);
54 | contractNft.approve(contractAddress, tokenId).then(txRes => {
55 | txRes.wait().then(() => {
56 | contract.createOrderForSale(tokenId, '0x0000000000000000000000000000000000000000', parseEther('' + price)).then(res => {
57 | res.wait().then(result => {
58 | const orderId = result.events[3].args[1].toNumber();
59 |
60 | createOrder(orderId, tokenId, '0x0000000000000000000000000000000000000000', parseEther(price).toString(), props.account).then(res => {
61 | if (res != null) {
62 | Swal.fire({
63 | title: 'Order Report',
64 | text: 'The NFT is ready for sale',
65 | icon: 'success',
66 | confirmButtonText: 'OK'
67 | });
68 | setSelling(false);
69 | navigate('/marketplace');
70 | }
71 | })
72 |
73 | }).catch(err => {
74 | setSelling(false);
75 | console.log(err)
76 | });
77 | }).catch(err => {
78 | console.log(err)
79 | setSelling(false);
80 | });
81 | });
82 | });
83 | }
84 | }
85 |
86 | return (
87 |
88 | {!selling &&
89 |
90 |
91 |
92 |
List item for sale
93 |
116 |
117 |
118 |
Preview
119 |
120 |
121 |
122 |
}
123 | {selling && }
124 |
125 | );
126 | }
127 |
128 |
129 | export default SellPage;
130 |
--------------------------------------------------------------------------------
/src/pages/detail.css:
--------------------------------------------------------------------------------
1 | .detail-container {
2 | min-height: calc(100vh - 77px - 46px);
3 | }
4 |
5 | .btn-favorite {
6 | color: #707a83;
7 | }
8 | .btn-favorite:hover {
9 | color: black;
10 | transition: all 0.4s;
11 | }
12 | .accordion-button:not(.collapsed) {
13 | color: black !important;
14 | background-color: transparent !important;
15 | }
16 | .accordion-button:focus {
17 | box-shadow: none !important;
18 | }
19 | .font-weight-700 {
20 | font-weight: 700;
21 | }
22 | .float-right {
23 | float: right;
24 | }
25 | .btn-buy-now {
26 | background-color: #2081e2;
27 | box-shadow: rgba(4, 17, 29, 0.25) 0px 0px 8px 0px;
28 | border-radius: 10px;
29 | text-align: center;
30 | color: white;
31 | cursor: pointer;
32 | width: 200px;
33 | height: 50px;
34 | padding: 12px 20px;
35 | font-weight: 600;
36 | }
37 | .btn-buy-now:hover {
38 | background-color: rgb(24, 104, 183);
39 | transition: all 0.4s;
40 | }
41 | .current-price-div {
42 | padding: 20px;
43 | border-radius: 10px;
44 | border: 1px solid rgba(0,0,0,.125);
45 | }
--------------------------------------------------------------------------------
/src/pages/mint.css:
--------------------------------------------------------------------------------
1 | .dropzone-placeholder {
2 | position: relative;
3 | padding: 4px;
4 | cursor: pointer;
5 | border: 3px dashed rgb(204, 204, 204);
6 | border-radius: 10px;
7 | height: 257px;
8 | width: 350px;
9 | padding: 4px;
10 | }
11 | .dropzone-placeholder-mask {
12 | width: 100%;
13 | height: 100%;
14 | display: flex;
15 | align-items: center;
16 | flex-direction: column;
17 | justify-content: center;
18 | border-radius: 10px;
19 | }
20 |
21 | .dropzone-placeholder-mask:hover {
22 | background-color: rgb(204, 204, 204);
23 | transition: all 0.2s;
24 | }
25 | .create-container {
26 | width: 60%;
27 | min-height: calc(100vh - 77px - 46px);
28 | }
29 | .create-container .form-label {
30 | font-size: 1.5rem;
31 | font-weight: 500;
32 | }
33 | .amount-input{
34 | height: 50px;
35 | background-color: rgb(255, 255, 255);
36 | border-radius: 10px;
37 | border: 1px solid rgb(229, 232, 235);
38 | width: 100%;
39 | padding: 12px;
40 | }
41 | .amount-input:active {
42 | border-color: rgb(112, 122, 131) !important;
43 | box-shadow: rgb(4 17 29 / 25%) 0px 0px 8px 0px !important;
44 | }
45 |
--------------------------------------------------------------------------------
/src/pages/mint/index-test.jsx:
--------------------------------------------------------------------------------
1 | import React, {useEffect, useRef, useState, useCallback} from 'react'
2 |
3 | import Select from 'react-dropdown-select'
4 |
5 | import styles from './styles.module.scss'
6 |
7 |
8 |
9 | const PaintBoard = () => {
10 | const [collectionName, setCollectionName] = useState();
11 | const [albums, setAlbums] = useState([
12 | {
13 | album: "GREATEST HITS LIVE",
14 | artist: " CHIC",
15 | },
16 | {
17 | album: " ALEX LOVES",
18 | artist: "ALEXANDER O’NEAL",
19 | },
20 | {
21 | album: " LIVE MY LIFE",
22 | artist: "2 PAC",
23 | },
24 | {
25 | album: "USHER & FRIENDS VOL.2 ",
26 | artist: "USHER AND FRIENDS ",
27 | },
28 | {
29 | album: "USHER & FRIENDS VOL.1 ",
30 | artist: "USHER AND FRIENDS ",
31 | },
32 | {
33 | album: "EXIT WOUNDS - SOUNDTRACK for FILM",
34 | artist: "VARIOUS",
35 | },
36 | ]);
37 |
38 | useEffect(()=>{
39 | setAlbums([
40 | {
41 | album: "GREATEST HITS LIVE",
42 | artist: " CHIC",
43 | },
44 | {
45 | album: " ALEX LOVES",
46 | artist: "ALEXANDER O’NEAL",
47 | },
48 | {
49 | album: " LIVE MY LIFE",
50 | artist: "2 PAC",
51 | },
52 | {
53 | album: "USHER & FRIENDS VOL.2 ",
54 | artist: "USHER AND FRIENDS ",
55 | },
56 | {
57 | album: "USHER & FRIENDS VOL.1 ",
58 | artist: "USHER AND FRIENDS ",
59 | },
60 | {
61 | album: "EXIT WOUNDS - SOUNDTRACK for FILM",
62 | artist: "VARIOUS",
63 | },
64 | ])
65 | },[])
66 |
67 | return (
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
Albums
76 |
123 |
124 |
125 |
126 |
127 |
128 |
129 | )
130 | }
131 |
132 | export default PaintBoard
133 |
--------------------------------------------------------------------------------
/src/pages/mint/styles.module.scss:
--------------------------------------------------------------------------------
1 | .container {
2 | position: absolute;
3 | width: 100%;
4 | min-height: 100vh;
5 | top: 0;
6 | padding-top: 80px;
7 | box-sizing: border-box;
8 | }
9 |
10 | .body {
11 | width: 100%;
12 | height: 100%;
13 | padding: 40px;
14 | box-sizing: border-box;
15 | display: flex;
16 | position: relative;
17 | }
18 |
19 | .board {
20 | width: 400px;
21 | height: 400px;
22 | margin-right: 40px;
23 | }
24 |
25 | .uploadCont {
26 | height: 100%;
27 | border: 2px dashed rgba(0, 0, 0, .6);
28 | border-radius: 8px;
29 | box-sizing: border-box;
30 | display: flex;
31 | flex-direction: column;
32 | align-items: center;
33 | justify-content: center;
34 | font-weight: 500;
35 | font-size: 18px;
36 | line-height: 24px;
37 | color: rgba(0, 0, 0, .6);
38 | position: relative;
39 | }
40 |
41 | .image {
42 | width: 100%;
43 | height: 100%;
44 | object-fit: contain;
45 | }
46 |
47 | .overlay {
48 | position: absolute;
49 | top: 0;
50 | left: 0;
51 | width: 100%;
52 | height: 100%;
53 | background-color: rgba(255, 255, 255, .4);
54 | display: flex;
55 | align-items: center;
56 | justify-content: center;
57 | opacity: 0;
58 | transition: opacity ease 100ms;
59 | cursor: pointer;
60 |
61 | &:hover {
62 | opacity: 1;
63 | }
64 | }
65 |
66 | .remove {
67 | width: 50px;
68 | height: 50px;
69 | color: #3D3D3D;
70 | }
71 |
72 | .browse {
73 | color: #1969FF;
74 | cursor: pointer;
75 | }
76 |
77 | .panel {
78 | flex: 1;
79 | max-width: 800px;
80 | height: 100%;
81 | position: relative;
82 | }
83 |
84 | .panelInputs {
85 | display: flex;
86 | }
87 |
88 | .panelLeft,
89 | .panelRight {
90 | flex: 1;
91 | }
92 |
93 | .panelLeft {
94 | margin-right: 30px;
95 | }
96 |
97 | .input {
98 | width: 100%;
99 | border-radius: 5px;
100 | background-color: #F6F6F6;
101 | padding: 0 22px 12px;
102 | margin-bottom: 20px;
103 | }
104 |
105 | .inputLabel {
106 | left: 22px;
107 | }
108 |
109 | .select {
110 | width: 100% !important;
111 | outline: none !important;
112 | height: 50px !important;
113 | border-radius: 10px !important;
114 | border: 2px solid rgba(0, 0, 0, 0.1) !important;
115 | box-sizing: border-box !important;
116 | font-size: 16px !important;
117 | padding-right: 12px !important;
118 | }
119 |
120 | .collection {
121 | display: flex;
122 | align-items: center;
123 | padding: 5px 10px;
124 | }
125 |
126 | .collectionLogo {
127 | width: 34px;
128 | height: 34px;
129 | border-radius: 50%;
130 | }
131 |
132 | .collectionName {
133 | margin-left: 12px;
134 | font-weight: 500;
135 | font-size: 16px;
136 | color: #3D3D3D;
137 | }
138 |
139 | .button {
140 | margin-left: auto;
141 | margin-right: auto;
142 | margin-bottom: 20px;
143 | width: 320px;
144 | height: 48px;
145 | border-radius: 8px;
146 | font-weight: 700;
147 | font-size: 18px;
148 | background-color: #1969FF;
149 | color: #FFF;
150 | box-shadow: none;
151 | display: flex;
152 | align-items: center;
153 | justify-content: center;
154 | cursor: pointer;
155 | }
156 |
157 | .fee {
158 | display: flex;
159 | align-items: center;
160 | justify-content: center;
161 | color: #3D3D3D;
162 | opacity: 0.6;
163 | }
164 |
165 | .mintStatusContainer {
166 | margin-top: 20px;
167 | display: flex;
168 | flex-direction: column;
169 | justify-content: center;
170 | align-items: center;
171 | font-size: x-large;
172 | width: 100%;
173 | }
174 |
175 | .tnxAnchor {
176 | text-decoration: unset;
177 | font-size: 18px;
178 | margin-top: 18px;
179 | color: #007bff;
180 | }
181 |
182 | .formGroup {
183 | margin-bottom: 25px;
184 | position: relative;
185 | }
186 |
187 | .formLabel {
188 | margin: 0 0 8px;
189 | font-size: 18px;
190 | color: #3D3D3D;
191 | display: flex;
192 | align-items: center;
193 | }
194 |
195 | .formInput {
196 | width: 100%;
197 | outline: none;
198 | height: 50px;
199 | border-radius: 10px;
200 | border: 2px solid rgba(0, 0, 0, 0.1);
201 | padding: 8px 16px;
202 | box-sizing: border-box;
203 | font-size: 16px;
204 | }
205 |
206 | .longInput {
207 | resize: none;
208 | height: 100px;
209 | margin: 0;
210 | }
211 |
212 | .lengthIndicator {
213 | margin-top: 6px;
214 | margin-right: 6px;
215 | text-align: right;
216 | color: rgba(0, 0, 0, .6);
217 | }
218 |
219 | .disabled {
220 | cursor: not-allowed;
221 | box-shadow: none;
222 | opacity: 0.7;
223 | }
224 |
225 | :global {
226 | .tui-image-editor {
227 | border: 1px solid rgba(0, 0, 0, .2);
228 | }
229 | }
230 |
231 | .warning {
232 | width: 100%;
233 | display: flex;
234 | flex-direction: column;
235 | align-items: center;
236 | padding-top: 150px;
237 | }
238 |
239 | .warningIcon {
240 | width: 100px !important;
241 | height: 100px !important;
242 | color: #E15A5A;
243 | }
244 |
245 | .warningTitle {
246 | margin-top: 20px;
247 | font-weight: 500;
248 | font-size: 24px;
249 | text-align: center;
250 | color: #3D3D3D;
251 | }
252 |
253 | .switchButton {
254 | margin-top: 40px;
255 | width: 160px;
256 | height: 40px;
257 | border-radius: 8px;
258 | font-weight: 700;
259 | font-size: 18px;
260 | border: 1px solid #1969FF;
261 | color: #1969FF;
262 | box-shadow: none;
263 | display: flex;
264 | align-items: center;
265 | justify-content: center;
266 | cursor: pointer;
267 | }
268 |
269 | @media only screen and (max-width: 1150px) {
270 | .body {
271 | flex-direction: column;
272 | padding-top: 40px;
273 | height: fit-content;
274 | }
275 |
276 | .board {
277 | margin-left: auto;
278 | margin-right: auto;
279 | margin-bottom: 40px;
280 | }
281 | }
282 |
283 | @media only screen and (max-width: 768px) {
284 | .container {
285 | padding-top: 133px;
286 | }
287 |
288 | .body {
289 | padding: 40px 20px;
290 | }
291 |
292 | .panelInputs {
293 | width: 100%;
294 | flex-direction: column;
295 | }
296 |
297 | .panelLeft {
298 | margin-right: 0;
299 | }
300 | }
301 |
--------------------------------------------------------------------------------
/src/pages/profile.css:
--------------------------------------------------------------------------------
1 | .profile-container {
2 | min-height: calc(100vh - 153px);
3 | margin-top: 30px;
4 | }
5 | .profile-container .nav-btn {
6 | padding: 20px;
7 | color: #353840;
8 | font-size: 16px;
9 | font-weight: 600;
10 | cursor: pointer;
11 | }
12 |
13 | .nav-btn.active {
14 | border-bottom: 4px solid rgb(32, 129, 226);
15 | }
16 | .btn-create {
17 | padding: 0 24px !important;
18 | border-radius: 12px;
19 | }
20 | .btn-create:hover {
21 | transition: all 0.1s ease 0s;
22 | opacity: 0.7;
23 | }
24 |
25 | .item-container {
26 | overflow: hidden;
27 | }
28 |
--------------------------------------------------------------------------------
/src/pages/sell.css:
--------------------------------------------------------------------------------
1 | .price-text {
2 | font-weight: 600;
3 | font-size: 16px;
4 | }
5 | .eth-select {
6 | display: flex;
7 | border-radius: 10px;
8 | border: 1px solid rgb(229, 232, 235);
9 | padding: 12px;
10 | color: rgb(112, 122, 131);
11 | background-color: rgba(229, 232, 235, 0.25);
12 | pointer-events: none;
13 | width: 160px;
14 | }
15 | .arrow-down {
16 | background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
17 | width: 12px;
18 | height: 12px;
19 | }
20 | .amount-input input {
21 | height: 50px;
22 | background-color: rgb(255, 255, 255);
23 | border-radius: 10px;
24 | border: 1px solid rgb(229, 232, 235);
25 | width: 100%;
26 | padding: 12px
27 | }
28 | .amount-input:active {
29 | border-color: rgb(112, 122, 131) !important;
30 | box-shadow: rgb(4 17 29 / 25%) 0px 0px 8px 0px !important;
31 | }
32 | .service-fee {
33 | color: #707a83;
34 | font-size: 14px;
35 | }
36 | .btn-listing {
37 | color: rgb(255, 255, 255);
38 | background-color: rgb(24, 104, 183);
39 | padding: 10px !important;
40 | font-size: 16px;
41 | font-weight: 600;
42 | border-radius: 10px;
43 | display: flex;
44 | align-items: center;
45 | cursor: pointer;
46 | width: 150px !important;
47 | border: none !important;
48 | }
49 | .btn-listing:hover {
50 | box-shadow: rgb(4 17 29 / 25%) 0px 0px 8px 0px;
51 | transition: all 0.2s ease 0s;
52 | }
53 | input::-webkit-outer-spin-button,
54 | input::-webkit-inner-spin-button {
55 | -webkit-appearance: none;
56 | margin: 0;
57 | }
58 | .sell-container {
59 | display: flex;
60 | flex-direction: column;
61 | justify-content: center;
62 | min-height: calc(100vh - 122px);
63 | }
--------------------------------------------------------------------------------
/src/pages/styles.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | position: absolute;
3 | width: 100%;
4 | min-height: 100vh;
5 | top: 0;
6 | padding-top: 80px;
7 | box-sizing: border-box;
8 | }
9 |
10 | .body {
11 | width: 100%;
12 | height: 100%;
13 | padding: 40px;
14 | box-sizing: border-box;
15 | display: flex;
16 | position: relative;
17 | }
18 |
19 | .board {
20 | width: 400px;
21 | height: 400px;
22 | margin-right: 40px;
23 | }
24 |
25 | .uploadCont {
26 | height: 100%;
27 | border: 2px dashed rgba(0, 0, 0, .6);
28 | border-radius: 8px;
29 | box-sizing: border-box;
30 | display: flex;
31 | flex-direction: column;
32 | align-items: center;
33 | justify-content: center;
34 | font-weight: 500;
35 | font-size: 18px;
36 | line-height: 24px;
37 | color: rgba(0, 0, 0, .6);
38 | position: relative;
39 | }
40 |
41 | .image {
42 | width: 100%;
43 | height: 100%;
44 | object-fit: contain;
45 | }
46 |
47 | .overlay {
48 | position: absolute;
49 | top: 0;
50 | left: 0;
51 | width: 100%;
52 | height: 100%;
53 | background-color: rgba(255, 255, 255, .4);
54 | display: flex;
55 | align-items: center;
56 | justify-content: center;
57 | opacity: 0;
58 | transition: opacity ease 100ms;
59 | cursor: pointer;
60 |
61 | /* &:hover {
62 | opacity: 1;
63 | } */
64 | }
65 |
66 | .remove {
67 | width: 50px;
68 | height: 50px;
69 | color: #3D3D3D;
70 | }
71 |
72 | .browse {
73 | color: #1969FF;
74 | cursor: pointer;
75 | }
76 |
77 | .panel {
78 | flex: 1;
79 | max-width: 800px;
80 | height: 100%;
81 | position: relative;
82 | }
83 |
84 | .panelInputs {
85 | display: flex;
86 | }
87 |
88 | .panelLeft,
89 | .panelRight {
90 | flex: 1;
91 | }
92 |
93 | .panelLeft {
94 | margin-right: 30px;
95 | }
96 |
97 | .input {
98 | width: 100%;
99 | border-radius: 5px;
100 | background-color: #F6F6F6;
101 | padding: 0 22px 12px;
102 | margin-bottom: 20px;
103 | }
104 |
105 | .inputLabel {
106 | left: 22px;
107 | }
108 |
109 | .select {
110 | width: 100% !important;
111 | outline: none !important;
112 | height: 50px !important;
113 | border-radius: 10px !important;
114 | border: 2px solid rgba(0, 0, 0, 0.1) !important;
115 | box-sizing: border-box !important;
116 | font-size: 16px !important;
117 | padding-right: 12px !important;
118 | }
119 |
120 | .collection {
121 | display: flex;
122 | align-items: center;
123 | padding: 5px 10px;
124 | }
125 |
126 | .collectionLogo {
127 | width: 34px;
128 | height: 34px;
129 | border-radius: 50%;
130 | }
131 |
132 | .collectionName {
133 | margin-left: 12px;
134 | font-weight: 500;
135 | font-size: 16px;
136 | color: #3D3D3D;
137 | }
138 |
139 | .button {
140 | margin-left: auto;
141 | margin-right: auto;
142 | margin-bottom: 20px;
143 | width: 320px;
144 | height: 48px;
145 | border-radius: 8px;
146 | font-weight: 700;
147 | font-size: 18px;
148 | background-color: #1969FF;
149 | color: #FFF;
150 | box-shadow: none;
151 | display: flex;
152 | align-items: center;
153 | justify-content: center;
154 | cursor: pointer;
155 | }
156 |
157 | .fee {
158 | display: flex;
159 | align-items: center;
160 | justify-content: center;
161 | color: #3D3D3D;
162 | opacity: 0.6;
163 | }
164 |
165 | .mintStatusContainer {
166 | margin-top: 20px;
167 | display: flex;
168 | flex-direction: column;
169 | justify-content: center;
170 | align-items: center;
171 | font-size: x-large;
172 | width: 100%;
173 | }
174 |
175 | .tnxAnchor {
176 | text-decoration: unset;
177 | font-size: 18px;
178 | margin-top: 18px;
179 | color: #007bff;
180 | }
181 |
182 | .formGroup {
183 | margin-bottom: 25px;
184 | position: relative;
185 | }
186 |
187 | .formLabel {
188 | margin: 0 0 8px;
189 | font-size: 18px;
190 | color: #3D3D3D;
191 | display: flex;
192 | align-items: center;
193 | }
194 |
195 | .formInput {
196 | width: 100%;
197 | outline: none;
198 | height: 50px;
199 | border-radius: 10px;
200 | border: 2px solid rgba(0, 0, 0, 0.1);
201 | padding: 8px 16px;
202 | box-sizing: border-box;
203 | font-size: 16px;
204 | }
205 |
206 | .longInput {
207 | resize: none;
208 | height: 100px;
209 | margin: 0;
210 | }
211 |
212 | .lengthIndicator {
213 | margin-top: 6px;
214 | margin-right: 6px;
215 | text-align: right;
216 | color: rgba(0, 0, 0, .6);
217 | }
218 |
219 | .disabled {
220 | cursor: not-allowed;
221 | box-shadow: none;
222 | opacity: 0.7;
223 | }
224 |
225 | /* :global {
226 | .tui-image-editor {
227 | border: 1px solid rgba(0, 0, 0, .2);
228 | }
229 | } */
230 |
231 | .warning {
232 | width: 100%;
233 | display: flex;
234 | flex-direction: column;
235 | align-items: center;
236 | padding-top: 150px;
237 | }
238 |
239 | .warningIcon {
240 | width: 100px !important;
241 | height: 100px !important;
242 | color: #E15A5A;
243 | }
244 |
245 | .warningTitle {
246 | margin-top: 20px;
247 | font-weight: 500;
248 | font-size: 24px;
249 | text-align: center;
250 | color: #3D3D3D;
251 | }
252 |
253 | .switchButton {
254 | margin-top: 40px;
255 | width: 160px;
256 | height: 40px;
257 | border-radius: 8px;
258 | font-weight: 700;
259 | font-size: 18px;
260 | border: 1px solid #1969FF;
261 | color: #1969FF;
262 | box-shadow: none;
263 | display: flex;
264 | align-items: center;
265 | justify-content: center;
266 | cursor: pointer;
267 | }
268 |
269 | @media only screen and (max-width: 1150px) {
270 | .body {
271 | flex-direction: column;
272 | padding-top: 40px;
273 | height: fit-content;
274 | }
275 |
276 | .board {
277 | margin-left: auto;
278 | margin-right: auto;
279 | margin-bottom: 40px;
280 | }
281 | }
282 |
283 | @media only screen and (max-width: 768px) {
284 | .container {
285 | padding-top: 133px;
286 | }
287 |
288 | .body {
289 | padding: 40px 20px;
290 | }
291 |
292 | .panelInputs {
293 | width: 100%;
294 | flex-direction: column;
295 | }
296 |
297 | .panelLeft {
298 | margin-right: 0;
299 | }
300 | }
301 |
--------------------------------------------------------------------------------
/src/reducers/auth.reducers.js:
--------------------------------------------------------------------------------
1 | import { AuthConstants } from '../actionType/auth.actionTypes';
2 |
3 | export function Auth(
4 | state = {
5 | fetching: false,
6 | user: {},
7 | },
8 | action
9 | ) {
10 | switch (action.type) {
11 | case AuthConstants.PROFILE_GET_START: {
12 | return {
13 | ...state,
14 | fetching: true,
15 | };
16 | }
17 | case AuthConstants.PROFILE_GET_SUCCESS: {
18 | return {
19 | ...state,
20 | fetching: false,
21 | user: action.payload,
22 | };
23 | }
24 | case AuthConstants.PROFILE_GET_FAILED: {
25 | return {
26 | ...state,
27 | fetching: false,
28 | user: {},
29 | };
30 | }
31 | case AuthConstants.SIGN_OUT: {
32 | return {
33 | ...state,
34 | user: {},
35 | };
36 | }
37 |
38 | default: {
39 | return state;
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/reducers/connectwallet.reducers.js:
--------------------------------------------------------------------------------
1 | import { WalletConnectConstants } from '../actionType/walletconnect.actionTypes';
2 |
3 | export function ConnectWallet(
4 | state = { authToken: null, isModerator: false },
5 | action
6 | ) {
7 | switch (action.type) {
8 | case WalletConnectConstants.WALLETCONNECTED: {
9 | return {
10 | ...state,
11 | authToken: action.token,
12 | isModerator: action.isModerator,
13 | };
14 | }
15 | case WalletConnectConstants.WALLETDISCONNECTED: {
16 | return {
17 | ...state,
18 | authToken: null,
19 | isModerator: false,
20 | };
21 | }
22 | default: {
23 | return state;
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/reducers/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux';
2 |
3 | import { Auth } from './auth.reducers';
4 | import { ConnectWallet } from './connectwallet.reducers';
5 |
6 |
7 | const rootReducer = combineReducers({
8 | Auth,
9 | ConnectWallet,
10 |
11 | });
12 |
13 | export default rootReducer;
14 |
--------------------------------------------------------------------------------
/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/src/stores/reduxStore.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware } from 'redux';
2 | import thunkMiddleware from 'redux-thunk';
3 | import { createLogger } from 'redux-logger';
4 |
5 | import rootReducer from '../reducers/index';
6 |
7 | const loggerMiddleware = createLogger();
8 |
9 | export const store = createStore(
10 | rootReducer,
11 | applyMiddleware(thunkMiddleware, loggerMiddleware)
12 | );
13 |
--------------------------------------------------------------------------------
/src/utils.js:
--------------------------------------------------------------------------------
1 | import { ethers } from 'ethers';
2 | import { getAddress } from '@ethersproject/address';
3 |
4 | import MetamaskErrors from './errors';
5 |
6 |
7 | export const IPFSUris = [
8 | 'https://artion.mypinata.cloud/ipfs/',
9 | 'https://artion1.mypinata.cloud/ipfs/',
10 | 'https://artion2.mypinata.cloud/ipfs/',
11 | 'https://artion3.mypinata.cloud/ipfs/',
12 | 'https://artion4.mypinata.cloud/ipfs/',
13 | 'https://artion5.mypinata.cloud/ipfs/',
14 | 'https://artion6.mypinata.cloud/ipfs/',
15 | 'https://artion7.mypinata.cloud/ipfs/',
16 | 'https://artion8.mypinata.cloud/ipfs/',
17 | 'https://artion9.mypinata.cloud/ipfs/',
18 | 'https://artion10.mypinata.cloud/ipfs/',
19 | 'https://artion11.mypinata.cloud/ipfs/',
20 | 'https://artion12.mypinata.cloud/ipfs/',
21 | 'https://artion13.mypinata.cloud/ipfs/',
22 | ];
23 |
24 | export function isAddress(value) {
25 | try {
26 | return getAddress(value);
27 | } catch {
28 | return false;
29 | }
30 | }
31 |
32 | function isValidCode(code) {
33 | return code in MetamaskErrors ? true : false;
34 | }
35 |
36 | export function shortenAddress(address, chars = 4) {
37 | if (!address) return '';
38 |
39 | const parsed = isAddress(address);
40 | if (!parsed) {
41 | throw Error(`Invalid 'address' parameter '${address}'.`);
42 | }
43 | return `${parsed.substring(0, chars + 2)}...${parsed.substring(42 - chars)}`;
44 | }
45 |
46 | export const getHigherGWEI = async () => {
47 | const provider = new ethers.providers.Web3Provider(window.ethereum);
48 | const price = (await provider.getGasPrice()) * 2;
49 |
50 | return price;
51 | };
52 |
53 | export const getRandomIPFS = (tokenURI, justURL = false) => {
54 | let random = Math.floor(Math.random() * IPFSUris.length);
55 |
56 | if (justURL) {
57 | return `${IPFSUris[random]}`;
58 | }
59 |
60 | if (
61 | tokenURI.includes('gateway.pinata.cloud') ||
62 | tokenURI.includes('cloudflare') ||
63 | tokenURI.includes('ipfs.io') ||
64 | tokenURI.includes('ipfs.infura.io')
65 | ) {
66 | return `${IPFSUris[random]}${tokenURI.split('ipfs/')[1]}`;
67 | } else if (tokenURI.includes('ipfs://')) {
68 | return `${IPFSUris[random]}${tokenURI.split('ipfs://')[1]}`;
69 | }
70 |
71 | return tokenURI;
72 | };
73 |
74 | export const formatNumber = num => {
75 | if (isNaN(num) || num === null) return '';
76 | let parts = num.toString().split('.');
77 | parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
78 | return parts.join('.');
79 | };
80 |
81 |
82 | export const formatError = error => {
83 | if (error.data) {
84 | if (isValidCode(error.data.code)) {
85 | return MetamaskErrors[String(error.data.code)];
86 | } else {
87 | return error.data.message;
88 | }
89 | } else {
90 | if (error.message) {
91 | let message = error.message;
92 | let startIndex = message.indexOf('data');
93 |
94 | if (startIndex < 0) {
95 | if (isValidCode(error.code)) {
96 | return MetamaskErrors[String(error.code)];
97 | }
98 | }
99 |
100 | let code = String(message.substr(startIndex + 14, 6));
101 |
102 | if (isValidCode(code)) {
103 | return MetamaskErrors[code];
104 | }
105 | }
106 | }
107 |
108 | return 'Error!';
109 | };
110 |
111 | const intlFormat = num => {
112 | return new Intl.NumberFormat().format(Math.round(num * 10) / 10);
113 | };
114 |
115 | export const formatFollowers = num => {
116 | if (num >= 1000000) return intlFormat(num / 1000000) + 'M';
117 | if (num >= 1000) return intlFormat(num / 1000) + 'k';
118 | return intlFormat(num);
119 | };
120 |
121 | export const calculateGasMargin = value => {
122 | return value
123 | .mul(ethers.BigNumber.from(10000).add(ethers.BigNumber.from(1000)))
124 | .div(ethers.BigNumber.from(10000));
125 | };
126 |
--------------------------------------------------------------------------------
/src/utils/index.js:
--------------------------------------------------------------------------------
1 | import { ethers } from 'ethers';
2 | import { getAddress } from '@ethersproject/address';
3 |
4 | import { IPFSUris } from '../constants/ipfs.constants';
5 | import MetamaskErrors from '../constants/errors';
6 |
7 | export function isAddress(value) {
8 | try {
9 | return getAddress(value);
10 | } catch {
11 | return false;
12 | }
13 | }
14 |
15 | function isValidCode(code) {
16 | return code in MetamaskErrors ? true : false;
17 | }
18 |
19 | export function shortenAddress(address, chars = 4) {
20 | if (!address) return '';
21 |
22 | const parsed = isAddress(address);
23 | if (!parsed) {
24 | throw Error(`Invalid 'address' parameter '${address}'.`);
25 | }
26 | return `${parsed.substring(0, chars + 2)}...${parsed.substring(42 - chars)}`;
27 | }
28 |
29 | export const getHigherGWEI = async () => {
30 | const provider = new ethers.providers.Web3Provider(window.ethereum);
31 | const price = (await provider.getGasPrice()) * 2;
32 |
33 | return price;
34 | };
35 |
36 | export const getRandomIPFS = (tokenURI, justURL = false) => {
37 | let random = Math.floor(Math.random() * IPFSUris.length);
38 |
39 | if (justURL) {
40 | return `${IPFSUris[random]}`;
41 | }
42 |
43 | if (
44 | tokenURI.includes('gateway.pinata.cloud') ||
45 | tokenURI.includes('cloudflare') ||
46 | tokenURI.includes('ipfs.io') ||
47 | tokenURI.includes('ipfs.infura.io')
48 | ) {
49 | return `${IPFSUris[random]}${tokenURI.split('ipfs/')[1]}`;
50 | } else if (tokenURI.includes('ipfs://')) {
51 | return `${IPFSUris[random]}${tokenURI.split('ipfs://')[1]}`;
52 | }
53 |
54 | return tokenURI;
55 | };
56 |
57 | export const formatNumber = num => {
58 | if (isNaN(num) || num === null) return '';
59 | let parts = num.toString().split('.');
60 | parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
61 | return parts.join('.');
62 | };
63 |
64 |
65 | export const formatError = error => {
66 | if (error.data) {
67 | if (isValidCode(error.data.code)) {
68 | return MetamaskErrors[String(error.data.code)];
69 | } else {
70 | return error.data.message;
71 | }
72 | } else {
73 | if (error.message) {
74 | let message = error.message;
75 | let startIndex = message.indexOf('data');
76 |
77 | if (startIndex < 0) {
78 | if (isValidCode(error.code)) {
79 | return MetamaskErrors[String(error.code)];
80 | }
81 | }
82 |
83 | let code = String(message.substr(startIndex + 14, 6));
84 |
85 | if (isValidCode(code)) {
86 | return MetamaskErrors[code];
87 | }
88 | }
89 | }
90 |
91 | return 'Error!';
92 | };
93 |
94 | const intlFormat = num => {
95 | return new Intl.NumberFormat().format(Math.round(num * 10) / 10);
96 | };
97 |
98 | export const formatFollowers = num => {
99 | if (num >= 1000000) return intlFormat(num / 1000000) + 'M';
100 | if (num >= 1000) return intlFormat(num / 1000) + 'k';
101 | return intlFormat(num);
102 | };
103 |
104 | export const calculateGasMargin = value => {
105 | return value
106 | .mul(ethers.BigNumber.from(10000).add(ethers.BigNumber.from(1000)))
107 | .div(ethers.BigNumber.from(10000));
108 | };
109 |
--------------------------------------------------------------------------------
/src/utils/sc.interaction.js:
--------------------------------------------------------------------------------
1 | import { useCallback } from 'react';
2 | import { useWeb3React } from '@web3-react/core';
3 | import { ethers } from 'ethers';
4 |
5 | const useContract = () => {
6 | const { chainId } = useWeb3React();
7 |
8 | const loadContract = useCallback(
9 | async (address, abi) => {
10 | console.log("NFT address is ", address,'/////',chainId);
11 | const provider = new ethers.providers.Web3Provider(window.ethereum);
12 | const signer = provider.getSigner();
13 | return new ethers.Contract(address, abi, signer);
14 | },
15 | [chainId]
16 | );
17 |
18 | const getAccountBalance = useCallback(
19 | async address => {
20 | const provider = new ethers.providers.Web3Provider(window.ethereum);
21 | let balance = await provider.getBalance(address);
22 | balance = ethers.utils.formatEther(balance);
23 | return balance;
24 | },
25 | [chainId]
26 | );
27 |
28 | return { loadContract, getAccountBalance };
29 | };
30 |
31 | export default useContract;
32 |
--------------------------------------------------------------------------------
/src/utils/wallet.js:
--------------------------------------------------------------------------------
1 | import {ethers} from 'ethers'
2 | import BigNumber from 'bignumber.js'
3 | const checkBalance = async address => {
4 | const provider = new ethers.providers.Web3Provider(window.ethereum)
5 | let balance = await provider.getBalance(address)
6 | balance = ethers.utils.formatEther(balance)
7 | return balance
8 | }
9 | const toWei = (eth) => {
10 | const bn = new BigNumber(eth.toString())
11 | return bn.shiftedBy(18).toString()
12 | }
13 | const WalletUtils = {
14 | checkBalance,
15 | toWei,
16 | }
17 |
18 | export default WalletUtils
19 |
--------------------------------------------------------------------------------