Universal NFT mint bot - modular, multi-wallet, multi-platform. Built for daily use on VPS or local.
- Multi-wallet - parallel execution with configurable concurrency limit
- Multi-platform - auto-detect SeaDrop, Zora, Manifold, Thirdweb, or use custom
- Gas strategies - auto/fixed/aggressive with EIP-1559 support
- Timed mint - wait for exact mint time, then fire
- Simulation - staticCall before sending to avoid wasted gas
- Retry - exponential backoff per wallet (isolated)
- Dry run - test full flow without sending tx
- Logging - per-wallet isolated logs + console pretty print
- Lightweight - 4 dependencies, runs on $5 VPS
nft-mint-bot-dev/
├── index.js # Entry point
├── setup.js # First-time setup script
├── core/
│ └── index.js # App lifecycle, validation, shutdown
├── config/
│ └── index.js # Env loading, config object
├── logger/
│ └── index.js # Pino logger (console + file)
├── wallet/
│ └── index.js # Multi-wallet manager, parallel exec
├── adapters/
│ ├── base.js # BaseAdapter abstract class
│ ├── seadrop.js # OpenSea SeaDrop
│ ├── zora.js # Zora Creator
│ ├── manifold.js # Manifold
│ ├── thirdweb.js # Thirdweb Drop
│ ├── custom.js # Custom (fallback)
│ └── index.js # Platform detection registry
├── tx/
│ └── index.js # Gas strategy, simulate, send
├── checker/
│ └── index.js # Pre-mint checks & eligibility
├── mint-engine/
│ └── index.js # Orchestrator
├── utils/
│ └── index.js # Helpers (retry, sleep, encoding)
├── .env.example
├── .collection.env.example
└── logs/ # Auto-created log files
- Node.js >= 18
- npm
# Clone
git clone https://github.com/Febiil/nft-mint-bot-dev.git
cd nft-mint-bot-dev
# Auto setup (install deps + create env files)
node setup.js1. Edit .env - Global settings:
RPC_URL=https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY
PRIVATE_KEYS=0xkey1,0xkey2,0xkey3
MAX_PARALLEL_WALLETS=3
GAS_STRATEGY=auto2. Edit .collection.env - Per-collection (overrides .env):
CONTRACT_ADDRESS=0xYourNFTContract
MINT_FUNCTION=mint(uint256)
MINT_ARGS=1
MINT_PRICE=0.005
MINT_QUANTITY=1
PLATFORM=auto# Normal run
node index.js
# Dry run (no real transactions)
# Set DRY_RUN=true in .env, then:
node index.js| Platform | Auto-Detect | Status |
|---|---|---|
| SeaDrop (OpenSea) | Yes | Ready |
| Zora Creator | Yes | Ready |
| Manifold | Yes | Ready |
| Thirdweb Drop | Yes | Ready |
| Custom (any) | Fallback | Ready |
For contracts not matching any known platform, set:
PLATFORM=custom
MINT_FUNCTION=yourMintFunction(address,uint256)
MINT_ARGS={wallet},1{wallet} is replaced with the sender address at runtime.
| Strategy | Description |
|---|---|
auto |
Network suggestion * GAS_MULTIPLIER (default 1.2x) |
fixed |
Use exact MAX_FEE_PER_GAS and MAX_PRIORITY_FEE |
aggressive |
2x current base fee |
- Add multiple private keys comma-separated in
PRIVATE_KEYS MAX_PARALLEL_WALLETScontrols concurrency (default: 3)- Each wallet has isolated retry and logging
- Lightweight enough for VPS with many wallets
Set MINT_TIME in .collection.env:
# ISO format
MINT_TIME=2024-06-01T18:00:00Z
# Or unix timestamp (seconds)
MINT_TIME=1717264800Bot will wait until the exact time, then fire all wallets.
- Simulation (staticCall) before every transaction
- Balance check before minting
- Contract existence verification
- Dry run mode for testing
- Graceful shutdown (SIGINT/SIGTERM)
- No obfuscated code
- No transfer/sweep/drain functions
- Private keys stay local only
# Install Node.js from https://nodejs.org (LTS)
# Open PowerShell/CMD:
git clone https://github.com/Febiil/nft-mint-bot-dev.git
cd nft-mint-bot-dev
node setup.js
# Edit .env and .collection.env
node index.js# Install Node.js 20.x
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs git
# Clone and setup
git clone https://github.com/Febiil/nft-mint-bot-dev.git
cd nft-mint-bot-dev
node setup.js
# Edit configs
nano .env
nano .collection.env
# Run (or use pm2/screen for persistent)
node index.js
# Optional: run with pm2
npm install -g pm2
pm2 start index.js --name mint-bot
pm2 logs mint-bot# Using screen
screen -S mintbot
node index.js
# Ctrl+A, D to detach
# Using pm2
pm2 start index.js --name mint-bot
pm2 saveOnly 4 trusted packages:
| Package | Purpose |
|---|---|
ethers ^6.13 |
Ethereum interaction |
dotenv ^16.4 |
Environment variables |
pino ^8.19 |
Fast JSON logger |
pino-pretty ^10.3 |
Console formatting |
# Debug mode
LOG_LEVEL=debug node index.js
# Test with dry run
DRY_RUN=true node index.js
# Check single collection
node -e "require('./checker').quickCheck(require('./wallet').getWalletManager().getProvider()).then(console.log)"MIT