GitHash docs
GitHash coins are CPU-mined ERC-20s on Ethereum. Every coin has the same shape: 3,000,000 supply, 2,000,000 seeded into its own Uniswap v4 ETH pool, 1,000,000 mined from the terminal over halving eras. One miner process mines one coin, chosen with --coin.
Quick start
- Install Node.js 18 or newer (Windows, macOS, Linux, any VPS).
- Open the Dashboard, connect your wallet, sign the login message, click New key. One key works for every coin.
- Pick a coin on the Coins page and run the command shown on its page:
npx githash-miner --key git_YOUR_API_KEY --coin TICKER--coin takes the ticker or the contract address. The miner prints a live status bar: hashrate, accepted shares, current block, your estimated reward for it, coins earned and claimable. Ctrl-C stops it; start it again any time, nothing is lost. To mine two coins, run two processes.
Options
| Flag | Meaning |
|---|---|
--coin X | Ticker or address of the coin to mine. Required (or GITHASH_COIN). |
--threads N | CPU threads to use. Default: cores − 1, so the machine stays usable. |
--quiet | One line per event instead of the live bar (for logs, systemd, Docker). |
--server URL | Pool URL. Default https://pool.githash.fun. |
GITHASH_KEY / GITHASH_COIN / GITHASH_THREADS | Same as the flags, as environment variables. |
Run it forever on a VPS
# with pm2
npm i -g pm2 githash-miner
pm2 start githash-miner -- --key git_YOUR_API_KEY --coin TICKER --threads 4 --quiet
pm2 save
# or a plain loop
while true; do npx githash-miner --key git_YOUR_API_KEY --coin TICKER --quiet; sleep 5; doneThe coins
Every GitHash coin is deployed by the same factory contract, so all of them have the same numbers:
| Template | Value |
|---|---|
| Total supply | 3,000,000 |
| Uniswap v4 pool (single-sided, coin only) | 2,000,000 |
| Mineable | 1,000,000 |
| Block reward | 2.5, halving every 200,000 blocks |
| Block time | 10 minutes |
The GitHash team controls each coin's pool liquidity and can withdraw it. That is stated on every coin page, and a coin whose liquidity was pulled is marked as such.
How mining works
The pool hands each miner a job: a 32-byte seed unique to that API key, coin and block, plus a difficulty. The miner looks for an 8-byte nonce such that keccak256(seed ‖ nonce) < 2^256 / difficulty. Finding one is a share. The pool verifies it with a single hash and adds the difficulty to your score for the current block of that coin.
- Blocks close every 10 minutes, per coin, counted from the coin's creation. The block reward is split across everyone who submitted shares for that coin, in proportion to score. Score is expected hashes done, so a miner with 2× the hashrate earns 2× the reward, whatever its difficulty setting.
- Difficulty is set per miner (vardiff) so you submit roughly one share every 12 seconds. Fast machines get high difficulty, phones get low difficulty, both are paid fairly.
- Unmined blocks (nobody submitted a share) pay nobody. Those coins are never minted.
- Shares from a job of the previous block are accepted for 20 seconds after the block rolls.
Emission (every coin)
| Blocks | Reward | Coins in the era |
|---|---|---|
| 0 – 199,999 | 2.5 | 500,000 |
| 200,000 – 399,999 | 1.25 | 250,000 |
| 400,000 – 599,999 | 0.625 | 125,000 |
| … | halves every 200,000 blocks | → 1,000,000 total |
200,000 blocks at 10 minutes is about 3.8 years per era, like Bitcoin. Every coin starts at block 0 with the full reward.
Claiming on-chain
Rewards are credited off-chain the moment a block closes and shown as claimable per coin on the Dashboard. To move them on-chain the site asks the pool for a voucher: a signature over (coin, chainId, your wallet, cumulative earned). You send claim(cumulative, sig) to that coin's contract from your wallet; it mints cumulative − alreadyClaimed to you. Vouchers are cumulative, so a stale one can never be replayed and a lost one is simply re-fetched.
- Each coin mints only through
claim(), only with a valid signature from the factory's signer, and never beyond 1,000,000 in total. - You pay the gas of one ERC-20 mint. Claim when it is worth it; nothing expires.
Pool API
Everything the miner and this site use is public. Base URL https://pool.githash.fun. coin is an address or a ticker.
| Endpoint | Auth | What |
|---|---|---|
GET /api/stats | – | every coin with height, reward, hashrate, miners, supply, price; global totals |
GET /api/coins · /api/coin/:address | – | coin list · one coin with its blocks and leaderboard |
GET /api/leaderboard · /api/wallet?address= | – | public tables |
GET /api/job?coin= | x-api-key | seed, target, difficulty, block, epoch end |
POST /api/share { job, nonce } | x-api-key | submit a share (nonce = 16 hex chars) |
GET /api/miner?coin= | x-api-key | earned, claimed, estimate, hashrate for that coin |
POST /api/register { address, ts, sig, name } | wallet signature | create an API key (shown once) |
GET /api/me · /api/voucher?coin= | x-wallet x-ts x-sig | dashboard data · claim voucher for one coin |
Write your own miner if you like: the share format is the whole protocol.
FAQ
Does it slow down my computer? By default it leaves one core free. Use --threads 1 for a laptop on battery.
GPU? Not yet. keccak256 is GPU-friendly, so expect GPU miners eventually; the pool pays by score, so they simply earn in proportion.
Can the pool cheat? The pool decides payouts off-chain, like every mining pool ever. What it cannot do: mint beyond 1M per coin or take coins you already claimed. What the team can do: withdraw a coin's pool liquidity. Payout math and every block are public on each coin page.
Is any of this worth anything? Whatever each pool trades at. Mining spends electricity for coins with no promise of value.