├── .eslintrc.json ├── public ├── favicon.ico ├── imageNftMetadata.sample.json ├── videoNftMetadata.sample.json └── vercel.svg ├── styles ├── tailwind.css ├── globals.css ├── Home.module.css └── main.css ├── postcss.config.js ├── next.config.js ├── next-env.d.ts ├── client.ts ├── lib └── ga │ └── index.js ├── .gitignore ├── tsconfig.json ├── types.ts ├── components ├── instructionDrawerRow.tsx ├── nftCard.tsx ├── nftRow.tsx ├── nftDetails.tsx ├── candyMachineMints.tsx ├── quickFix.tsx ├── quickMint.tsx ├── viewer.tsx ├── minthash.tsx ├── editionPrinter.tsx ├── updateUA.tsx ├── closenfts.tsx ├── airdropCannon.tsx ├── holdersnapshot.tsx ├── navbar.jsx ├── burn.tsx ├── nftedit.tsx ├── multisend.tsx └── nftMinter.tsx ├── pages ├── _document.js ├── index.tsx ├── _app.tsx └── [which].tsx ├── README.md ├── package.json ├── tailwind.config.js └── LICENSE.md /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/echohtp/btools/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /styles/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | } 5 | 6 | module.exports = nextConfig 7 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /client.ts: -------------------------------------------------------------------------------- 1 | import { ApolloClient, gql, InMemoryCache } from '@apollo/client' 2 | 3 | const client = new ApolloClient({ 4 | uri: "https://graph.holaplex.com/v1", 5 | cache: new InMemoryCache({resultCaching: false}) 6 | }) 7 | 8 | export default client 9 | -------------------------------------------------------------------------------- /lib/ga/index.js: -------------------------------------------------------------------------------- 1 | // log the pageview with their URL 2 | export const pageview = (url) => { 3 | window.gtag('config', process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS, { 4 | page_path: url, 5 | }) 6 | } 7 | 8 | // log specific events happening. 9 | export const event = ({ action, params }) => { 10 | window.gtag('event', action, params) 11 | } -------------------------------------------------------------------------------- /styles/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | html, 5 | body { 6 | padding: 0; 7 | margin: 0; 8 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 9 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 10 | } 11 | 12 | a { 13 | color: inherit; 14 | text-decoration: none; 15 | } 16 | 17 | * { 18 | box-sizing: border-box; 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | 36 | # typescript 37 | *.tsbuildinfo 38 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "downlevelIteration": true 18 | }, 19 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.js"], 20 | "exclude": ["node_modules"] 21 | } 22 | -------------------------------------------------------------------------------- /public/imageNftMetadata.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "symbol": "", 4 | "description": "", 5 | "seller_fee_basis_points": 1000, 6 | "image": "", 7 | "attributes": [ 8 | { 9 | "trait_type": "Type", 10 | "value": "Value" 11 | }, 12 | { 13 | "trait_type": "Size", 14 | "value": "Small" 15 | } 16 | ], 17 | "external_url": "", 18 | "properties": { 19 | "category": "image", 20 | "files": [ 21 | { 22 | "uri": "", 23 | "type": "image/png" 24 | } 25 | ], 26 | "creators": [ 27 | { 28 | "address": "", 29 | "share": 100 30 | } 31 | ] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /types.ts: -------------------------------------------------------------------------------- 1 | export interface Owner { 2 | address: string 3 | associatedTokenAccountAddress: string 4 | } 5 | 6 | export interface Attribute { 7 | value: String 8 | traitType: String 9 | } 10 | 11 | export interface File { 12 | metadataAddress: String 13 | uri: String 14 | fileType: String 15 | } 16 | 17 | export interface Creator{ 18 | address: String 19 | metadataAddress: String 20 | share: Number 21 | verified: Boolean 22 | position?: Number 23 | twitterHandle?: String 24 | } 25 | 26 | export interface Nft { 27 | name: string 28 | address: string 29 | description: string 30 | image: string 31 | mintAddress: string 32 | animationUrl: string 33 | externalUrl: string 34 | owner: Owner 35 | files: File[] 36 | attributes: Attribute[] 37 | creators: Creator[] 38 | } 39 | -------------------------------------------------------------------------------- /public/videoNftMetadata.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "symbol": "", 4 | "description": "", 5 | "seller_fee_basis_points": 1000, 6 | "image": "", 7 | "animation_url": "", 8 | "attributes": [ 9 | { 10 | "trait_type": "Type", 11 | "value": "Value" 12 | }, 13 | { 14 | "trait_type": "Size", 15 | "value": "Small" 16 | } 17 | ], 18 | "external_url": "", 19 | "properties": { 20 | "category": "video", 21 | "files": [ 22 | { 23 | "uri": "", 24 | "type": "image/png", 25 | "cdn": "false" 26 | }, 27 | { 28 | "uri": "", 29 | "type": "video/mp4", 30 | "cdn": "true" 31 | } 32 | ], 33 | "creators": [ 34 | { 35 | "address": "", 36 | "share": 100 37 | } 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /components/instructionDrawerRow.tsx: -------------------------------------------------------------------------------- 1 | function showfirstandlastfour (str: string) { 2 | if (str.length > 4) { 3 | return str.substr(0, 4) + '...' + str.substr(str.length - 4, 4) 4 | } 5 | return str 6 | } 7 | 8 | interface InstructionDrawerRowProps { 9 | name: String 10 | to: string 11 | amount?: string 12 | unselect(): void 13 | } 14 | 15 | export const InstructionDrawerRow = (props: InstructionDrawerRowProps) => { 16 | return ( 17 |
{ 20 | props.unselect() 21 | }} 22 | > 23 |
24 |
{props.name}
25 | {props.to && ( 26 |
27 | to: {showfirstandlastfour(props.to)} 28 |
29 | )} 30 |
31 |
32 | ) 33 | } 34 | -------------------------------------------------------------------------------- /pages/_document.js: -------------------------------------------------------------------------------- 1 | import Document, { Html, Head, Main, NextScript } from 'next/document' 2 | 3 | export default class MyDocument extends Document { 4 | render() { 5 | return ( 6 | 7 | 8 | {/* Global Site Tag (gtag.js) - Google Analytics */} 9 |