Ethereum mainnet üzerinde EDMT/eNAT protokolünün "Mint a Block" akışını otomatikleştiren, güvenli, testli ve resume edilebilir bot.
ANA CÜZDANINIZI KULLANMAYIN. Bu bot için ayrı bir hot wallet oluşturun. Ana cüzdanınızı veya büyük bakiyeli bir cüzdanı asla kullanmayın.
PRIVATE_KEYhiçbir zaman loglanmaz, DB'ye yazılmaz veya hata mesajlarında gösterilmez.- Bot varsayılan olarak dry-run modunda çalışır — gerçek tx göndermez.
- Gerçek mint için iki ayrı flag gerekir:
DRY_RUN=falseVEENABLE_LIVE_MINT=true. - Capture fee ETH veya ERC-20 değildir — EDMT protokol katmanındaki raw fragment balance'tan ödenir.
- Overpayment refund edilmez — fee quote birebir kullanılır.
- EDMT block-specific API doğrulaması olmadan live mint yapılmaz.
Bot şu akışı otomatikleştirir:
- Hedef block'ların durumunu tarar (mintable / minted / beyond_current_head / not_eligible)
- Mintable block bulunca calldata-only EIP-1559 transaction gönderir
- Her adımı SQLite'a checkpoint olarak yazar
- Kesintiden sonra kaldığı yerden devam eder — başa dönmez
- TxMonitor ile finality takibi yapar ve EDMT indexer'da owner doğrular
# 1. Bağımlılıkları yükle
npm install
# 2. .env dosyasını oluştur
cp .env.example .env
# 3. .env dosyasını düzenle (en az RPC_URL gerekli)# Zorunlu
RPC_URL=https://mainnet.infura.io/v3/YOUR_KEY
# Live mint için gerekli (dry-run'da boş bırakılabilir)
PRIVATE_KEY=0xYOUR_HOT_WALLET_PRIVATE_KEY
# Güvenlik bayrakları — ikisi de true olmalı live mint için
DRY_RUN=true # varsayılan: true (güvenli)
ENABLE_LIVE_MINT=false # varsayılan: false (güvenli)
# Tarama aralığı
START_BLOCK=12965000 # EIP-1559 aktivasyon bloğu
STOP_BLOCK= # boş = sınırsız
# Davranış
SCAN_DIRECTION=ascending
BEYOND_HEAD_BEHAVIOR=wait # wait | skip | stop
ALLOW_MULTIPLE_PENDING_TX=false
FINALITY_CONFIRMATIONS=64
# Limitler
MAX_GAS_GWEI=80
MAX_PRIORITY_FEE_GWEI=3
MAX_CAPTURE_FEE_GWEI=1000000000
MAX_TX_PER_RUN=1Gerçek tx göndermeden block taraması yapar:
# Son 50 bloğu dry-run ile tara
npm run dry-run -- --from 12965000 --limit 50
# Checkpoint'ten devam et (dry-run modunda)
npm run scan -- --limit 100
# Belirli bir bloğu kontrol et
npm run mint -- --block 18765432Dry-run modunda:
sendTransactionasla çağrılmaz- Payload, gas tahmini ve fee bilgisi loglanır
- Checkpoint güncellenir (tarama ilerler)
- DB'ye tx kaydı yazılmaz
Live mint'i açmadan önce şu kontrolleri yapın:
npm run dry-run -- --from 18000000 --limit 10Logları inceleyin — block durumları, fee bilgisi ve gas tahmini doğru görünüyor mu?
- Wallet'ta gas için yeterli ETH olduğundan emin olun
- Capture fee gerektiren bloklar için fragment balance'ınızı kontrol edin
MAX_GAS_GWEI=80 # Ağ durumuna göre ayarlayın
MAX_PRIORITY_FEE_GWEI=3DRY_RUN=false
ENABLE_LIVE_MINT=true
REQUIRE_MANUAL_CONFIRMATION_FOR_FIRST_TX=true # İlk tx için onay isternpm run resume| Komut | Açıklama |
|---|---|
npm run scan -- --limit <N> |
En fazla N block tara |
npm run mint -- --block <N> |
Belirli bir bloğu mint et |
npm run resume |
Checkpoint'ten devam et |
npm run status |
Checkpoint ve istatistikleri göster |
npm run pending |
Bekleyen tx'leri listele |
npm run dry-run -- --from <N> --limit <N> |
Dry-run tarama |
npm run monitor |
Pending tx'leri finality için izle |
npm run automint |
Gözetimsiz otomatik mint session başlat |
npm test |
Tüm testleri çalıştır |
Bot'u gözetimsiz (unattended) modda çalıştırmak için önerilen production ayarları.
Aşağıdaki üç flag'in tamamı ayarlanmalıdır:
UNATTENDED_AUTO_MINT=true
DRY_RUN=false
ENABLE_LIVE_MINT=true# Limit yok — bot no-fee block buldukça mint eder
AUTO_MINT_MAX_TX_PER_SESSION=999
AUTO_MINT_MAX_TX_PER_DAY=999
# 8 saatlik maksimum session süresi
AUTO_MINT_MAX_RUNTIME_MINUTES=480
# ~1 Ethereum block süresi
AUTO_MINT_POLL_INTERVAL_MS=12000
# Tam otomatik — CLI onayı bekleme
AUTO_MINT_CONFIRM_EACH_TX=false
# Wallet bakiye aralığı (0.01 ETH bakiye bu aralığa uygundur)
AUTO_MINT_MIN_WALLET_BALANCE_ETH=0.001
AUTO_MINT_REQUIRE_HOT_WALLET_BALANCE_MAX_ETH=0.02
# Yalnızca no-fee block'ları mint et
AUTO_MINT_ONLY_NO_FEE_BLOCKS=true
# Fee-required block görülürse atla, session durmasın
AUTO_MINT_STOP_ON_FEE_REQUIRED=false
# Hata görülürse atla, session durmasın
AUTO_MINT_STOP_ON_FIRST_ERROR=false
# Review required görülürse session dursun (güvenli)
AUTO_MINT_STOP_ON_REVIEW_REQUIRED=true
# Tx sonrası 1 dakika cooldown
AUTO_MINT_COOLDOWN_AFTER_TX_MS=60000
# Aynı anda tek pending tx
ALLOW_MULTIPLE_PENDING_TX=false| Değişken | Varsayılan | Açıklama |
|---|---|---|
UNATTENDED_AUTO_MINT |
false |
Unattended modu aktif et |
AUTO_MINT_MAX_TX_PER_SESSION |
1 |
Session başına maksimum tx sayısı |
AUTO_MINT_MAX_TX_PER_DAY |
3 |
Günlük maksimum tx sayısı (son 24 saat) |
AUTO_MINT_MAX_RUNTIME_MINUTES |
480 |
Maksimum session süresi (dakika) |
AUTO_MINT_POLL_INTERVAL_MS |
12000 |
Block tarama aralığı (ms) |
AUTO_MINT_CONFIRM_EACH_TX |
false |
Her tx için CLI onayı iste |
AUTO_MINT_MIN_WALLET_BALANCE_ETH |
0.005 |
Hot wallet minimum bakiye (ETH) |
AUTO_MINT_REQUIRE_HOT_WALLET_BALANCE_MAX_ETH |
0.05 |
Hot wallet maksimum bakiye (ETH) |
AUTO_MINT_STOP_ON_FIRST_ERROR |
true |
İlk hata görüldüğünde session'ı durdur |
AUTO_MINT_STOP_ON_REVIEW_REQUIRED |
true |
Review required durumunda session'ı durdur |
AUTO_MINT_STOP_ON_FEE_REQUIRED |
true |
Fee gerektiren block görüldüğünde session'ı durdur |
AUTO_MINT_ONLY_NO_FEE_BLOCKS |
true |
Yalnızca fee gerektirmeyen block'ları mint et |
AUTO_MINT_ALLOWED_START_BLOCK |
(boş) | İzin verilen başlangıç block numarası |
AUTO_MINT_ALLOWED_STOP_BLOCK |
(boş) | İzin verilen bitiş block numarası; aşılırsa session durur |
AUTO_MINT_COOLDOWN_AFTER_TX_MS |
60000 |
Tx sonrası bekleme süresi (ms) |
AUTO_MINT_EMERGENCY_STOP_FILE |
./STOP_AUTOMINT |
Emergency stop dosyası yolu |
AUTO_MINT_SESSION_LOCK_FILE |
./automint.lock |
Session lock dosyası yolu |
| Bakiye | Bot Davranışı |
|---|---|
| < 0.001 ETH | wallet_balance_low — tx gönderilmez, döngü devam eder |
| 0.001–0.02 ETH | Normal çalışma (0.01 ETH bu aralığa uygundur) |
| > 0.02 ETH | wallet_balance_high — session durur |
Çalışan session'ı durdurmak için:
touch STOP_AUTOMINTBot bir sonraki poll döngüsünde dosyayı tespit eder ve session'ı güvenli şekilde sonlandırır. Dosyayı manuel olarak silmeniz gerekir — bot silmez.
Bot çalışırken ./automint.lock dosyası oluşturulur. Aynı anda ikinci bir instance başlatılamaz. Bot beklenmedik şekilde kapanırsa lock dosyası diskte kalabilir; bir sonraki başlatmada stale lock olarak otomatik temizlenir.
Session sonunda konsola JSON formatında rapor yazdırılır:
{
"sessionId": "uuid",
"startedAt": "2026-04-27T22:00:00.000Z",
"endedAt": "2026-04-28T06:00:00.000Z",
"startBlock": 24973101,
"endBlock": 24980000,
"blocksScanned": 6899,
"txSentThisSession": 3,
"stopReason": "max_runtime_exceeded",
"txHashes": ["0x..."],
"errors": []
}Bot her kesin durum kararından sonra SQLite'a checkpoint yazar:
| Durum | Checkpoint Davranışı |
|---|---|
minted |
last_scanned_block = block + 1 |
not_eligible |
last_scanned_block = block + 1 |
successful_mint |
last_scanned_block = block + 1 |
beyond_current_head |
Checkpoint ilerlemez (BEYOND_HEAD_BEHAVIOR'a göre) |
unknown / hata |
Checkpoint ilerlemez, errors tablosuna yazılır |
Checkpoint anahtarları:
last_scanned_block— tarama pozisyonulast_submitted_block— son gönderilen tx'in bloğulast_successful_mint_block— finality onaylı son başarılı mintlast_finalized_tx— son finalize tx hash
Bot şu stratejiyi uygular:
- EDMT API block-specific endpoint (
/api/v1/blocks/:N) — birincil kaynak - RPC fallback — block varlığı ve burn hesabı için (yalnızca yardımcı)
/api/v1/mints/recent— yalnızca yardımcı bilgi; tarihsel coverage garantisi yok
Önemli: EDMT block-specific API yanıt vermezse status="unknown" döner ve live mint engellenir. Sadece RPC burn hesabıyla live mint yapılmaz.
Bilinen belirsizlikler:
/api/v1/blocks/:Nendpoint'inin tam response şeması resmi olarak dokümante edilmemiştir- Fee quote endpoint (
/api/v1/blocks/:N/fee) mevcut olmayabilir — bu durumda feeundefineddöner ve fee gerektiren bloklar için live mint engellenir - API 404 döndürürse RPC fallback devreye girer ama live mint yine de engellenir
- Capture fee ETH değildir — EDMT protokol katmanındaki raw fragment balance'tan ödenir
- ERC-20 allowance veya ETH transfer gerektirmez
- Overpayment refund edilmez — fee quote'u birebir kullanın
MAX_CAPTURE_FEE_GWEIlimitini aşan fee'ler için mint yapılmaz- Fee quote alınamazsa live mint engellenir
.env dosyasında PRIVATE_KEY tanımlı değil. Live mint için gerekli.
EDMT API erişilemiyor. Bot güvenli modda çalışıyor — live mint engellendi. RPC bağlantısını ve EDMT API durumunu kontrol edin.
Ağ gas fiyatı MAX_GAS_GWEI limitini aşıyor. .env'de limiti artırın veya ağın sakinleşmesini bekleyin.
Capture fee MAX_CAPTURE_FEE_GWEI limitini aşıyor. Limiti artırın veya bu bloğu atlayın.
npm run pending # Pending tx'leri listele
npm run monitor # Finality kontrolü yap# SQLite DB'yi sil ve yeniden başlat
rm edmt-bot.sqlite
npm run resumeSQLite dosyası SQLITE_PATH (varsayılan: ./edmt-bot.sqlite) konumunda oluşturulur.
Tablolar:
checkpoints— tarama ve mint pozisyonlarıblock_results— her bloğun durum geçmişitxs— gönderilen transaction'lar ve durumlarıerrors— hata kayıtları
npm test # Tüm testleri çalıştır (54 test)
npm run test:watch # Watch modunda çalıştırTest kapsamı:
- CalldataBuilder: payload format, hex encoding, round-trip
- BlockScanner: beyond_current_head, not_eligible, burn_lt_1
- Checkpoint: advance/hold logic
- FeeQuoter: fee max kontrolü
- MintExecutor: tüm güvenlik kapıları (dry-run, live mint disabled, duplicate, gas, fee, pending)
- TxMonitor: finality, owner doğrulama, checkpoint güncelleme
CLI → BlockScanner → EdmtClient (API + RPC fallback)
↓
MintExecutor (12 güvenlik kapısı)
↓
TxMonitor (finality + indexer doğrulama)
↓
Checkpoint (SQLite kalıcı durum)
MIT
Aşağıdaki adımların tamamı tamamlanmadan DRY_RUN=false ve ENABLE_LIVE_MINT=true ayarlamayın:
- Hot wallet kullan — Ana cüzdanını veya büyük bakiyeli bir cüzdanı kullanma. Yalnızca bu bot için oluşturulmuş ayrı bir hot wallet kullan.
- Ana cüzdan kullanma — Seed phrase'ini veya ana cüzdanının private key'ini asla bu bota verme.
- Gerçek RPC URL kullan —
.env'de Alchemy, Infura, QuickNode veya kendi node'unun URL'ini kullan. Public RPC'ler rate-limit uygular ve botu bozar. - Testleri çalıştır ve geçtiğini doğrula:
npm test - Build'i çalıştır ve hata olmadığını doğrula:
npm run build
- Dry-run ile gerçek RPC ve EDMT API'ye bağlan:
npm run dry-run -- --from <BAŞLANGIÇ_BLOĞU> --limit 20
- Loglardan EDMT API block-specific status'un döndüğünü doğrula —
"source":"edmt_api"içerenblock_decisionlog satırları görünüyor mu? Eğer yalnızca"event":"api_unavailable"veya"event":"block_unknown"görünüyorsa live mint açma. - Capture fee quote davranışını kontrol et — Fee gerektiren bloklar için
requiredFeeGweideğerinin logda göründüğünü doğrula. Fee quote endpoint yoksa fee-required bloklar atlanacak. - Gas limitlerini ağ durumuna göre ayarla —
MAX_GAS_GWEIveMAX_PRIORITY_FEE_GWEIdeğerlerini güncel ağ koşullarına göre belirle. - Wallet bakiyesini kontrol et — Gas için yeterli ETH olduğundan emin ol.
-
DRY_RUN=falseveENABLE_LIVE_MINT=trueyalnızca son aşamada aç — Yukarıdaki tüm adımlar tamamlandıktan sonra. -
REQUIRE_MANUAL_CONFIRMATION_FOR_FIRST_TX=trueaçık bırak — İlk tx öncesi CLI'dayesyazarak onay ver. - Unattended mod için wallet bakiyesini kontrol et —
AUTO_MINT_MIN_WALLET_BALANCE_ETH=0.001veAUTO_MINT_REQUIRE_HOT_WALLET_BALANCE_MAX_ETH=0.02aralığında olduğundan emin ol. 0.01 ETH bu aralığa uygundur. - Emergency stop mekanizmasını test et —
touch STOP_AUTOMINTile session'ın durduğunu doğrula, ardındanrm STOP_AUTOMINTile temizle.
Bot aşağıdaki durumlarda güvenli şekilde başarısız olur — hiçbirinde gerçek tx gönderilmez:
| Durum | Bot Davranışı |
|---|---|
| EDMT block-specific endpoint çalışmıyor | status="unknown" döner, live mint yapılmaz, checkpoint ilerlemez, errors tablosuna yazılır |
| Fee quote alınamıyor (fee-required block) | skipped_fee_quote_unavailable — tx gönderilmez, block atlanır |
| RPC rate-limit veya bağlantı hatası | RPC_RETRY_LIMIT kadar retry yapılır (exponential backoff), sonra status="unknown", checkpoint ilerlemez |
Gas fiyatı MAX_GAS_GWEI limitini aşıyor |
skipped_gas_exceeds_max — tx gönderilmez |
Pending tx mevcut (ALLOW_MULTIPLE_PENDING_TX=false) |
skipped_pending_tx — yeni tx gönderilmez, önce mevcut tx'in finalize olması beklenir |
| Aynı block için daha önce tx gönderilmiş | skipped_duplicate_tx — duplicate tx engellenir |
requiredFeeGwei > MAX_CAPTURE_FEE_GWEI |
skipped_fee_exceeds_max — overpayment koruması devreye girer |
PRIVATE_KEY tanımlı değil |
skipped_no_private_key — live mint başlamaz |
DRY_RUN=true |
dry_run — tüm akış simüle edilir, tx gönderilmez |
ENABLE_LIVE_MINT=false |
skipped_live_mint_disabled — tx gönderilmez |
| EDMT API sadece RPC fallback döndürüyor | edmtStatusConfirmed=false → skipped_edmt_status_unconfirmed — RPC-only kararla live mint yapılmaz |
⚠️ Live mint açmadan önce bu adımları tamamlayın.
Bu endpoint'in response formatı EDMT tarafından resmi olarak dokümante edilmemiştir. Bot, bilinen status string'lerini (mintable, minted, beyond_current_head) normalize eder; tanımlanamayan status'lar unknown olarak işlenir ve live mint engellenir.
Doğrulama adımı:
npm run dry-run -- --from <GÜNCEL_BLOK - 10> --limit 5Logda şunu arayın:
{"event":"block_decision","source":"edmt_api","status":"mintable"}Bu satır görünüyorsa endpoint çalışıyor demektir.
Bu endpoint'in varlığı belirsizdir. Mevcut değilse:
- Fee gerektirmeyen bloklar normal şekilde işlenir
- Fee gerektiren bloklar
skipped_fee_quote_unavailableile atlanır — güvenli davranış
Doğrulama adımı: Dry-run loglarında "event":"api_unavailable" ile "url":"...fee" içeren satır varsa endpoint mevcut değil demektir. Bu durumda fee-required bloklar mintlenemez.
Bu doğrulamalar tamamlanmadan live mint açılmamalıdır.
Pipeline modu, finality beklenmeksizin birden fazla tx'i eş zamanlı olarak "uçuşta" tutarak throughput'u önemli ölçüde artırır.
Mevcut sequential modda: Her mint tx'i için ~14 dakika (64 confirmation) beklenir → 8 saatlik session'da ~36 tx.
Pipeline modunda: Finality beklenmez → eş zamanlı MAX_UNFINALIZED_TXS kadar tx uçuşta olabilir → teorik throughput MAX_UNFINALIZED_TXS × (14 dk / tx) oranında artar.
Aşağıdaki dört koşulun tamamı sağlanmalıdır:
AUTO_MINT_PIPELINE_MODE=true
UNATTENDED_AUTO_MINT=true
DRY_RUN=false
ENABLE_LIVE_MINT=true| Değişken | Varsayılan | Açıklama |
|---|---|---|
AUTO_MINT_PIPELINE_MODE |
false |
Pipeline modunu aktif et |
AUTO_MINT_MAX_PENDING_TXS |
3 |
Eş zamanlı maksimum pending tx (status='pending') |
AUTO_MINT_MAX_UNFINALIZED_TXS |
10 |
Eş zamanlı maksimum unfinalized tx (pending+included) |
AUTO_MINT_TX_SPACING_MS |
30000 |
İki ardışık tx arası minimum bekleme (ms) |
AUTO_MINT_STOP_ON_PENDING_TX_FAILURE |
true |
Failed tx görülünce yeni tx göndermeyi durdur |
AUTO_MINT_RECONCILE_INTERVAL_MS |
12000 |
TxMonitor reconcile aralığı (ms) |
AUTO_MINT_REQUIRE_INCLUDED_BEFORE_NEXT_TX |
false |
Sonraki tx'ten önce öncekinin included olmasını zorunlu kıl |
AUTO_MINT_PIPELINE_MODE=true
AUTO_MINT_MAX_PENDING_TXS=3
AUTO_MINT_MAX_UNFINALIZED_TXS=10
AUTO_MINT_TX_SPACING_MS=30000
AUTO_MINT_STOP_ON_PENDING_TX_FAILURE=true
AUTO_MINT_RECONCILE_INTERVAL_MS=12000
AUTO_MINT_REQUIRE_INCLUDED_BEFORE_NEXT_TX=falseHer loop iterasyonunda sırayla:
- Pre-checks — emergency stop, session limitleri, wallet bakiyesi
- Monitor Phase —
TxMonitor.poll()çağrılır; pending/included tx'ler izlenir - Stop condition check —
review_requiredveyafailedtx varsa yeni tx gönderimi durur - Capacity check —
pendingCount < MAX_PENDING_TXSveunfinalizedCount < MAX_UNFINALIZED_TXSkontrolü - Tx spacing check — son tx'ten bu yana
TX_SPACING_MSgeçti mi? - Nonce check —
getPendingNonce()ile nonce anomaly tespiti - Scan/Send Phase — mintable block bulunursa tx gönderilir, scan checkpoint ilerler
- Sleep —
RECONCILE_INTERVAL_MSkadar bekle
- Tüm mevcut güvenlik kapıları (Gate 1–12) geçerliliğini sürdürür
AUTO_MINT_PIPELINE_MODE=falseolduğunda eski davranış aynen korunur- Nonce anomaly (dropped tx, gap) tespit edildiğinde yeni tx gönderimi durur
- Aynı block için duplicate tx gönderimi
block_resultstablosu ile önlenir review_requiredveyafailedtx durumunda pipeline otomatik durur- Emergency stop (
STOP_AUTOMINTdosyası) yeni tx gönderimini durdurur; mevcut pending tx'ler izlenmeye devam eder
| Checkpoint | Ne Zaman İlerler |
|---|---|
last_scanned_block |
Tx submit edildiğinde veya block atlandığında |
last_successful_mint_block |
Finality (64+ conf) + EDMT owner doğrulaması sonrası |
İki checkpoint birbirinden bağımsız ilerler — duplicate tx riski olmadan tarama sürekliliği sağlanır.
| Event | Açıklama |
|---|---|
pipeline_mode_enabled |
Session başlangıcında pipeline modu aktif |
pipeline_monitor_poll |
Her iterasyonda TxMonitor.poll() çağrıldı |
pipeline_pending_capacity_available |
Kapasite müsait, tx gönderilebilir |
pipeline_pending_capacity_full |
Kapasite dolu, yeni tx gönderilmiyor |
pipeline_tx_spacing_wait |
Tx spacing süresi dolmadı, bekleniyor |
pipeline_tx_submitted |
Tx başarıyla gönderildi |
pipeline_finalized_reconciled |
Tx finalize edildi, checkpoint güncellendi |
pipeline_nonce_anomaly |
Nonce anomaly tespit edildi, pipeline durdu |
pipeline_duplicate_prevented |
Duplicate tx önlendi |
High Burn Priority Mode (HIGH_BURN_PRIORITY_MODE=true) re-orders the minting queue by Ethereum burn value. Instead of scanning blocks sequentially, the bot indexes blocks by burnEth = burnGwei / 1e9, groups them into tier buckets, and selects candidates from the highest tier downward.
HIGH_BURN_MIN_ETH_TIERS defines minimum threshold bucket boundaries, not exact targets:
| Tier | Bucket Range |
|---|---|
| 100 | burnEth >= 100 |
| 90 | 90 <= burnEth < 100 |
| 50 | 50 <= burnEth < 90 |
| 20 | 20 <= burnEth < 50 |
| 10 | 10 <= burnEth < 20 |
| 5 | 5 <= burnEth < 10 |
| 4 | 4 <= burnEth < 5 |
| 3 | 3 <= burnEth < 4 |
| 2 | 2 <= burnEth < 3 |
| 1 | 1 <= burnEth < 2 |
| 0.5 | 0.5 <= burnEth < 1 |
| 0.25 | 0.25 <= burnEth < 0.5 |
| 0.1 | 0.1 <= burnEth < 0.25 |
After exhausting the 100-tier, the bot scans ALL blocks with 90 <= burnEth < 100 (not just exactly 90 ETH blocks), sorted by burnEth DESC.
HIGH_BURN_PRIORITY_MODE=true
UNATTENDED_AUTO_MINT=true
DRY_RUN=false
ENABLE_LIVE_MINT=trueHIGH_BURN_PRIORITY_MODE=true
HIGH_BURN_ACTIVE_TIER_ETH=4
HIGH_BURN_MIN_ETH_TIERS=100,90,50,20,10,5,4,3,2,1,0.5,0.25,0.1
HIGH_BURN_ON_EXHAUSTED=fallback_sequential
HIGH_BURN_ONLY_NO_FEE=true
HIGH_BURN_USE_CACHE=true
HIGH_BURN_CACHE_TTL_HOURS=168
HIGH_BURN_UNKNOWN_RETRY_MINUTES=30
HIGH_BURN_PENDING_API_BASE_URL=https://api.edmt.io/api/v1Preferred path: import EDMT's pending/unminted queue into SQLite without historical
RPC calls. The endpoint is ordered by burn, so the importer stops once it falls
below --min-eth.
# Import currently unminted candidates with burn >= 1 ETH
npm run highburn:import-pending -- --min-eth 1 --page-size 100
# If you want to include smaller high-burn/dust candidates later
npm run highburn:import-pending -- --min-eth 0.05 --page-size 100 --reset-cursor
# Inspect the queue before minting
npm run highburn:queue -- --min-eth 1 --limit 50
# Mint from SQLite in burn-desc order; use dry-run first
npm run highburn:catchup -- --min-eth 1 --limit 100 --dry-run
npm run highburn:catchup -- --min-eth 1 --limit 100 --max-tx 3Fallback path: if you still need a London-to-head historical RPC scan, use the
resumable scanner. It checkpoints highburn_rpc_scan_next_block and sleeps on
rate-limit errors.
npm run highburn:scan-resume -- --from 12965000 --min-eth 1 --chunk-size 1000 --concurrency 1
npm run highburn:scan-resume -- --min-eth 1 --max-blocks 50000| Variable | Default | Description |
|---|---|---|
HIGH_BURN_PRIORITY_MODE |
false |
Enable high burn priority mode |
HIGH_BURN_SCAN_START_BLOCK |
12965000 |
Indexing start block |
HIGH_BURN_SCAN_END_BLOCK |
(empty) | Indexing end block (empty = chain head) |
HIGH_BURN_MIN_ETH_TIERS |
100,90,...,0.1 |
Tier bucket boundaries (comma-separated ETH) |
HIGH_BURN_ACTIVE_TIER_ETH |
4 |
Initial active tier on session start |
HIGH_BURN_BATCH_SIZE |
1000 |
Blocks per RPC indexing batch |
HIGH_BURN_MAX_CANDIDATES_PER_TIER |
10000 |
Max candidates stored per tier |
HIGH_BURN_RESCAN_MINTED |
false |
Re-scan finalized/minted_elsewhere blocks |
HIGH_BURN_USE_CACHE |
true |
Skip RPC if block already indexed within TTL |
HIGH_BURN_CACHE_TTL_HOURS |
168 |
Cache validity (hours) |
HIGH_BURN_SORT |
desc |
Candidate sort order within tier |
HIGH_BURN_ONLY_MINTABLE |
true |
Only select EDMT-confirmed mintable candidates |
HIGH_BURN_ONLY_NO_FEE |
true |
Skip fee-required candidates |
HIGH_BURN_SKIP_ALREADY_SEEN |
true |
Skip submitted/finalized/minted_elsewhere blocks |
HIGH_BURN_ON_EXHAUSTED |
fallback_sequential |
Behavior when all tiers exhausted |
HIGH_BURN_UNKNOWN_RETRY_MINUTES |
30 |
Retry interval for unknown-status candidates |
HIGH_BURN_PENDING_API_BASE_URL |
https://api.edmt.io/api/v1 |
RPC-free pending candidate API base |
HIGH_BURN_RPC_SCAN_CHUNK_SIZE |
1000 |
Resumable RPC scanner chunk size |
HIGH_BURN_RPC_SCAN_CONCURRENCY |
1 |
Resumable RPC scanner concurrency |
HIGH_BURN_RPC_SCAN_REQUEST_DELAY_MS |
250 |
Delay before each RPC block fetch |
HIGH_BURN_RPC_SCAN_RATE_LIMIT_COOLDOWN_MS |
300000 |
Sleep after rate-limit errors |
HIGH_BURN_RPC_SCAN_MAX_RETRIES |
8 |
Retries per block before recording an error |
# Index blocks for high-burn candidates (no tx sent)
npm run highburn:scan -- --from 12965000 --to 20000000 --min-eth 4
# Import EDMT pending/unminted high-burn candidates without RPC scanning
npm run highburn:import-pending -- --min-eth 1 --page-size 100
# Resume a rate-limit-aware RPC scan
npm run highburn:scan-resume -- --from 12965000 --min-eth 1
# Show candidate stats by tier and status
npm run highburn:status
# Show top queued candidates
npm run highburn:queue -- --min-eth 1 --limit 50
# Start high burn mint session
npm run highburn:mint
# Reset a tier's candidates to discovered
npm run highburn:reset-cache -- --tier 4High Burn Mode works with Pipeline Mode:
HIGH_BURN_PRIORITY_MODE=true
AUTO_MINT_PIPELINE_MODE=trueWhen both are active: high-burn candidates are selected and submitted without waiting for finality. All pipeline guards (capacity, tx spacing, nonce reconcile, duplicate prevention) remain active.
When all tiers have no more mintable candidates:
fallback_sequential— returns to normallast_scanned_blockcheckpoint scanningwait— sleeps and retries candidate selectionstop— session ends withhigh_burn_all_tiers_exhausted