├── .gitignore ├── LICENSE ├── README.md ├── app ├── api │ └── pump │ │ └── route.ts ├── layout.tsx ├── modules │ ├── btn-reload.tsx │ ├── header.tsx │ ├── links.tsx │ ├── list │ │ ├── detail.tsx │ │ ├── index.tsx │ │ └── item.tsx │ └── loading.tsx ├── page.tsx ├── store.ts ├── style.scss ├── sw.ts └── ~offline │ └── page.tsx ├── common ├── api │ └── index.ts ├── hooks │ └── pump.ts ├── styles │ ├── theme.css │ └── uno.css ├── types.ts ├── ui │ ├── loading.tsx │ ├── popover │ │ ├── confirm.tsx │ │ ├── drawer.tsx │ │ └── notify.tsx │ ├── theme │ │ ├── index.tsx │ │ └── typings.ts │ └── theme_toggle │ │ ├── index.tsx │ │ └── style.css └── utils │ ├── env.ts │ ├── format.ts │ ├── index.ts │ ├── request.ts │ ├── store.ts │ ├── theme.ts │ └── track.ts ├── next-env.d.ts ├── next.config.mjs ├── package.json ├── pnpm-lock.yaml ├── public ├── icon.jpeg ├── manifest.json └── sw.js └── tsconfig.json /.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 | dev-dist 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 | # Docusaurus cache and generated files 109 | .docusaurus 110 | 111 | # Serverless directories 112 | .serverless/ 113 | 114 | # FuseBox cache 115 | .fusebox/ 116 | 117 | # DynamoDB Local files 118 | .dynamodb/ 119 | 120 | # TernJS port file 121 | .tern-port 122 | 123 | # Stores VSCode versions used for testing VSCode extensions 124 | .vscode-test 125 | 126 | # yarn v2 127 | .yarn/cache 128 | .yarn/unplugged 129 | .yarn/build-state.yml 130 | .yarn/install-state.gz 131 | .pnp.* 132 | 133 | sw.js 134 | next-env.d.ts 135 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 evolify 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pumpfun 2 | Tools for pump.fun 3 | 4 | ## Features 5 | - List pumpfun tokens which to be complete 6 | - Sort by Market Cap, Quickly find the easiest one to complete 7 | - Filter small Market Cap tokens (current only show mc > 15k) 8 | - Show social links(Twitter、Telegram、Website、Pumpfun link) 9 | - Fast swap with Bonkbot、Pepeboost、GMGN Sniper Bot in one click 10 | - Support Mobile and PC, Light and Dark Mode 11 | - Support PWA, Add it to desktop for better experience 12 | 13 | ## Screenshots 14 | 15 |
16 | light 17 | dark 18 |
19 | 20 | 21 |
22 | 23 |
24 | 25 | ## TODO 26 | - [x] Improve loading speed 27 | - [x] Support Bonkbot、Pepeboost、GMGN Sniper Bot 28 | - [ ] Add some filter options 29 | - [ ] Show more info 30 | -------------------------------------------------------------------------------- /app/api/pump/route.ts: -------------------------------------------------------------------------------- 1 | import { getPumpList } from "common/api"; 2 | 3 | export async function GET( _request: Request) { 4 | const data = await getPumpList() 5 | return Response.json(data) 6 | } -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import { PropsWithChildren } from "react" 2 | import type { Metadata, Viewport } from "next"; 3 | import { Analytics } from "@vercel/analytics/react" 4 | import { SpeedInsights } from "@vercel/speed-insights/react" 5 | import { AppRouterCacheProvider } from "@mui/material-nextjs/v14-appRouter" 6 | import { GoogleTagManager } from '@next/third-parties/google' 7 | import Theme from "common/ui/theme/index" 8 | 9 | const APP_NAME = "Dump Fun"; 10 | const APP_DEFAULT_TITLE = "Dump Fun"; 11 | const APP_TITLE_TEMPLATE = "%s - PWA App"; 12 | const APP_DESCRIPTION = "Dump Fun for pumpfun"; 13 | 14 | export const metadata: Metadata = { 15 | applicationName: APP_NAME, 16 | title: { 17 | default: APP_DEFAULT_TITLE, 18 | template: APP_TITLE_TEMPLATE, 19 | }, 20 | description: APP_DESCRIPTION, 21 | appleWebApp: { 22 | capable: true, 23 | statusBarStyle: "default", 24 | title: APP_DEFAULT_TITLE, 25 | // startUpImage: [], 26 | }, 27 | formatDetection: { 28 | telephone: false, 29 | }, 30 | openGraph: { 31 | type: "website", 32 | siteName: APP_NAME, 33 | title: { 34 | default: APP_DEFAULT_TITLE, 35 | template: APP_TITLE_TEMPLATE, 36 | }, 37 | description: APP_DESCRIPTION, 38 | }, 39 | twitter: { 40 | card: "summary", 41 | title: { 42 | default: APP_DEFAULT_TITLE, 43 | template: APP_TITLE_TEMPLATE, 44 | }, 45 | description: APP_DESCRIPTION, 46 | }, 47 | }; 48 | 49 | export const viewport: Viewport = { 50 | themeColor: [ 51 | { media: "(prefers-color-scheme: dark)", color: "#2D2D2D" }, 52 | { media: "(prefers-color-scheme: light)", color: "#1976d2" } 53 | ], 54 | }; 55 | 56 | type Props = PropsWithChildren 57 | 58 | export default function MyApp({ children }: Props) { 59 | return ( 60 | 61 | 62 | 66 | 67 | 68 | 69 | {children} 70 | 71 | 72 | 73 | 74 | 75 | 76 | ) 77 | } 78 | -------------------------------------------------------------------------------- /app/modules/btn-reload.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import { Refresh } from "@mui/icons-material" 3 | import { IconButton } from "@mui/material" 4 | 5 | export default function Reload() { 6 | function refresh() { 7 | location.reload() 8 | } 9 | return ( 10 | 17 | 18 | 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /app/modules/header.tsx: -------------------------------------------------------------------------------- 1 | import { AppBar, IconButton, Toolbar, Typography, } from "@mui/material" 2 | import { Menu } from "@mui/icons-material" 3 | import Reload from "./btn-reload" 4 | import Links from "./links" 5 | 6 | export default function Header() { 7 | 8 | return ( 9 | 10 | 11 | 17 | 18 | 19 | 20 | PumpFun 21 | 22 | 23 | 24 | 25 | 26 | ) 27 | } 28 | -------------------------------------------------------------------------------- /app/modules/links.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { ArrowOutward } from "@mui/icons-material" 4 | import { Button, Typography } from "@mui/material" 5 | import { axiom, gmgn } from "common/utils" 6 | import { click } from "common/utils/track" 7 | 8 | export default function Link() { 9 | function toAxiom() { 10 | click("gmgn") 11 | window.open(axiom()) 12 | } 13 | function toGmgn() { 14 | click("gmgn") 15 | window.open(gmgn()) 16 | } 17 | return ( 18 | <> 19 | 25 | 31 | 32 | ) 33 | } 34 | -------------------------------------------------------------------------------- /app/modules/list/detail.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import { Box, Button, Divider, Drawer, Stack, Typography } from "@mui/material" 3 | import { close, use } from "app/store" 4 | import { 5 | formatMarketCap, 6 | formatPercent, 7 | formatPrice, 8 | } from "common/utils/format" 9 | import { axiom, bonkbot, copy, gmgn, gmgnbot, kline, pepeboost, pumpill } from "common/utils" 10 | import { click } from "common/utils/track" 11 | 12 | export default function Detail() { 13 | const { coin } = use() 14 | 15 | function getSwaps() { 16 | return ( 17 | (coin.swaps_1m || 0) + 18 | "(1m)—" + 19 | (coin.swaps_5m || 0) + 20 | "(5m)—" + 21 | (coin.swaps_1h || 0) + 22 | "(1h)" 23 | ) 24 | } 25 | 26 | function getVolume() { 27 | return ( 28 | formatMarketCap(coin.volume_1m) + 29 | "(1m)—" + 30 | formatMarketCap(coin.volume_5m) + 31 | "(5m)—" + 32 | formatMarketCap(coin.volume_1h) + 33 | "(1h)" 34 | ) 35 | } 36 | 37 | function renderLink(text: string, link: string, copyAddr?: boolean) { 38 | function onClick() { 39 | if (copyAddr) { 40 | copy(coin.address) 41 | } 42 | click(text.toLocaleLowerCase().replace(/\s/g, "_")) 43 | window.open(link) 44 | } 45 | return ( 46 | 49 | ) 50 | } 51 | 52 | function renderDetails() { 53 | return ( 54 | <> 55 | 56 | 57 | Safe Analytics 58 | 59 | 60 | Dev Hold: 61 | {formatPercent(coin.creator_balance_rate)} 62 | 63 | 64 | Top 10 Hold: 65 | {formatPercent(coin.top_10_holder_rate)} 66 | 67 | {/* 68 | Rug: 69 | 70 | {holder_rugged_num || 0} / {holder_token_num || 0} 71 | 72 | */} 73 | 74 | ) 75 | } 76 | 77 | function renderContent() { 78 | if (!coin) { 79 | return "" 80 | } 81 | return ( 82 | 83 | 84 | 89 | 90 | {coin.name} 91 | {coin.address} 92 | 93 | 94 | 95 | {/* kline */} 96 | 97 |