├── .DS_Store ├── .babelrc ├── .gitignore ├── README.md ├── components ├── Asset.js ├── Card.js ├── Card2D.js ├── Card3D.js ├── CardColumn.js ├── CardDetails.js ├── CardGrid.js ├── CardLive.js ├── CardRow.js ├── CardRowHeader.js ├── CardSvg.js ├── CardSwitch.js ├── Clip.js ├── CustomToast.js ├── FileBrowser.js ├── FileInput.js ├── Footer.js ├── Hero.js ├── LandCard.js ├── LandCardDetails.js ├── LandCardGrid.js ├── LandCardRow.js ├── Loader.js ├── Map.js ├── Masonry.js ├── Minter.js ├── Navbar.js ├── Profile.js ├── ProfileCards.js ├── ProgressBar.js ├── ShaderToyRenderer.js ├── User.js └── ViewSwitch.js ├── constants ├── ActionTypes.js ├── ApiKeys.js ├── AssetTypes.js ├── CardSize.js ├── Context.js ├── InitialStateValues.js ├── NetworkType.js └── UnlockConstants.js ├── functions ├── AssetFunctions.js ├── Functions.js ├── Storage.js ├── UIStateFunctions.js └── UserFunctions.js ├── libs ├── BufferGeometryUtils.js ├── GLTFExporter.js ├── GLTFLoader.js ├── atlaspack.js ├── bip39.js ├── contextLib.js ├── ethereumjs-tx.js ├── hdkey.js ├── three.module.js └── web3.min.js ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── 404.js ├── _app.js ├── accounts.js ├── accounts │ └── [id].js ├── activity.js ├── activity │ └── [id].js ├── assets │ └── [id].js ├── bake │ └── [id].js ├── discordbot.js ├── fly.js ├── hiring.js ├── hiring │ ├── 3dartist.js │ ├── avatarartist.js │ ├── blockchainengineer.js │ ├── designer.js │ ├── frontendengineer.js │ ├── gameengineer.js │ ├── infrastructureengineer.js │ └── userexperience.js ├── index.js ├── land.js ├── land │ └── [id].js ├── login.js ├── map.js ├── mint.js ├── mint │ └── [id].js ├── mounts.js ├── pets.js ├── test-page.js └── tv │ └── [id].js ├── public ├── .DS_Store ├── 404.png ├── Avocado.glb ├── Chill1.mp3 ├── Default Bot (2).vrm ├── Default Bot (6).vrm ├── Neon1280.mp4 ├── Neon1920.mp4 ├── Steps.mp4 ├── audio.svg ├── avatar.svg ├── backpack_v1.glb ├── cancel.svg ├── cardback.jpg ├── cardback.png ├── cardback.svg ├── cards-placeholder.png ├── cards-placeholder.svg ├── cards.png ├── cards.svg ├── chain-mail.svg ├── chest.svg ├── chevron-down.svg ├── chevron-left.svg ├── chevron-up.svg ├── citadel.png ├── curve.svg ├── defaulthomespace.svg ├── disW.svg ├── discord.svg ├── discordbothero.gif ├── discordlogo.svg ├── dots.svg ├── error.svg ├── ethereum.png ├── ethereum.svg ├── eths.png ├── expand.svg ├── favicon.ico ├── file.svg ├── fonts │ ├── Futura Std Bold Oblique.otf │ ├── Futura Std Heavy.otf │ ├── FuturaLT-Book.ttf │ ├── FuturaLT-CondensedLight.ttf │ ├── FuturaLT.woff2 │ ├── GeosansLight-Oblique.ttf │ ├── GeosansLight.ttf │ ├── Gill Sans Condensed Bold.ttf │ ├── Gill Sans.otf │ ├── MS Gothic.ttf │ ├── PressStart2P-Regular.ttf │ ├── RobotoCondensed-Light.ttf │ ├── RobotoCondensed-Regular.ttf │ └── SanvitoPro-LtCapt.otf ├── fox.svg ├── geometry.js ├── geometry.wasm ├── gif.svg ├── github.svg ├── gondola.png ├── gondola2.png ├── grid.png ├── heart_empty.svg ├── heart_full.svg ├── help.svg ├── hermes_var3.glb ├── hero.gif ├── house.svg ├── html.svg ├── icon-ethereum.svg ├── icon-gif.svg ├── icon-glb.svg ├── icon-jpg.svg ├── icon-vrm.svg ├── icon-webaverse.svg ├── icons │ ├── plus.svg │ └── stone-crafting.svg ├── image.svg ├── info.svg ├── landingImage2.png ├── landingImage3.png ├── landingImage4.png ├── lock.svg ├── locked-box.svg ├── maximize.svg ├── mellow.jpg ├── mint.svg ├── minting.png ├── noun_Boots_937032.svg ├── noun_Helmet_937034.svg ├── noun_Pet_1307711.svg ├── noun_Seat_2522171.svg ├── noun_body armor_937041.svg ├── noun_glove_937033.svg ├── pencil.svg ├── polygon.png ├── preview.png ├── rabbit.svg ├── rainbow-dash.gif ├── refresh.svg ├── repo.svg ├── road.svg ├── scooter.svg ├── search.svg ├── secret.svg ├── shebang.gif ├── sidechain.svg ├── silk.svg ├── silks.png ├── sofa.svg ├── soundwaves54.jpg ├── squiggle.svg ├── storage.svg ├── sword.svg ├── threeeMain.png ├── trade.svg ├── twitter.svg ├── upload.svg ├── vercel.svg ├── video.svg ├── wallet.svg ├── warning.svg └── webaverse.png ├── styles ├── Activity.css ├── Card.css ├── CardColumn.css ├── CardDetails.css ├── CardGrid.css ├── CardRowHeader.module.css ├── CardSvg.css ├── Discordbot.module.css ├── Footer.css ├── Hiring.css ├── Home.module.css ├── IFrame.css ├── LandCard.css ├── LandCardGrid.css ├── Mint.css ├── Navbar.css ├── Profile.css ├── ProgressBar.css └── globals.css └── webaverse ├── alea.js ├── app-object.js ├── blockchain.js ├── build.js ├── color-scheme.js ├── constants.js ├── jszip-utils.js ├── jszip.js ├── procgen.js ├── storage.js ├── three.module.js ├── util.js ├── wavesurfer.js └── wbn.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webaverse/dashboard/69af182d32c55f5399dc135fb3265e5f4f81ae39/.DS_Store -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["next/babel"], 3 | "ignore": [ 4 | "node_modules", 5 | "libs", 6 | "functions", 7 | "webaverse", 8 | "sidechain" 9 | ] 10 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .next 3 | dist 4 | build 5 | 6 | .vercel 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # webaverse.com 2 | 3 |

