Parallel ZRC-20 mint bot for Zcash. works for any ZRC-20 ticker.
- Reads UTXOs at your
t1address. - If you don't have N cardinal UTXOs of the exact mint-funding size, runs one split tx and waits for it.
- Polls for the deploy tx of the target ticker — either via the launchpad's
/api/zrc20/token/<TICKER>endpoint, or by scanning zebrad's mempool and last few blocks. - The instant the deployer address is known, broadcasts N pre-built commit+reveal pairs in parallel.
- Writes per-pipeline results to
results-<timestamp>.jsonand exits.
- All commit txs are pre-built and pre-signed before the trigger fires. Only the reveal's deployer-payout output is dynamic.
- N independent cardinal UTXOs → no chain dependency between mints.
- Direct
sendrawtransactionto zebrad → no indexer round-trip, no rate limit. Falls back to the launchpad API when you don't have your own node. - Fast-path reveal broadcast (commit may still be in mempool) with a chained-mempool retry loop.
- Pure ESM Node, no npm runtime deps. Crypto is vendored under
vendor/.
-
Node 20.x (
.nvmrcis set). -
A funded
t1address. Rough budget for N parallel mints:N × 0.002 ZEC + ~0.0001 ZEC for the split + change overheadN=1 → ~0.0025 ZEC. N=20 → ~0.045 ZEC.
-
Optional: your own
zebrad/zcashdJSON-RPC. With one, the bot bypasses the launchpad's rate-limited indexer entirely. Without one, setmode: "indexer"and keepparallelism <= 25.
git clone https://github.com/YoneCode/zecscriptions-minter.git
cd zecscriptions-minter
nvm use # node 20
node gen-wallet.mjs # prints a fresh t1 + privHex. Back them up.
# Send ZEC to the printed address.
cp config.example.json config.json
$EDITOR config.json # paste privHex, set ticker / parallelism / modeconfig.json is in .gitignore. Never commit it. Anyone with the
privHex can spend the funds at that address.
mode—"zebrad"if you run a node,"indexer"otherwise.privHex— 64 hex chars fromgen-wallet.mjs.zebrad.url— JSON-RPC endpoint (zebrad needsgetaddressutxosenabled; zcashd needsaddressindex=1).target.ticker— e.g.ZECS.target.lim— must match the deploy'slimexactly, or every mint is rejected by the scanner.parallelism— start at1, then scale.
node index.mjs --check # validate config + derive address. No network.
node index.mjs --dry-run # build + decode N pipelines, broadcast nothing.
node index.mjs # live run: waits for the deploy, then strikes.Always --check and --dry-run first. A malformed reveal = miner fee
burned with no balance credited.
- No listing or selling. Use the launchpad UI after mint-out.
- No IP rotation, no indexer sybilling. Broadcast bypasses the indexer
anyway, so write rate-limits don't matter in
zebradmode. - No tx cancellation. Once a commit is broadcast, the miner fee is paid whether the reveal lands or not.
index.mjs entry point
gen-wallet.mjs fresh t1 generator
test.mjs offline self-tests
config.example.json template (commit this; never commit config.json)
lib/
log.mjs structured logger
zebrad-rpc.mjs JSON-RPC client
indexer-client.mjs launchpad API client
utxo-source.mjs UTXO discovery + cardinal selection
splitter.mjs Phase 0
trigger.mjs Phase 1
mint-pipeline.mjs Phase 2
zcash-tx.mjs V5 tx builder + ZIP-244 sighash
protocol-constants.js ZRC-20 fee economics
vendor/ pinned ESM bundles of @noble/* and @scure/*
- 5-day-old launchpad project, no third-party security audit.
- Operator can
set-visibilityon tickers post-mint via admin API. Your mint can land on-chain and still be hidden from the UI. - 2.5% trade fee on resale. Marketplace opens after mint-out only.
- Run on a machine you control. The privHex is the wallet — leak it once, funds are gone.
MIT. See LICENSE. Vendored crypto bundles keep their upstream
MIT licenses. zcash-tx.mjs and protocol-constants.js originate from the
zecscriptions launchpad project and are included under the same MIT terms.
Unofficial software. Not affiliated with or endorsed by the zecscriptions launchpad team. Use at your own risk.