Nabuto ($NBT) was a token project on Binance Smart Chain that launched in 2022. I was brought on as the developer to build the project's launchpad platform -- a system that would gate access to curated token launches behind a token-locking mechanism, incentivising holders to commit their tokens for a set duration in exchange for early access to new launches.
The platform was built as two interconnected modules: a token locker where holders lock their tokens for a chosen duration, and a launchpad that becomes accessible once the holder meets the minimum lock requirements. The locker supports locking, withdrawing, increasing, and extending locks. The launchpad surfaces upcoming launches with live countdowns, social links, and direct swap integration.
After the project concluded, I whitelabeled the platform into this repository -- a fully configurable, chain-agnostic launchpad that can be rebranded and deployed for any ERC-20 token project without modifying the source code. Everything is driven by environment variables.
A 2-module system that gates launchpad access behind token locking:
- Token Locker -- Users connect their wallet and lock ERC-20 tokens for a chosen duration (1--12 months). They can increase their lock amount or extend the duration at any time. Withdrawal is only available after the lock expires.
- Launchpad -- Once a user meets the minimum token and duration thresholds (or is whitelisted), they gain access to a curated feed of upcoming launches with live countdowns, social links, market data, and direct swap/chart links.
npm install
npm run devcd rest_api
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtLocal development (SQLite) -- no MySQL needed:
python seed.py # creates launches.db with sample data
python main.py # starts Flask dev server on :5000Production (MySQL) -- set DATABASE_HOST and related env vars:
gunicorn -c gunicorn_config.py main:appWhen DATABASE_HOST is not set, the API automatically uses SQLite. When it is set, it connects to MySQL.
Copy .env.example to .env and fill in the required values. See the example file for all configuration options.
User Browser (React + wagmi + viem)
|
|-- viem (contract reads: balance, lock status)
|-- wagmi (wallet connect/disconnect, tx signing)
|-- axios (GET /launch with API key)
v
Flask REST API (rest_api/)
|
|-- SQLite (local dev) or MySQL (production)
v
ERC-20 Smart Contract (on-chain)
|
|-- lockInitialTokens, withdrawTokens, extendTokenLockBySeconds
|-- lockAdditionalTokens, getLockedTokenAmount, getRemainingTokenLockTime
| Component | Tech | Description |
|---|---|---|
src/ |
React 18, Vite, Chakra UI, wagmi, viem, Redux Toolkit | Frontend locker and launchpad interface |
rest_api/ |
Flask, SQLite/PyMySQL, gunicorn | Launch listing CRUD REST API |
MIT License. See LICENSE for details.
Built by Xipz