Web dashboard for minting and interacting with metaverse NFTs

4 | 5 |
6 | Site 7 | — 8 | Docs 9 | — 10 | Discord 11 | — 12 | Blog 13 | — 14 | Twitter 15 |
16 | 17 | ## Examples 18 | 19 | 20 | cards 21 | 22 | 23 | images 24 | 25 | 26 | media 27 | 28 | 29 | 30 | mint 31 | 32 | 33 | profile 34 | 35 | 36 | map 37 | 38 | 39 | 40 | ## Features 41 | 42 | - Mint NFTs from file upload or URL 43 | - Set to be transferable or non-transferable (redistribution not allowed) 44 | - Set a fee and preview the asset before minting (spam control) 45 | - View a dashboard of what the community has been creating 46 | - Change views from cards, images, and live 3D previews 47 | - Asset pages with buttons to interact with NFTs to: 48 | - Apply asset as avatar or add to loadout 49 | - Transfer to other blockchains (ETH / Polygon) 50 | - Add unlockables and file storage 51 | - User profile pages with avatars and custom loadouts 52 | - Top down map of the current season with interactive parcel links 53 | 54 | 55 | ### Generate trading cards 56 | 57 | Generate a unique trading card representation for every NFT with RNG elements and battle stats. 58 | 59 | ![](https://i.imgur.com/vvAix1q.jpg) 60 | 61 | 62 | ## Development 63 | 64 | https://nextjs.org/docs/deployment 65 | 66 | 67 | ## Contributing 68 | 69 | Contributions are welcome please see [CONTRIBUTING.md](https://github.com/webaverse/docs/blob/master/CONTRIBUTING.md) for additional information. Open issues are listed [here](https://github.com/webaverse/app/issues?q=Fe%3A+is%3Aissue+is%3Aopen+). 70 | -------------------------------------------------------------------------------- /components/Card2D.js: -------------------------------------------------------------------------------- 1 | import React, {Fragment, useState} from "react"; 2 | // import procgen, {types} from '../webaverse/procgen.js'; 3 | import User from './User'; 4 | import {previewHost} from '../webaverse/constants'; 5 | 6 | const Card2D = ({ 7 | id, 8 | assetName, 9 | description, 10 | image, 11 | animation_url, 12 | hash, 13 | ext, 14 | totalSupply, 15 | minterAvatarPreview, 16 | minterUsername, 17 | minterAddress, 18 | cardSize, 19 | isMainnet, 20 | isPolygon, 21 | glow, 22 | imageView, 23 | // cardSvgSource, 24 | nonce, 25 | onClick, 26 | }) => { 27 | const [perspective, setPerspective] = useState([false, false]); 28 | const [flip, setFlip] = useState(false); 29 | const [transitioning, setTransitioning] = useState(false); 30 | const [boundingBox, setBoundingBox] = useState(null); 31 | const [dimensions, setDimensions] = useState(null); 32 | 33 | const _loadDimensions = el => { 34 | const {naturalWidth, naturalHeight} = el; 35 | if (!dimensions || dimensions[0] !== naturalWidth || dimensions[1] !== naturalHeight) { 36 | setDimensions([naturalWidth, naturalHeight]); 37 | } 38 | }; 39 | const _cancelDragStart = e => { 40 | e.preventDefault(); 41 | }; 42 | 43 | const qs = { 44 | nonce, 45 | }; 46 | let src = image; 47 | src = `${previewHost}/${hash}.${ext}/preview.png` 48 | src = src.replace(/\.gif\/preview\.png$/, '.gif/preview.gif'); 49 | if (!/\?$/.test(src)) { 50 | src += '?'; 51 | } 52 | let first = true; 53 | for (const k in qs) { 54 | const v = qs[k]; 55 | if (v !== undefined) { 56 | if (first) { 57 | first = false; 58 | } else { 59 | src += '&'; 60 | } 61 | src += `${k}=${v}`; 62 | } 63 | } 64 | 65 | return ( 66 |
{ 69 | onClick && onClick(e); 70 | }} 71 | > 72 | { 77 | e.target.requestFullscreen(); 78 | }} 79 | /> 80 | {cardSize === 'small' ? 81 |
82 | 88 |
89 |
{assetName}
90 |
{ext}
91 |
92 |
93 | : null} 94 |
95 | ); 96 | }; 97 | export default Card2D; -------------------------------------------------------------------------------- /components/Card3D.js: -------------------------------------------------------------------------------- 1 | import React, {Fragment, useState, useEffect} from 'react'; 2 | import {appPreviewHost} from '../webaverse/constants'; 3 | import AssetCardSvg from './CardSvg.js'; 4 | import User from './User.js'; 5 | import ProgressBar from './ProgressBar.js'; 6 | 7 | const Card3D = props => { 8 | const { 9 | id, 10 | assetName, 11 | description, 12 | hash, 13 | ext, 14 | ownerUsername, 15 | ownerAddress, 16 | ownerAvatarPreview, 17 | // loaded, 18 | cardSize, 19 | open, 20 | nonce, 21 | onClick, 22 | } = props; 23 | 24 | // const [open, setOpen] = useState(false); 25 | // const [locked, setLocked] = useState(!open); 26 | const [loaded, setLoaded] = useState(false); 27 | 28 | // console.log('card 3d', {open, locked}); 29 | 30 | const qs = { 31 | id, 32 | hash, 33 | ext, 34 | nonce, 35 | }; 36 | let src = `${appPreviewHost}?`; 37 | let first = true; 38 | for (const k in qs) { 39 | const v = qs[k]; 40 | if (v !== undefined) { 41 | if (first) { 42 | first = false; 43 | } else { 44 | src += '&'; 45 | } 46 | src += `${k}=${v}`; 47 | } 48 | } 49 | 50 | /* useEffect(() => { 51 | if (!locked) { 52 | setLocked(true); 53 | } 54 | if (loaded) { 55 | setLoaded(false); 56 | } 57 | }, [locked, loaded]); */ 58 | 59 | const makeLoaded = () => !loaded ? ( 60 |
61 | 62 |
63 | ) : null; 64 | const makeIframe = () => (