diff --git a/README.md b/README.md
index 7e52038..885767a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# ENJindex, explore NFTs and crypto collectibles.
+# ENJindex, explore NFTs and crypto collectibles
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index b29a1b7..6538897 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -1,11 +1,11 @@
-import './App.css';
-import { useState, useMemo } from 'react';
-import PriceTracker from './components/PriceTracker';
-import Nav from './components/Nav';
-import Footer from './components/Footer';
-import Card from './components/Card';
-import tokens from './tokens';
-import TokenModal from './components/TokenModal';
+import "./App.css";
+import { useState, useMemo } from "react";
+import PriceTracker from "./components/PriceTracker";
+import Nav from "./components/Nav";
+import Footer from "./components/Footer";
+import Card from "./components/Card";
+import tokens from "./tokens";
+import TokenModal from "./components/TokenModal";
interface Token {
name: string;
@@ -17,8 +17,8 @@ interface Token {
}
const App = () => {
- const [currentFilter, setCurrentFilter] = useState
('All');
- const [searchQuery, setSearchQuery] = useState('');
+ const [currentFilter, setCurrentFilter] = useState("All");
+ const [searchQuery, setSearchQuery] = useState("");
const [selectedToken, setSelectedToken] = useState(null);
const handleFilterChange = (filterName: string) => {
@@ -31,12 +31,13 @@ const App = () => {
const filteredTokens = useMemo(() => {
let result = tokens.filter((token: Token) => {
- return currentFilter === 'All' || token.type === currentFilter;
+ return currentFilter === "All" || token.type === currentFilter;
});
if (searchQuery) {
- result = result.filter((token: Token) =>
- token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
- token.collection.toLowerCase().includes(searchQuery.toLowerCase())
+ result = result.filter(
+ (token: Token) =>
+ token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ token.collection.toLowerCase().includes(searchQuery.toLowerCase())
);
}
return result;
@@ -56,7 +57,10 @@ const App = () => {
Explore Tokens
-
+
{filteredTokens.length > 0 ? (
filteredTokens.map((token: Token) => (
@@ -77,7 +81,11 @@ const App = () => {
)}
{selectedToken && (
-
+
)}
diff --git a/frontend/src/components/Card.module.css b/frontend/src/components/Card.module.css
index d3aabfe..467c4b8 100644
--- a/frontend/src/components/Card.module.css
+++ b/frontend/src/components/Card.module.css
@@ -1,102 +1,110 @@
.card {
- display: flex;
- width: 300px;
- height: 400px;
- box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.25);
- border-radius: 10px;
- padding: 16px;
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
- text-align: center;
- background-image: radial-gradient(circle at center, #48555A 0%, #383D40 100%);
- flex-direction: column;
- align-items: center;
- overflow: hidden;
- transition: transform 0.5s ease, background-color 0.1s ease, box-shadow 0.1s ease;
+ display: flex;
+ width: 300px;
+ height: 400px;
+ box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.25);
+ border-radius: 10px;
+ padding: 16px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+ text-align: center;
+ background-image: radial-gradient(circle at center, #48555a 0%, #383d40 100%);
+ flex-direction: column;
+ align-items: center;
+ overflow: hidden;
+ transition: transform 0.5s ease, background-color 0.1s ease,
+ box-shadow 0.1s ease;
}
.card:hover {
- background-image: radial-gradient(circle at center, #4F6267 0%, #383c3f 100%);
- transform: scale(1.02);
- cursor: pointer;
- box-shadow: 0 0 5px 2px hsl(var(--text2));
+ background-image: radial-gradient(circle at center, #4f6267 0%, #383c3f 100%);
+ transform: scale(1.02);
+ cursor: pointer;
+ box-shadow: 0 0 5px 2px hsl(var(--text2));
}
.card:active {
- background-image: radial-gradient(circle at center, #48555A 0%, #383D40 100%);
- transform: scale(1.00);
+ background-image: radial-gradient(circle at center, #48555a 0%, #383d40 100%);
+ transform: scale(1);
}
-.card h3, .card h4, .card p {
- flex-shrink: 0;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- width: 100%;
- box-sizing: border-box;
+.card h3,
+.card h4,
+.card p {
+ flex-shrink: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 100%;
+ box-sizing: border-box;
}
.card h3 {
- color: white;
- font-size: 18px;
- min-height: 24px;
- transition: color 0.1s ease, text-shadow 0.1s ease;
+ color: white;
+ font-size: 18px;
+ min-height: 24px;
+ transition: color 0.1s ease, text-shadow 0.1s ease;
}
.card:hover h3 {
- color: hsl(var(--text2));
- text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
+ color: hsl(var(--text2));
+ text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
}
.card:active h3 {
- color: #fff;
- text-shadow: 0 0 8px hsl(var(--text3));
+ color: #fff;
+ text-shadow: 0 0 8px hsl(var(--text3));
}
.card h4 {
- margin-bottom: 8px;
- font-size: 14px;
- color: #919292;
+ margin-bottom: 8px;
+ font-size: 14px;
+ color: #919292;
}
.card p {
- color: white;
- margin-bottom: 10px;
- width: 100%;
- min-height: 22px;
- font-size: 16px;
- background-image: radial-gradient(circle at center, #7569B5 0%, #8376D8 50%, #6258A4 100%);
- border-radius: 50px;
- padding: 5px 0;
+ color: white;
+ margin-bottom: 10px;
+ width: 100%;
+ min-height: 22px;
+ font-size: 16px;
+ background-image: radial-gradient(
+ circle at center,
+ #7569b5 0%,
+ #8376d8 50%,
+ #6258a4 100%
+ );
+ border-radius: 50px;
+ padding: 5px 0;
}
.card img {
- width: 100%;
- height: 275px;
- border-radius: 10px;
- object-fit: cover;
- object-position: center;
+ width: 100%;
+ height: 275px;
+ border-radius: 10px;
+ object-fit: cover;
+ object-position: center;
}
/* Media Queries */
@media (max-width: 768px) {
- .card {
- width: 250px;
- height: 350px;
- }
+ .card {
+ width: 250px;
+ height: 350px;
+ }
+
+ .card h3 {
+ font-size: 16px;
+ }
- .card h3 {
- font-size: 16px;
- }
+ .card h4 {
+ font-size: 14px;
+ }
- .card h4 {
- font-size: 14px;
- }
-
- .card p {
- font-size: 14px;
- }
+ .card p {
+ font-size: 14px;
+ }
- .card img {
- height: 225px;
- }
-}
\ No newline at end of file
+ .card img {
+ height: 225px;
+ }
+}
diff --git a/frontend/src/components/Card.tsx b/frontend/src/components/Card.tsx
index cd6cdae..e8332fa 100644
--- a/frontend/src/components/Card.tsx
+++ b/frontend/src/components/Card.tsx
@@ -1,4 +1,4 @@
-import styles from './Card.module.css';
+import styles from "./Card.module.css";
interface CardProps {
name: string;
@@ -10,7 +10,14 @@ interface CardProps {
onCardClick: (token: any) => void;
}
-function Card({ name, collection, type, imageUrl, link, onCardClick }: CardProps) {
+function Card({
+ name,
+ collection,
+ type,
+ imageUrl,
+ link,
+ onCardClick,
+}: CardProps) {
const handleClick = () => {
const token = { name, collection, type, imageUrl, link };
onCardClick(token);
diff --git a/frontend/src/components/Footer.module.css b/frontend/src/components/Footer.module.css
index a411771..0445c70 100644
--- a/frontend/src/components/Footer.module.css
+++ b/frontend/src/components/Footer.module.css
@@ -1,56 +1,56 @@
footer {
- width: 100%;
- padding: 10px;
- border-radius: 10px;
+ width: 100%;
+ padding: 10px;
+ border-radius: 10px;
}
.footerContainer {
- display: flex;
- justify-content: space-between;
- align-items: center;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
}
.footerContainer:first-of-type {
- margin-bottom: 12px;
+ margin-bottom: 12px;
}
/* Footer Logo */
.footerLogo img {
- max-height: 30px;
+ max-height: 30px;
}
/* Footer Page Links */
.footerContainer ul {
- display: flex;
- list-style: none;
- flex-wrap: wrap;
- gap: var(--space-lg);
+ display: flex;
+ list-style: none;
+ flex-wrap: wrap;
+ gap: var(--space-lg);
}
/* Footer Social Media Links */
.footerSocial {
- font-size: var(--fs-300);
+ font-size: var(--fs-300);
}
/* Footer Copyright */
.footerLegal {
- color: #707070;
+ color: #707070;
}
/* Media Queries */
@media (max-width: 768px) {
- footer {
- padding: 20px;
- font-size: var(--fs-100);
- }
-
- .footerContainer {
- flex-direction: column;
- gap: var(--space-md);
- }
-
- .footerContainer ul {
- justify-content: center;
- gap: var(--space-md);
- }
+ footer {
+ padding: 20px;
+ font-size: var(--fs-100);
+ }
+
+ .footerContainer {
+ flex-direction: column;
+ gap: var(--space-md);
+ }
+
+ .footerContainer ul {
+ justify-content: center;
+ gap: var(--space-md);
+ }
}
diff --git a/frontend/src/components/Footer.tsx b/frontend/src/components/Footer.tsx
index 8962070..d3f2a80 100644
--- a/frontend/src/components/Footer.tsx
+++ b/frontend/src/components/Footer.tsx
@@ -1,26 +1,40 @@
-import { useState } from 'react';
-import styles from './Footer.module.css';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faXTwitter, faLinkedin, faGithub, faYoutube, faDiscord } from '@fortawesome/free-brands-svg-icons';
-import ntuLogoTitle from '../assets/images/ntuLogoTitle.webp';
-import ntuLogoTitleHover from '../assets/images/ntuLogoTitleHover.webp';
+import { useState } from "react";
+import styles from "./Footer.module.css";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import {
+ faXTwitter,
+ faLinkedin,
+ faGithub,
+ faYoutube,
+ faDiscord,
+} from "@fortawesome/free-brands-svg-icons";
+import ntuLogoTitle from "../assets/images/ntuLogoTitle.webp";
+import ntuLogoTitleHover from "../assets/images/ntuLogoTitleHover.webp";
const Footer = () => {
// Social Media Links
const socialMediaLinks = [
- { name: 'Twitter', url: 'https://x.com/Zyphaex', icon: faXTwitter },
- { name: 'LinkedIn', url: 'https://linkedin.com/in/samhillier/', icon: faLinkedin },
- { name: 'GitHub', url: 'https://github.com/Zyphaex', icon: faGithub },
- { name: 'YouTube', url: 'https://youtube.com/@Zyphaex', icon: faYoutube },
- { name: 'Discord', url: 'https://discord.com/invite/XfZHVfPr9C', icon: faDiscord },
+ { name: "Twitter", url: "https://x.com/Zyphaex", icon: faXTwitter },
+ {
+ name: "LinkedIn",
+ url: "https://linkedin.com/in/samhillier/",
+ icon: faLinkedin,
+ },
+ { name: "GitHub", url: "https://github.com/Zyphaex", icon: faGithub },
+ { name: "YouTube", url: "https://youtube.com/@Zyphaex", icon: faYoutube },
+ {
+ name: "Discord",
+ url: "https://discord.com/invite/XfZHVfPr9C",
+ icon: faDiscord,
+ },
];
// Footer Links
const footerLinks = [
- { name: 'About', href: 'about' },
- { name: 'Contact', href: 'contact' },
- { name: 'Terms & Conditions', href: 'terms' },
- { name: 'Privacy Policy', href: 'privacy' },
+ { name: "About", href: "about" },
+ { name: "Contact", href: "contact" },
+ { name: "Terms & Conditions", href: "terms" },
+ { name: "Privacy Policy", href: "privacy" },
];
const [isHovered, setIsHovered] = useState(false);
@@ -67,13 +81,18 @@ const Footer = () => {
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
>
-
+
{renderFooterLinks()}
{renderSocialMediaLinks()}
- © {new Date().getFullYear()} Sam Hillier. All Rights Reserved.
+
+ © {new Date().getFullYear()} Sam Hillier. All Rights Reserved.
+
);
diff --git a/frontend/src/components/Nav.module.css b/frontend/src/components/Nav.module.css
index e9d67cc..0c40202 100644
--- a/frontend/src/components/Nav.module.css
+++ b/frontend/src/components/Nav.module.css
@@ -1,168 +1,174 @@
nav {
- display: flex;
- margin: 20px 0;
- padding: 10px 20px;
- background-color: #383D40;
- border-radius: 50px;
- font-size: var(--fs-300);
- justify-content: space-between;
- align-items: center;
- gap: var(--space-lg);
- position: sticky;
- top: 0;
- z-index: 1000;
+ display: flex;
+ margin: 20px 0;
+ padding: 10px 20px;
+ background-color: #383d40;
+ border-radius: 50px;
+ font-size: var(--fs-300);
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-lg);
+ position: sticky;
+ top: 0;
+ z-index: 1000;
}
/* Page Links */
.navLinks {
- display: flex;
- margin: 0;
- list-style: none;
+ display: flex;
+ margin: 0;
+ list-style: none;
}
.navLinks a {
- padding: 20px;
+ padding: 20px;
}
.navHome {
- vertical-align: middle;
- font-size: 20px;
+ vertical-align: middle;
+ font-size: 20px;
}
/* Search Bar */
.searchContainer {
- display: flex;
- align-items: center;
+ display: flex;
+ align-items: center;
}
.searchInput {
- width: 100%;
- padding: 12px 40px 12px 20px;
- border: 2px solid #494949;
- border-radius: 50px;
- background-color: #55585a;
- color: hsl(var(--text3));
- transition: border-color 0.1s ease, background-color 0.1s ease, box-shadow 0.1s ease;
- font-size: var(--fs-200);
+ width: 100%;
+ padding: 12px 40px 12px 20px;
+ border: 2px solid #494949;
+ border-radius: 50px;
+ background-color: #55585a;
+ color: hsl(var(--text3));
+ transition: border-color 0.1s ease, background-color 0.1s ease,
+ box-shadow 0.1s ease;
+ font-size: var(--fs-200);
}
.searchInput:hover {
- border-color: hsl(var(--text2));
+ border-color: hsl(var(--text2));
}
.searchInput:focus {
- border-color: hsl(var(--text2));
- outline: none;
- box-shadow: 0 0 1px hsl(var(--text2));
+ border-color: hsl(var(--text2));
+ outline: none;
+ box-shadow: 0 0 1px hsl(var(--text2));
}
.searchInput::placeholder {
- color: hsl(var(--text3));
- opacity: 0.5;
+ color: hsl(var(--text3));
+ opacity: 0.5;
}
.searchInput:focus::placeholder {
- opacity: 0.3;
+ opacity: 0.3;
}
/* Search Button */
.searchButton {
- border: none;
- background: transparent;
- cursor: pointer;
- padding: 10px;
- margin-left: -47px;
- color: white;
- transition: color 0.1s ease, text-shadow 0.1s ease;
+ border: none;
+ background: transparent;
+ cursor: pointer;
+ padding: 10px;
+ margin-left: -47px;
+ color: white;
+ transition: color 0.1s ease, text-shadow 0.1s ease;
}
.searchButton:hover {
- color: hsl(var(--text2));
- text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
+ color: hsl(var(--text2));
+ text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
}
.searchButton svg {
- width: 20px;
- height: 20px;
- vertical-align: middle;
+ width: 20px;
+ height: 20px;
+ vertical-align: middle;
}
.mobileSearch {
- display: none;
+ display: none;
}
/* Hamburger Icon */
.hamburger {
- display: none;
- width: 25px;
- height: 25px;
- min-width: 25px;
- min-height: 25px;
- margin: 0 5px;
- flex-direction: column;
- justify-content: space-around;
- cursor: pointer;
+ display: none;
+ width: 25px;
+ height: 25px;
+ min-width: 25px;
+ min-height: 25px;
+ margin: 0 5px;
+ flex-direction: column;
+ justify-content: space-around;
+ cursor: pointer;
}
-
+
.hamburger span {
- display: block;
- width: 100%;
- height: 3px;
- background: white;
- border-radius: 3px;
- transition: background-color 0.1s ease, box-shadow 0.1s ease;
+ display: block;
+ width: 100%;
+ height: 3px;
+ background: white;
+ border-radius: 3px;
+ transition: background-color 0.1s ease, box-shadow 0.1s ease;
}
.hamburger:hover span {
- background-color: hsl(var(--text2));
- box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
+ background-color: hsl(var(--text2));
+ box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
}
/* Media Queries */
@media (max-width: 768px) {
- nav {
- flex-direction: column;
- border-radius: 25px;
- gap: var(--space-md);
- }
-
- .mobileSearch {
- display: flex;
- width: 100%;
- justify-content: space-between;
- align-items: center;
- gap: 10px;
- }
-
- .navLinks {
- display: none;
- width: 100%;
- padding: 10px 0;
- flex-direction: column;
- align-items: stretch;
- gap: 20px;
- }
-
- .navLinks a {
- display: block;
- width: 100%;
- padding: 5px 0;
- font-size: var(--fs-200);
- }
-
- .hamburger, .searchContainer {
- display: none;
- }
-
- .navLinks.showNav, .mobileSearch .hamburger, .mobileSearch .searchContainer {
- display: flex;
- }
-
- .searchContainer, .searchInput, .searchButton {
- width: 100%;
- }
-
- .searchContainer button {
- width: auto;
- }
-}
\ No newline at end of file
+ nav {
+ flex-direction: column;
+ border-radius: 25px;
+ gap: var(--space-md);
+ }
+
+ .mobileSearch {
+ display: flex;
+ width: 100%;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ }
+
+ .navLinks {
+ display: none;
+ width: 100%;
+ padding: 10px 0;
+ flex-direction: column;
+ align-items: stretch;
+ gap: 20px;
+ }
+
+ .navLinks a {
+ display: block;
+ width: 100%;
+ padding: 5px 0;
+ font-size: var(--fs-200);
+ }
+
+ .hamburger,
+ .searchContainer {
+ display: none;
+ }
+
+ .navLinks.showNav,
+ .mobileSearch .hamburger,
+ .mobileSearch .searchContainer {
+ display: flex;
+ }
+
+ .searchContainer,
+ .searchInput,
+ .searchButton {
+ width: 100%;
+ }
+
+ .searchContainer button {
+ width: auto;
+ }
+}
diff --git a/frontend/src/components/Nav.tsx b/frontend/src/components/Nav.tsx
index 2d764e5..1193050 100644
--- a/frontend/src/components/Nav.tsx
+++ b/frontend/src/components/Nav.tsx
@@ -1,6 +1,6 @@
-import { useState, useEffect, useRef } from 'react';
-import { FaHome, FaSearch } from 'react-icons/fa';
-import styles from './Nav.module.css';
+import { useState, useEffect, useRef } from "react";
+import { FaHome, FaSearch } from "react-icons/fa";
+import styles from "./Nav.module.css";
interface NavProps {
links?: { name: string; href: string }[];
@@ -9,29 +9,36 @@ interface NavProps {
}
const navLinks = [
- { name: 'All', href: '#' },
- { name: 'Avatars', href: '#avatars' },
- { name: 'Metaverse', href: '#metaverse' },
- { name: 'Art', href: '#art' },
- { name: 'Memberships', href: '#memberships' },
- { name: 'Commemorative', href: '#commemorative' },
+ { name: "All", href: "#" },
+ { name: "Avatars", href: "#avatars" },
+ { name: "Metaverse", href: "#metaverse" },
+ { name: "Art", href: "#art" },
+ { name: "Memberships", href: "#memberships" },
+ { name: "Commemorative", href: "#commemorative" },
];
-const Nav = ({ links = navLinks, onNavLinkClick, onSearchChange }: NavProps) => {
+const Nav = ({
+ links = navLinks,
+ onNavLinkClick,
+ onSearchChange,
+}: NavProps) => {
const [isNavVisible, setIsNavVisible] = useState(false);
- const [searchQuery, setSearchQuery] = useState('');
+ const [searchQuery, setSearchQuery] = useState("");
const navRef = useRef(null);
const toggleNav = () => {
setIsNavVisible(!isNavVisible);
};
- const handleLinkClick = (e: React.MouseEvent, name: string) => {
+ const handleLinkClick = (
+ e: React.MouseEvent,
+ name: string
+ ) => {
e.preventDefault();
onNavLinkClick(name);
- if (name === 'All') {
- setSearchQuery('');
- onSearchChange('');
+ if (name === "All") {
+ setSearchQuery("");
+ onSearchChange("");
}
};
@@ -42,9 +49,9 @@ const Nav = ({ links = navLinks, onNavLinkClick, onSearchChange }: NavProps) =>
}
}
- document.addEventListener('mousedown', handleClickOutside);
+ document.addEventListener("mousedown", handleClickOutside);
return () => {
- document.removeEventListener('mousedown', handleClickOutside);
+ document.removeEventListener("mousedown", handleClickOutside);
};
}, [navRef]);
@@ -62,7 +69,12 @@ const Nav = ({ links = navLinks, onNavLinkClick, onSearchChange }: NavProps) =>
-
+
@@ -73,23 +85,35 @@ const Nav = ({ links = navLinks, onNavLinkClick, onSearchChange }: NavProps) =>
-
+
-
+
);
-}
+};
export default Nav;
diff --git a/frontend/src/components/PriceTracker.module.css b/frontend/src/components/PriceTracker.module.css
index 5c37b65..42b18a7 100644
--- a/frontend/src/components/PriceTracker.module.css
+++ b/frontend/src/components/PriceTracker.module.css
@@ -1,28 +1,29 @@
.ticker {
- display: flex;
- align-items: center;
- font-size: var(--fs-300);
- color: hsl(var(--text2));
- transition: color 0.1s ease, text-shadow 0.1s ease;
+ display: flex;
+ align-items: center;
+ font-size: var(--fs-300);
+ color: hsl(var(--text2));
+ transition: color 0.1s ease, text-shadow 0.1s ease;
}
.icon {
- height: 25px;
- margin-right: 7px;
+ height: 25px;
+ margin-right: 7px;
}
.value {
- color: #fff;
- margin-left: 5px;
- transition: color 0.1s ease, text-shadow 0.1s ease;
+ color: #fff;
+ margin-left: 5px;
+ transition: color 0.1s ease, text-shadow 0.1s ease;
}
-.ticker:hover, .ticker:hover .value {
- color: hsl(var(--text2));
- text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
+.ticker:hover,
+.ticker:hover .value {
+ color: hsl(var(--text2));
+ text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
}
.ticker:active .value {
- color: #fff;
- text-shadow: 0 0 8px hsl(var(--text3));
+ color: #fff;
+ text-shadow: 0 0 8px hsl(var(--text3));
}
diff --git a/frontend/src/components/PriceTracker.tsx b/frontend/src/components/PriceTracker.tsx
index 947e466..d469b41 100644
--- a/frontend/src/components/PriceTracker.tsx
+++ b/frontend/src/components/PriceTracker.tsx
@@ -1,43 +1,54 @@
-import { useState, useEffect } from 'react';
-import axios from 'axios';
-import styles from './PriceTracker.module.css';
-import enjinLogo from '../assets/images/enjinLogo.webp';
+import { useState, useEffect } from "react";
+import axios from "axios";
+import styles from "./PriceTracker.module.css";
+import enjinLogo from "../assets/images/enjinLogo.webp";
const PriceTracker = () => {
- const [price, setPrice] = useState(null);
+ const [price, setPrice] = useState(null);
- useEffect(() => {
- const fetchPrice = async () => {
- try {
- const response = await axios.get('/api/cryptocurrency/quotes/latest?symbol=ENJ', {
- headers: {
- 'X-CMC_PRO_API_KEY': import.meta.env.VITE_CMC_API_KEY
- }
- });
- const fetchedPrice = response.data?.data?.ENJ?.quote?.USD?.price;
- if (typeof fetchedPrice === 'number') {
- setPrice(fetchedPrice);
- } else {
- console.error('Invalid price format:', fetchedPrice);
- }
- } catch (error) {
- console.error('Error fetching ENJ price:', error);
- }
- };
+ useEffect(() => {
+ const fetchPrice = async () => {
+ try {
+ const response = await axios.get(
+ "/api/cryptocurrency/quotes/latest?symbol=ENJ",
+ {
+ headers: {
+ "X-CMC_PRO_API_KEY": import.meta.env.VITE_CMC_API_KEY,
+ },
+ }
+ );
+ const fetchedPrice = response.data?.data?.ENJ?.quote?.USD?.price;
+ if (typeof fetchedPrice === "number") {
+ setPrice(fetchedPrice);
+ } else {
+ console.error("Invalid price format:", fetchedPrice);
+ }
+ } catch (error) {
+ console.error("Error fetching ENJ price:", error);
+ }
+ };
- fetchPrice();
- }, []);
+ fetchPrice();
+ }, []);
- return (
-
-
-
ENJ
- {price !== null
- ?
${price.toFixed(2)}
- :
$?.??}
-
-
- );
+ return (
+
+
+
+ ENJ
+ {price !== null ? (
+
${price.toFixed(2)}
+ ) : (
+
$?.??
+ )}
+
+
+ );
};
export default PriceTracker;
diff --git a/frontend/src/components/TokenModal.module.css b/frontend/src/components/TokenModal.module.css
index c70b9ae..b5eba85 100644
--- a/frontend/src/components/TokenModal.module.css
+++ b/frontend/src/components/TokenModal.module.css
@@ -12,7 +12,7 @@
}
.modalContent {
- background: radial-gradient(circle at center, #48555A 0%, #383D40 100%);
+ background: radial-gradient(circle at center, #48555a 0%, #383d40 100%);
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
padding: 20px;
@@ -22,7 +22,8 @@
box-shadow: 0 0 5px 2px hsl(var(--text2));
}
-.modalContent h3, .modalContent h4 {
+.modalContent h3,
+.modalContent h4 {
transition: color 0.1s ease;
}
@@ -41,7 +42,12 @@
.modalContent p {
color: white;
font-size: 16px;
- background-image: radial-gradient(circle at center, #7569B5 0%, #8376D8 50%, #6258A4 100%);
+ background-image: radial-gradient(
+ circle at center,
+ #7569b5 0%,
+ #8376d8 50%,
+ #6258a4 100%
+ );
border-radius: 50px;
padding: 5px 0;
margin-bottom: 10px;
@@ -81,7 +87,12 @@
.modalContent .tokenIdImportContainer button {
padding: 5px 10px;
border-radius: 5px;
- background-image: radial-gradient(circle at center, #7569B5 0%, #8376D8 50%, #6258A4 100%);
+ background-image: radial-gradient(
+ circle at center,
+ #7569b5 0%,
+ #8376d8 50%,
+ #6258a4 100%
+ );
cursor: pointer;
}
@@ -118,18 +129,18 @@
/* Media Queries */
@media (max-width: 768px) {
.modalContent {
- width: 300px;
+ width: 300px;
}
.modalContent h3 {
- font-size: 16px;
+ font-size: 16px;
}
.modalContent h4 {
- font-size: 14px;
+ font-size: 14px;
}
-
+
.modalContent p {
- font-size: 14px;
+ font-size: 14px;
}
-}
\ No newline at end of file
+}
diff --git a/frontend/src/components/TokenModal.tsx b/frontend/src/components/TokenModal.tsx
index f2a6a79..69e688d 100644
--- a/frontend/src/components/TokenModal.tsx
+++ b/frontend/src/components/TokenModal.tsx
@@ -1,9 +1,9 @@
-import { useEffect, useState } from 'react';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faCopy } from '@fortawesome/free-solid-svg-icons';
-import styles from './TokenModal.module.css';
-import nftioLogo from '../assets/images/nftioLogo.webp';
-import nftioLogoHover from '../assets/images/nftioLogoHover.webp';
+import { useEffect, useState } from "react";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faCopy } from "@fortawesome/free-solid-svg-icons";
+import styles from "./TokenModal.module.css";
+import nftioLogo from "../assets/images/nftioLogo.webp";
+import nftioLogoHover from "../assets/images/nftioLogoHover.webp";
interface TokenModalProps {
isOpen: boolean;
@@ -20,14 +20,15 @@ interface TokenModalProps {
const TokenModal: React.FC = ({ isOpen, onClose, token }) => {
const [isHovered, setIsHovered] = useState(false);
-
+
const handleCopyToClipboard = () => {
- navigator.clipboard.writeText(token.id)
+ navigator.clipboard
+ .writeText(token.id)
.then(() => {
- alert('Token ID copied to clipboard!');
+ alert("Token ID copied to clipboard!");
})
- .catch(err => {
- console.error('Error copying ID to clipboard', err);
+ .catch((err) => {
+ console.error("Error copying ID to clipboard", err);
});
};
@@ -40,11 +41,11 @@ const TokenModal: React.FC = ({ isOpen, onClose, token }) => {
};
if (isOpen) {
- document.addEventListener('click', handleOutsideClick);
+ document.addEventListener("click", handleOutsideClick);
}
return () => {
- document.removeEventListener('click', handleOutsideClick);
+ document.removeEventListener("click", handleOutsideClick);
};
}, [isOpen, onClose]);
@@ -74,10 +75,10 @@ const TokenModal: React.FC = ({ isOpen, onClose, token }) => {
onMouseLeave={() => setIsHovered(false)}
>
View on
-
diff --git a/frontend/src/index.css b/frontend/src/index.css
index ec0666d..cac308e 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -1,63 +1,63 @@
*,
*::before,
*::after {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
}
@font-face {
- font-family: 'Manrope';
- src: url('./assets/fonts/manrope.regular.otf') format('opentype');
- font-weight: normal;
- font-style: normal;
+ font-family: "Manrope";
+ src: url("./assets/fonts/manrope.regular.otf") format("opentype");
+ font-weight: normal;
+ font-style: normal;
}
:root {
- /* fonts */
- --fs-100: 14px;
- --fs-200: 16px;
- --fs-300: 18px;
- --fs-400: 32px;
- --fs-500: 44px;
- --lh-1: 1;
- --lh-1-2: 1.2;
- --lh-1-4: 1.4;
+ /* fonts */
+ --fs-100: 14px;
+ --fs-200: 16px;
+ --fs-300: 18px;
+ --fs-400: 32px;
+ --fs-500: 44px;
+ --lh-1: 1;
+ --lh-1-2: 1.2;
+ --lh-1-4: 1.4;
- /* colours */
- --bkg: 0, 0%, 12%;
- --text: 0, 0%, 100%;
- --text2: 248, 56%, 65%;
- --text3: #E6E6E6;
+ /* colours */
+ --bkg: 0, 0%, 12%;
+ --text: 0, 0%, 100%;
+ --text2: 248, 56%, 65%;
+ --text3: #e6e6e6;
- /* utils */
- --space-sm: 5px;
- --space-md: 10px;
- --space-lg: 20px;
- --content: 50ch;
- --round-sm: 4px;
- --round-md: 10px;
- --round-lg: 20px;
- --round-full: 100vmax;
- --box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.25);
+ /* utils */
+ --space-sm: 5px;
+ --space-md: 10px;
+ --space-lg: 20px;
+ --content: 50ch;
+ --round-sm: 4px;
+ --round-md: 10px;
+ --round-lg: 20px;
+ --round-full: 100vmax;
+ --box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.25);
}
body {
- display: block;
- place-items: center;
- min-height: 100vh;
- font-family: 'Manrope', sans-serif;
- font-size: var(--fs-200);
- line-height: var(--lh-1-4);
- font-weight: 400;
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- -webkit-text-size-adjust: 100%;
- background-color: hsl(var(--bkg));
- color: hsl(var(--text));
- background: linear-gradient(to bottom right, #000000, #333333), #333333;
+ display: block;
+ place-items: center;
+ min-height: 100vh;
+ font-family: "Manrope", sans-serif;
+ font-size: var(--fs-200);
+ line-height: var(--lh-1-4);
+ font-weight: 400;
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+ background-color: hsl(var(--bkg));
+ color: hsl(var(--text));
+ background: linear-gradient(to bottom right, #000000, #333333), #333333;
}
h1,
@@ -66,48 +66,48 @@ h3,
h4,
h5,
h6 {
- font-weight: 600;
- line-height: var(--lh-1-2);
- font-size: var(--fs-500);
- color: hsl(var(--text2));
+ font-weight: 600;
+ line-height: var(--lh-1-2);
+ font-size: var(--fs-500);
+ color: hsl(var(--text2));
}
a {
- text-decoration: none;
- color: hsl(var(--text3));
- transition: color 0.1s ease, text-shadow 0.1s ease;
+ text-decoration: none;
+ color: hsl(var(--text3));
+ transition: color 0.1s ease, text-shadow 0.1s ease;
}
a:hover {
- color: hsl(var(--text2));
- text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
+ color: hsl(var(--text2));
+ text-shadow: 1px 1px 8px rgba(0, 0, 0, 0.25);
}
a:active {
- color: hsl(var(--text2));
- text-shadow: 0 0 8px hsl(var(--text3));
+ color: hsl(var(--text2));
+ text-shadow: 0 0 8px hsl(var(--text3));
}
.cardContainer {
- width: 100%;
- display: flex;
- flex-wrap: wrap;
- justify-content: center;
- gap: 30px;
+ width: 100%;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 30px;
}
/* Media Queries */
@media (max-width: 768px) {
- h1,
- h2,
- h3,
- h4,
- h5,
- h6 {
- font-size: var(--fs-400);
- }
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ font-size: var(--fs-400);
+ }
- .cardContainer {
- gap: 20px;
- }
-}
\ No newline at end of file
+ .cardContainer {
+ gap: 20px;
+ }
+}
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index 3d7150d..966f17a 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -1,10 +1,10 @@
-import React from 'react'
-import ReactDOM from 'react-dom/client'
-import App from './App.tsx'
-import './index.css'
+import React from "react";
+import ReactDOM from "react-dom/client";
+import App from "./App.tsx";
+import "./index.css";
-ReactDOM.createRoot(document.getElementById('root')!).render(
+ReactDOM.createRoot(document.getElementById("root")!).render(
- ,
-)
+
+);
diff --git a/frontend/src/tokens.ts b/frontend/src/tokens.ts
index a995366..e45aa9d 100644
--- a/frontend/src/tokens.ts
+++ b/frontend/src/tokens.ts
@@ -1,40 +1,280 @@
const tokens = [
- { name: 'Enjin MFT', id: '3312-6000000000000113', collection: 'Enjin Collection', type: 'Metaverse', imageUrl: 'https://openseauserdata.com/files/34a76f843b3470272726fabe515eccba.jpg', link: 'https://nft.io/asset/3312-127605887595351928871620098057039773696' },
- { name: 'The Green Box', id: '3404-70C000000000026A', collection: 'Green Box by Maxim', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/f18b934aeda7301560809bf002be0eb2bcb8316db01baec1418ee4c97aee4d00.png', link: 'https://nft.io/collection/green-box-by-maxim/' },
- { name: 'Degens', id: '2', collection: 'Degens', type: 'Avatars', imageUrl: 'https://platform.production.enjinusercontent.com/enterprise/degens/assets/media/29.png', link: '#' },
-
- { name: 'Imperial Sovereign', id: '2100-1', collection: 'The Etherscape', type: 'Memberships', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/cc624a9397569e36883d97c5f19a638b4e490f63dd0bddb65b9332111ec16b28.png', link: 'https://nft.io/asset/2100-1' },
- { name: 'Founders Token ENJ Beam Club', id: '2190-7', collection: 'ENJ Beam Club', type: 'Memberships', imageUrl: 'https://nft.production.enjinusercontent.com/uploads/files/5fijlg0p5nx88r67.png', link: 'https://nft.io/asset/2190-7' },
- { name: 'Tipper Token', id: '2479-9', collection: 'NFT Tipper (Bot)', type: 'Memberships', imageUrl: 'https://nft.production.enjinusercontent.com/uploads/files/tzk5om2pvhpw8cbj.jpg', link: 'https://nft.io/asset/2479-9' },
-
- { name: 'Epochrome Sword', id: '2967-5080000000000029', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/9a1752e040920a53ee6cbb8c585c6a85da87f8fa6f20c16e37d8cb24f14ac385.jpg', link: 'https://nft.io/asset/2967-107002853660685728525072975374659358631' },
- { name: 'Starbow', id: '2967-50800000000006E', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/5b3c74aba4d392e2665e2f911210a4a600ee3ec8780f44bbf4cd05f4bd39d12c.jpeg', link: 'https://nft.io/asset/2967-107002853660685760308813014376216789618' },
- { name: 'APG-M55', id: '2967-508000000000002B', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/9b9c766dba960c17a0b114dd68ad005d5f0f4c5c6d0ccf774a967dd93fb5f873.jpg', link: 'https://nft.io/asset/2967-107002853660685728561966463522078458491' },
- { name: 'Oindrasdin', id: '2967-5080000000000027', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/2b8402c0b3a2c7a78a3579d4e8c7fbe045aa448b4964e547b6efed7e4118f431.jpg', link: 'https://nft.io/asset/2967-107002853660685728488179487227240255171' },
- { name: 'ForgeHammer', id: '2967-508000000000002A', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/f1f42d0fc10cd1f89fcfabba95acd5ca5477162e9551f5ba3c85f5effa50f45c.jpg', link: 'https://nft.io/asset/2967-107002853660685728543519719448368909321' },
- { name: 'Soulshift Armor', id: '2967-508000000000002D', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/23d9054c219b1f310f809161dd930f0ad3882ee73f2d8b8e34268735c54e2b4b.jpg', link: 'https://nft.io/asset/2967-107002853660685728598859951669497561717' },
- { name: 'Stormwall', id: '2967-508000000000002C', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/006d26a8479356fddae2b76170baf51d04e2d663f851f09ba975780f0d6d7577.jpg', link: 'https://nft.io/asset/2967-107002853660685728580413207595788010096' },
- { name: 'Aeonclipse Key', id: '2967-50000000000000F9', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/807f05cd0ae3dd6ca57ae56a6dfec3fce0ea66286a30043e27f99b4d59ce128d.jpg', link: 'https://nft.io/asset/2967-106338239662793274425543839176105918464' },
- { name: 'Archspire', id: '2967-50000000000000C4', collection: 'The Multiverse', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/395a0e11130e05ef0c3e751baa8ff2690c904f04eca0d9e287bc5a80eafb739d.jpg', link: 'https://nft.io/asset/2967-106338239662793273447866403269499682816' },
+ {
+ name: "Enjin MFT",
+ id: "3312-6000000000000113",
+ collection: "Enjin Collection",
+ type: "Metaverse",
+ imageUrl:
+ "https://openseauserdata.com/files/34a76f843b3470272726fabe515eccba.jpg",
+ link: "https://nft.io/asset/3312-127605887595351928871620098057039773696",
+ },
+ {
+ name: "The Green Box",
+ id: "3404-70C000000000026A",
+ collection: "Green Box by Maxim",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/f18b934aeda7301560809bf002be0eb2bcb8316db01baec1418ee4c97aee4d00.png",
+ link: "https://nft.io/collection/green-box-by-maxim/",
+ },
+ {
+ name: "Degens",
+ id: "2",
+ collection: "Degens",
+ type: "Avatars",
+ imageUrl:
+ "https://platform.production.enjinusercontent.com/enterprise/degens/assets/media/29.png",
+ link: "#",
+ },
- { name: 'The N-Chip', id: '3312-70C0000000002BCE', collection: 'Enjin Collection', type: 'Commemorative', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/433533c0d1058c547c35322124b57613e643e3a13d1137ca0f0c8056a043d4bb.png', link: 'https://nft.io/asset/3312-149870456524749471531692288625520682901' },
- { name: 'Rakku, Mecha Clan Shockslinger', id: '3044-78C0000000003377', collection: '#MyFirstNFT', type: 'Avatars', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/d1010448b3c61556a88ef787c2027d8005c29a75998e0712db371120c2036153.gif', link: 'https://nft.io/asset/3044-160504280491028834688987873652194148353' },
- { name: 'Thresh, Mecha Clan Bounty Hunter', id: '3044-78C0000000003376', collection: '#MyFirstNFT', type: 'Avatars', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/badb13912192394e16bbc8a0f9b9f7d675677f67eaf5a0215fed1478af948a9b.gif', link: 'https://nft.io/asset/3044-160504280491028834670541129578484596741' },
- { name: 'Pyjama Clan Warrior', id: '3044-78C0000000003375', collection: '#MyFirstNFT', type: 'Avatars', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/89fa4b8a7931400dbe8d1d9d6f4266400d359c581d85cec6e395de5840b35280.gif', link: 'https://nft.io/asset/3044-160504280491028834652094385504775045145' },
- { name: 'Pyjama Clan Apprentice', id: '3044-78C0000000003374', collection: '#MyFirstNFT', type: 'Avatars', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/c6c1cef2e5e62a4cf3a8484da1678123d376caa6a56d43231868acb1a0670543.gif', link: 'https://nft.io/asset/3044-160504280491028834633647641431065493919' },
+ {
+ name: "Imperial Sovereign",
+ id: "2100-1",
+ collection: "The Etherscape",
+ type: "Memberships",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/cc624a9397569e36883d97c5f19a638b4e490f63dd0bddb65b9332111ec16b28.png",
+ link: "https://nft.io/asset/2100-1",
+ },
+ {
+ name: "Founders Token ENJ Beam Club",
+ id: "2190-7",
+ collection: "ENJ Beam Club",
+ type: "Memberships",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/uploads/files/5fijlg0p5nx88r67.png",
+ link: "https://nft.io/asset/2190-7",
+ },
+ {
+ name: "Tipper Token",
+ id: "2479-9",
+ collection: "NFT Tipper (Bot)",
+ type: "Memberships",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/uploads/files/tzk5om2pvhpw8cbj.jpg",
+ link: "https://nft.io/asset/2479-9",
+ },
- { name: 'Enjin Website Builder Service Medal', id: '2088', collection: 'Enjin Website Builder Service Medal', type: 'Commemorative', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/3c83e2a693a068eb35bb2e19e6f68ae2d1075e2e569e23a6c4f6e0d01c5621c9.gif', link: 'https://nft.io/collection/enjin-website-builder-service-medal/' },
- { name: 'Enjin Wallet 2.0 Beta Tester Badge', id: '3312-70C0000000003379', collection: 'Enjin Collection', type: 'Commemorative', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/601be4206b4e32a39d2d86ed1b82d120fa6aeabef524a300be582113a3d173ab.gif', link: 'https://nft.io/asset/3312-149870456524749507742650905317370513202' },
- { name: 'EnjinX Launch Token', id: '3312-70000000000001A1', collection: 'Enjin Collection', type: 'Commemorative', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/de1335aee52e0c05c59dfb768c3cb4a1e4e6acfd1a7fbeab0176fae035197a01.jpg', link: 'https://nft.io/asset/3312-148873535527910585457518669488281616384' },
- { name: 'Emi the Fearless Woman', id: '2091', collection: 'Emi the Fearless Woman', type: 'Commemorative', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/59bda0bee24c43b092b9ee6e19622a22822db74e9f70c8253dbf00ddc37d37b4.png', link: 'https://nft.io/collection/emi-the-fearless-woman' },
+ {
+ name: "Epochrome Sword",
+ id: "2967-5080000000000029",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/9a1752e040920a53ee6cbb8c585c6a85da87f8fa6f20c16e37d8cb24f14ac385.jpg",
+ link: "https://nft.io/asset/2967-107002853660685728525072975374659358631",
+ },
+ {
+ name: "Starbow",
+ id: "2967-50800000000006E",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/5b3c74aba4d392e2665e2f911210a4a600ee3ec8780f44bbf4cd05f4bd39d12c.jpeg",
+ link: "https://nft.io/asset/2967-107002853660685760308813014376216789618",
+ },
+ {
+ name: "APG-M55",
+ id: "2967-508000000000002B",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/9b9c766dba960c17a0b114dd68ad005d5f0f4c5c6d0ccf774a967dd93fb5f873.jpg",
+ link: "https://nft.io/asset/2967-107002853660685728561966463522078458491",
+ },
+ {
+ name: "Oindrasdin",
+ id: "2967-5080000000000027",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/2b8402c0b3a2c7a78a3579d4e8c7fbe045aa448b4964e547b6efed7e4118f431.jpg",
+ link: "https://nft.io/asset/2967-107002853660685728488179487227240255171",
+ },
+ {
+ name: "ForgeHammer",
+ id: "2967-508000000000002A",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/f1f42d0fc10cd1f89fcfabba95acd5ca5477162e9551f5ba3c85f5effa50f45c.jpg",
+ link: "https://nft.io/asset/2967-107002853660685728543519719448368909321",
+ },
+ {
+ name: "Soulshift Armor",
+ id: "2967-508000000000002D",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/23d9054c219b1f310f809161dd930f0ad3882ee73f2d8b8e34268735c54e2b4b.jpg",
+ link: "https://nft.io/asset/2967-107002853660685728598859951669497561717",
+ },
+ {
+ name: "Stormwall",
+ id: "2967-508000000000002C",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/006d26a8479356fddae2b76170baf51d04e2d663f851f09ba975780f0d6d7577.jpg",
+ link: "https://nft.io/asset/2967-107002853660685728580413207595788010096",
+ },
+ {
+ name: "Aeonclipse Key",
+ id: "2967-50000000000000F9",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/807f05cd0ae3dd6ca57ae56a6dfec3fce0ea66286a30043e27f99b4d59ce128d.jpg",
+ link: "https://nft.io/asset/2967-106338239662793274425543839176105918464",
+ },
+ {
+ name: "Archspire",
+ id: "2967-50000000000000C4",
+ collection: "The Multiverse",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/395a0e11130e05ef0c3e751baa8ff2690c904f04eca0d9e287bc5a80eafb739d.jpg",
+ link: "https://nft.io/asset/2967-106338239662793273447866403269499682816",
+ },
- { name: 'Priceless Binance Hoodie', id: '3363-70C0000000000028', collection: 'Binance', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/67d254c8ee72edcb151789f7fc44dfa718c637fa5fbcebf5da444bd7e5bc4525.png', link: 'https://nft.io/asset/3363-149870456524749265407774008994990915585' },
- { name: 'Exclusive Binance Hoodie', id: '3363-70C0000000000029', collection: 'Binance', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/051b12ebcc25652a6027cbef0fb8e832b9c8b202887c39f6c3c4acb4153099e6.png', link: 'https://nft.io/asset/3363-149870456524749265426220753068700467201' },
- { name: 'Iconic Binance Hoodie', id: '3363-70C000000000002E', collection: 'Binance', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/metadata/enjin/media/aa1b96178ba14b57be1802052f40538ea6aba4275dd6f65cf5530043b695e257.png', link: 'https://nft.io/asset/3363-149870456524749265518454473437248225507' },
+ {
+ name: "The N-Chip",
+ id: "3312-70C0000000002BCE",
+ collection: "Enjin Collection",
+ type: "Commemorative",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/433533c0d1058c547c35322124b57613e643e3a13d1137ca0f0c8056a043d4bb.png",
+ link: "https://nft.io/asset/3312-149870456524749471531692288625520682901",
+ },
+ {
+ name: "Rakku, Mecha Clan Shockslinger",
+ id: "3044-78C0000000003377",
+ collection: "#MyFirstNFT",
+ type: "Avatars",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/d1010448b3c61556a88ef787c2027d8005c29a75998e0712db371120c2036153.gif",
+ link: "https://nft.io/asset/3044-160504280491028834688987873652194148353",
+ },
+ {
+ name: "Thresh, Mecha Clan Bounty Hunter",
+ id: "3044-78C0000000003376",
+ collection: "#MyFirstNFT",
+ type: "Avatars",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/badb13912192394e16bbc8a0f9b9f7d675677f67eaf5a0215fed1478af948a9b.gif",
+ link: "https://nft.io/asset/3044-160504280491028834670541129578484596741",
+ },
+ {
+ name: "Pyjama Clan Warrior",
+ id: "3044-78C0000000003375",
+ collection: "#MyFirstNFT",
+ type: "Avatars",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/89fa4b8a7931400dbe8d1d9d6f4266400d359c581d85cec6e395de5840b35280.gif",
+ link: "https://nft.io/asset/3044-160504280491028834652094385504775045145",
+ },
+ {
+ name: "Pyjama Clan Apprentice",
+ id: "3044-78C0000000003374",
+ collection: "#MyFirstNFT",
+ type: "Avatars",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/c6c1cef2e5e62a4cf3a8484da1678123d376caa6a56d43231868acb1a0670543.gif",
+ link: "https://nft.io/asset/3044-160504280491028834633647641431065493919",
+ },
- { name: 'Goblin Cart', id: '3892-1', collection: 'ENJ Excavators', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/uploads/files/zoofqmufcxkgqhxw.jpg', link: 'https://nft.io/asset/3892-1' },
- { name: 'Goblin Drill', id: '3892-2', collection: 'ENJ Excavators', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/uploads/files/dmjpdsoxpmqj0wrb.jpg', link: 'https://nft.io/asset/3892-2' },
- { name: 'Goblin Drill Squad', id: '3892-3', collection: 'ENJ Excavators', type: 'Metaverse', imageUrl: 'https://nft.production.enjinusercontent.com/uploads/files/urkldvd7oygqvdz4.jpg', link: 'https://nft.io/asset/3892-3' },
+ {
+ name: "Enjin Website Builder Service Medal",
+ id: "2088",
+ collection: "Enjin Website Builder Service Medal",
+ type: "Commemorative",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/3c83e2a693a068eb35bb2e19e6f68ae2d1075e2e569e23a6c4f6e0d01c5621c9.gif",
+ link: "https://nft.io/collection/enjin-website-builder-service-medal/",
+ },
+ {
+ name: "Enjin Wallet 2.0 Beta Tester Badge",
+ id: "3312-70C0000000003379",
+ collection: "Enjin Collection",
+ type: "Commemorative",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/601be4206b4e32a39d2d86ed1b82d120fa6aeabef524a300be582113a3d173ab.gif",
+ link: "https://nft.io/asset/3312-149870456524749507742650905317370513202",
+ },
+ {
+ name: "EnjinX Launch Token",
+ id: "3312-70000000000001A1",
+ collection: "Enjin Collection",
+ type: "Commemorative",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/de1335aee52e0c05c59dfb768c3cb4a1e4e6acfd1a7fbeab0176fae035197a01.jpg",
+ link: "https://nft.io/asset/3312-148873535527910585457518669488281616384",
+ },
+ {
+ name: "Emi the Fearless Woman",
+ id: "2091",
+ collection: "Emi the Fearless Woman",
+ type: "Commemorative",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/59bda0bee24c43b092b9ee6e19622a22822db74e9f70c8253dbf00ddc37d37b4.png",
+ link: "https://nft.io/collection/emi-the-fearless-woman",
+ },
+
+ {
+ name: "Priceless Binance Hoodie",
+ id: "3363-70C0000000000028",
+ collection: "Binance",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/67d254c8ee72edcb151789f7fc44dfa718c637fa5fbcebf5da444bd7e5bc4525.png",
+ link: "https://nft.io/asset/3363-149870456524749265407774008994990915585",
+ },
+ {
+ name: "Exclusive Binance Hoodie",
+ id: "3363-70C0000000000029",
+ collection: "Binance",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/051b12ebcc25652a6027cbef0fb8e832b9c8b202887c39f6c3c4acb4153099e6.png",
+ link: "https://nft.io/asset/3363-149870456524749265426220753068700467201",
+ },
+ {
+ name: "Iconic Binance Hoodie",
+ id: "3363-70C000000000002E",
+ collection: "Binance",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/metadata/enjin/media/aa1b96178ba14b57be1802052f40538ea6aba4275dd6f65cf5530043b695e257.png",
+ link: "https://nft.io/asset/3363-149870456524749265518454473437248225507",
+ },
+
+ {
+ name: "Goblin Cart",
+ id: "3892-1",
+ collection: "ENJ Excavators",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/uploads/files/zoofqmufcxkgqhxw.jpg",
+ link: "https://nft.io/asset/3892-1",
+ },
+ {
+ name: "Goblin Drill",
+ id: "3892-2",
+ collection: "ENJ Excavators",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/uploads/files/dmjpdsoxpmqj0wrb.jpg",
+ link: "https://nft.io/asset/3892-2",
+ },
+ {
+ name: "Goblin Drill Squad",
+ id: "3892-3",
+ collection: "ENJ Excavators",
+ type: "Metaverse",
+ imageUrl:
+ "https://nft.production.enjinusercontent.com/uploads/files/urkldvd7oygqvdz4.jpg",
+ link: "https://nft.io/asset/3892-3",
+ },
];
export default tokens;