Skip to content

We're upgrading our operations to serve you better. Orders ship as usual from Laval, QC. Questions? Contact us

Bitcoin accepted at checkout  |  Ships from Laval, QC, Canada  |  Expert support since 2016

/* ===== MINING CALCULATOR STYLES ===== */ @import url(‘https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=Barlow+Condensed:wght@600;700&display=swap’); .mc-calc { –mc-bg-primary: #0D0D0D; –mc-bg-secondary: #1E1E2E; –mc-bg-tertiary: #242432; –mc-accent: #FF6E00; –mc-accent-glow: rgba(255, 110, 0, 0.15); –mc-accent-glow-strong: rgba(255, 110, 0, 0.35); –mc-text-primary: #E8E8E8; –mc-text-secondary: #8A8A8A; –mc-border: #333333; –mc-border-subtle: #2A2A2A; –mc-green: #10B981; –mc-red: #EF4444; –mc-terminal-bg: #0A0A0A; –mc-font-body: ‘Inter’, -apple-system, BlinkMacSystemFont, sans-serif; –mc-font-mono: ‘JetBrains Mono’, ‘Fira Code’, ‘Consolas’, monospace; –mc-font-heading: ‘Barlow Condensed’, ‘Inter’, sans-serif; max-width: 1280px; margin: 0 auto; padding: 0 16px; font-family: var(–mc-font-body); color: var(–mc-text-primary); line-height: 1.6; -webkit-font-smoothing: antialiased; } .mc-calc *, .mc-calc *::before, .mc-calc *::after { box-sizing: border-box; } /* —- Intro Section —- */ .mc-intro { margin-bottom: 40px; padding-bottom: 32px; border-bottom: 1px solid var(–mc-border-subtle); } .mc-intro h1 { font-family: var(–mc-font-heading); font-size: clamp(1.75rem, 4vw, 2.5rem); font-weight: 700; color: var(–mc-text-primary); margin: 0 0 8px 0; text-transform: uppercase; letter-spacing: 0.5px; line-height: 1.2; } .mc-intro .mc-terminal-tag { font-family: var(–mc-font-mono); font-size: 0.8rem; color: var(–mc-accent); margin-bottom: 20px; display: block; } .mc-intro .mc-terminal-tag::before { content: ‘> ‘; opacity: 0.6; } .mc-intro p { font-size: 1rem; color: var(–mc-text-secondary); margin: 0 0 12px 0; max-width: 800px; line-height: 1.7; } .mc-intro p strong { color: var(–mc-text-primary); } /* —- Live Data Banner —- */ .mc-live-banner { background: var(–mc-terminal-bg); border: 1px solid var(–mc-border-subtle); border-radius: 6px; padding: 12px 16px; margin-bottom: 24px; display: flex; flex-wrap: wrap; align-items: center; gap: 16px; font-family: var(–mc-font-mono); font-size: 0.8rem; } .mc-live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(–mc-green); display: inline-block; animation: mc-pulse 2s ease-in-out infinite; flex-shrink: 0; } .mc-live-dot.mc-offline { background: var(–mc-red); animation: none; } @keyframes mc-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .mc-live-item { display: flex; align-items: center; gap: 6px; color: var(–mc-text-secondary); } .mc-live-item span.mc-live-value { color: var(–mc-green); font-weight: 600; } .mc-live-item span.mc-live-value.mc-stale { color: var(–mc-text-secondary); } .mc-live-status-text { color: var(–mc-text-secondary); font-size: 0.75rem; } /* —- Calculator Grid —- */ .mc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-bottom: 32px; } @media (max-width: 768px) { .mc-grid { grid-template-columns: 1fr; } } /* —- Card Styles —- */ .mc-card { background: var(–mc-bg-secondary); border: 1px solid var(–mc-border); border-radius: 8px; padding: 24px; transition: border-color 0.2s ease; } .mc-card:hover { border-color: rgba(255, 110, 0, 0.3); } .mc-card-title { font-family: var(–mc-font-heading); font-size: 1.1rem; font-weight: 700; color: var(–mc-text-primary); text-transform: uppercase; letter-spacing: 1px; margin: 0 0 20px 0; padding-bottom: 12px; border-bottom: 2px solid var(–mc-accent); display: flex; align-items: center; gap: 8px; } .mc-card-title .mc-icon { font-size: 1rem; opacity: 0.8; } /* —- Form Elements —- */ .mc-field { margin-bottom: 16px; } .mc-field:last-child { margin-bottom: 0; } .mc-field label { display: block; font-size: 0.8rem; font-weight: 500; color: var(–mc-text-secondary); margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px; font-family: var(–mc-font-body); } .mc-field label .mc-unit { font-family: var(–mc-font-mono); font-size: 0.7rem; color: var(–mc-accent); margin-left: 4px; opacity: 0.8; } .mc-input-wrap { position: relative; display: flex; align-items: center; } .mc-input-wrap .mc-suffix { position: absolute; right: 12px; font-family: var(–mc-font-mono); font-size: 0.75rem; color: var(–mc-text-secondary); pointer-events: none; } .mc-calc input[type=”number”], .mc-calc select { width: 100%; background: var(–mc-terminal-bg); border: 1px solid var(–mc-border); border-radius: 4px; padding: 10px 12px; font-family: var(–mc-font-mono); font-size: 0.9rem; color: var(–mc-text-primary); transition: border-color 0.2s ease, box-shadow 0.2s ease; -moz-appearance: textfield; outline: none; } .mc-calc input[type=”number”]::-webkit-inner-spin-button, .mc-calc input[type=”number”]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } .mc-calc input[type=”number”]:focus, .mc-calc select:focus { border-color: var(–mc-accent); box-shadow: 0 0 0 2px var(–mc-accent-glow); } .mc-calc select { appearance: none; -webkit-appearance: none; background-image: url(“data:image/svg+xml,%3Csvg xmlns=’http://www.w3.org/2000/svg’ width=’12’ height=’12’ viewBox=’0 0 12 12’%3E%3Cpath fill=’%23FF6E00′ d=’M6 8L1 3h10z’/%3E%3C/svg%3E”); background-repeat: no-repeat; background-position: right 12px center; padding-right: 32px; cursor: pointer; } .mc-calc select option { background: var(–mc-bg-secondary); color: var(–mc-text-primary); } .mc-input-has-suffix input { padding-right: 60px; } .mc-api-fallback { font-family: var(–mc-font-mono); font-size: 0.7rem; color: var(–mc-text-secondary); margin-top: 4px; display: none; } .mc-api-fallback.mc-visible { display: block; } /* —- Results Section —- */ .mc-results { grid-column: 1 / -1; } .mc-results-card { background: var(–mc-bg-secondary); border: 2px solid var(–mc-border); border-radius: 8px; padding: 28px; transition: border-color 0.3s ease, box-shadow 0.3s ease; } .mc-results-card.mc-profit { border-color: rgba(16, 185, 129, 0.4); box-shadow: 0 0 20px rgba(16, 185, 129, 0.08); } .mc-results-card.mc-loss { border-color: rgba(239, 68, 68, 0.4); box-shadow: 0 0 20px rgba(239, 68, 68, 0.08); } .mc-results-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; padding-bottom: 16px; border-bottom: 2px solid var(–mc-accent); flex-wrap: wrap; gap: 12px; } .mc-results-header h2 { font-family: var(–mc-font-heading); font-size: 1.2rem; font-weight: 700; color: var(–mc-text-primary); text-transform: uppercase; letter-spacing: 1px; margin: 0; } .mc-profit-indicator { font-family: var(–mc-font-mono); font-size: 0.85rem; font-weight: 600; padding: 6px 14px; border-radius: 4px; text-transform: uppercase; letter-spacing: 1px; } .mc-profit-indicator.mc-positive { background: rgba(16, 185, 129, 0.15); color: var(–mc-green); border: 1px solid rgba(16, 185, 129, 0.3); } .mc-profit-indicator.mc-negative { background: rgba(239, 68, 68, 0.15); color: var(–mc-red); border: 1px solid rgba(239, 68, 68, 0.3); } /* Results Table */ .mc-results-table { width: 100%; border-collapse: collapse; margin-bottom: 24px; } .mc-results-table thead th { font-family: var(–mc-font-mono); font-size: 0.7rem; font-weight: 600; color: var(–mc-text-secondary); text-transform: uppercase; letter-spacing: 1px; text-align: right; padding: 8px 12px; border-bottom: 2px solid var(–mc-accent); } .mc-results-table thead th:first-child { text-align: left; } .mc-results-table tbody td { font-family: var(–mc-font-mono); font-size: 0.85rem; color: var(–mc-text-primary); text-align: right; padding: 10px 12px; border-bottom: 1px solid var(–mc-border-subtle); } .mc-results-table tbody td:first-child { text-align: left; color: var(–mc-text-secondary); font-weight: 500; } .mc-results-table tbody tr:last-child td { border-bottom: none; } .mc-val-btc { color: var(–mc-accent); } .mc-val-usd { color: var(–mc-text-primary); } .mc-val-cost { color: var(–mc-red); } .mc-val-profit { font-weight: 700; } .mc-val-profit.mc-positive { color: var(–mc-green); } .mc-val-profit.mc-negative { color: var(–mc-red); } /* Key Metrics Row */ .mc-key-metrics { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 20px; padding-top: 20px; border-top: 1px solid var(–mc-border-subtle); } @media (max-width: 600px) { .mc-key-metrics { grid-template-columns: 1fr; gap: 12px; } } .mc-metric { background: var(–mc-terminal-bg); border: 1px solid var(–mc-border-subtle); border-radius: 6px; padding: 14px; text-align: center; } .mc-metric-label { font-size: 0.7rem; font-weight: 600; color: var(–mc-text-secondary); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; font-family: var(–mc-font-body); } .mc-metric-value { font-family: var(–mc-font-mono); font-size: 1.1rem; font-weight: 700; color: var(–mc-accent); } .mc-metric-sub { font-family: var(–mc-font-mono); font-size: 0.7rem; color: var(–mc-text-secondary); margin-top: 4px; } /* —- Solo Mining Section —- */ .mc-solo-section { grid-column: 1 / -1; } .mc-solo-card { background: var(–mc-bg-secondary); border: 1px solid var(–mc-border); border-radius: 8px; padding: 24px; margin-bottom: 0; } .mc-solo-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 16px; } @media (max-width: 600px) { .mc-solo-stats { grid-template-columns: 1fr; } } .mc-solo-stat { background: var(–mc-terminal-bg); border: 1px solid var(–mc-border-subtle); border-radius: 6px; padding: 16px; text-align: center; } .mc-solo-stat-label { font-size: 0.7rem; color: var(–mc-text-secondary); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; font-family: var(–mc-font-body); } .mc-solo-stat-value { font-family: var(–mc-font-mono); font-size: 1rem; font-weight: 700; color: var(–mc-accent); } .mc-solo-note { font-size: 0.8rem; color: var(–mc-text-secondary); margin-top: 16px; padding: 12px; background: var(–mc-terminal-bg); border-left: 3px solid var(–mc-accent); border-radius: 0 4px 4px 0; font-style: italic; line-height: 1.5; } .mc-solo-note strong { color: var(–mc-accent); font-style: normal; } /* —- CTA Section —- */ .mc-cta-section { background: linear-gradient(135deg, var(–mc-bg-secondary) 0%, var(–mc-bg-tertiary) 100%); border: 1px solid var(–mc-border); border-radius: 8px; padding: 32px; text-align: center; margin: 32px 0; position: relative; overflow: hidden; } .mc-cta-section::before { content: ”; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, transparent, var(–mc-accent), transparent); } .mc-cta-section h3 { font-family: var(–mc-font-heading); font-size: 1.3rem; font-weight: 700; color: var(–mc-text-primary); text-transform: uppercase; margin: 0 0 8px 0; } .mc-cta-section p { color: var(–mc-text-secondary); font-size: 0.95rem; margin: 0 0 20px 0; max-width: 600px; margin-left: auto; margin-right: auto; } .mc-cta-btn { display: inline-block; background: var(–mc-accent); color: #ffffff; font-family: var(–mc-font-heading); font-size: 1rem; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; padding: 14px 32px; border-radius: 4px; text-decoration: none; transition: background 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease; box-shadow: 0 0 15px var(–mc-accent-glow); } .mc-cta-btn:hover { background: #ff8a2e; box-shadow: 0 0 25px var(–mc-accent-glow-strong); transform: translateY(-1px); color: #ffffff; text-decoration: none; } .mc-cta-secondary { display: flex; justify-content: center; flex-wrap: wrap; gap: 16px; margin-top: 16px; } .mc-cta-link { font-family: var(–mc-font-mono); font-size: 0.8rem; color: var(–mc-accent); text-decoration: none; padding: 6px 12px; border: 1px solid rgba(255, 110, 0, 0.3); border-radius: 4px; transition: border-color 0.2s ease, background 0.2s ease; } .mc-cta-link:hover { border-color: var(–mc-accent); background: var(–mc-accent-glow); color: var(–mc-accent); text-decoration: none; } /* —- FAQ Section —- */ .mc-faq { margin-top: 40px; padding-top: 32px; border-top: 1px solid var(–mc-border-subtle); } .mc-faq h2 { font-family: var(–mc-font-heading); font-size: 1.3rem; font-weight: 700; color: var(–mc-text-primary); text-transform: uppercase; letter-spacing: 1px; margin: 0 0 20px 0; } .mc-faq details { background: var(–mc-bg-secondary); border: 1px solid var(–mc-border); border-radius: 6px; margin-bottom: 8px; transition: border-color 0.2s ease; } .mc-faq details[open] { border-color: rgba(255, 110, 0, 0.3); } .mc-faq details summary { font-family: var(–mc-font-body); font-weight: 600; font-size: 0.95rem; color: var(–mc-text-primary); padding: 14px 18px; cursor: pointer; list-style: none; display: flex; align-items: center; gap: 10px; transition: color 0.2s ease; } .mc-faq details summary::-webkit-details-marker { display: none; } .mc-faq details summary::before { content: ‘+’; font-family: var(–mc-font-mono); font-size: 1rem; color: var(–mc-accent); flex-shrink: 0; width: 20px; text-align: center; transition: transform 0.2s ease; } .mc-faq details[open] summary::before { content: ‘-‘; } .mc-faq details summary:hover { color: var(–mc-accent); } .mc-faq details p { padding: 0 18px 14px 48px; margin: 0; font-size: 0.9rem; color: var(–mc-text-secondary); line-height: 1.7; } .mc-faq details p a { color: var(–mc-accent); text-decoration: underline; text-underline-offset: 2px; } .mc-faq details p a:hover { color: #ff8a2e; } /* —- Related Links —- */ .mc-related { margin-top: 32px; padding: 24px; background: var(–mc-bg-secondary); border: 1px solid var(–mc-border); border-radius: 8px; } .mc-related h3 { font-family: var(–mc-font-heading); font-size: 1rem; font-weight: 700; color: var(–mc-text-primary); text-transform: uppercase; letter-spacing: 1px; margin: 0 0 16px 0; } .mc-related-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; } .mc-related-link { display: flex; align-items: center; gap: 8px; padding: 12px 14px; background: var(–mc-terminal-bg); border: 1px solid var(–mc-border-subtle); border-radius: 4px; color: var(–mc-text-primary); text-decoration: none; font-size: 0.85rem; font-weight: 500; transition: border-color 0.2s ease, background 0.2s ease; } .mc-related-link:hover { border-color: var(–mc-accent); background: var(–mc-accent-glow); color: var(–mc-text-primary); text-decoration: none; } .mc-related-link .mc-arrow { font-family: var(–mc-font-mono); color: var(–mc-accent); font-size: 0.8rem; } /* —- Ethos Footer —- */ .mc-ethos { text-align: center; padding: 24px 0 8px; margin-top: 32px; border-top: 1px solid var(–mc-border-subtle); } .mc-ethos p { font-family: var(–mc-font-mono); font-size: 0.85rem; color: var(–mc-text-secondary); margin: 0; } .mc-ethos p strong { color: var(–mc-accent); } /* —- Responsive Overrides —- */ @media (max-width: 480px) { .mc-card { padding: 16px; } .mc-results-card { padding: 16px; } .mc-results-table thead th, .mc-results-table tbody td { padding: 8px 6px; font-size: 0.75rem; } .mc-cta-section { padding: 24px 16px; } .mc-metric-value { font-size: 0.95rem; } .mc-live-banner { gap: 10px; padding: 10px 12px; } .mc-live-item { font-size: 0.7rem; } } /* Overflow handling for results table on mobile */ .mc-results-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; } /* —- Loading spinner —- */ .mc-spinner { display: inline-block; width: 12px; height: 12px; border: 2px solid var(–mc-border); border-top: 2px solid var(–mc-accent); border-radius: 50%; animation: mc-spin 0.8s linear infinite; vertical-align: middle; margin-left: 6px; } @keyframes mc-spin { to { transform: rotate(360deg); } } /* Hashrate unit toggle */ .mc-hash-toggle { display: flex; gap: 0; margin-bottom: 8px; } .mc-hash-toggle button { flex: 1; background: var(–mc-terminal-bg); border: 1px solid var(–mc-border); color: var(–mc-text-secondary); font-family: var(–mc-font-mono); font-size: 0.75rem; padding: 6px 10px; cursor: pointer; transition: all 0.2s ease; } .mc-hash-toggle button:first-child { border-radius: 4px 0 0 4px; } .mc-hash-toggle button:last-child { border-radius: 0 4px 4px 0; } .mc-hash-toggle button:not(:last-child) { border-right: none; } .mc-hash-toggle button.mc-active { background: var(–mc-accent); border-color: var(–mc-accent); color: #ffffff; font-weight: 600; } .mc-hash-toggle button:hover:not(.mc-active) { border-color: var(–mc-accent); color: var(–mc-accent); }

Bitcoin Mining Profitability Calculator

d-central.tech/mining-calculator –live

Estimate your Bitcoin mining revenue, electricity costs, and net profit before you buy your first miner or add to your fleet. This calculator uses live Bitcoin price and real-time network difficulty data to give you accurate projections for any mining hardware — from a solo Bitaxe to a full Antminer S21.

Whether you are heating your home with a Bitcoin Space Heater, solo mining for the thrill of hitting a block, or running a serious operation, understanding profitability is your first step. D-Central Technologies has helped thousands of home miners since 2016. Use our calculator, then browse our complete miner lineup to get started.

Fetching live data…
BTC/USD:
Difficulty:
Block Reward: 3.125 BTC
Hardware Configuration
— Custom / Manual Entry — Bitaxe Supra (600 GH/s, 15W) Bitaxe Ultra (500 GH/s, 12W) Bitaxe Hex (3 TH/s, 65W) Antminer S9 (14 TH/s, 1350W) Antminer S19 (95 TH/s, 3250W) Antminer S19 XP (140 TH/s, 3010W) Antminer S21 (200 TH/s, 3500W)
W
Economic Parameters
$/kWh
%
USD
Live data unavailable — enter manually
Live data unavailable — enter manually
BTC

Profitability Estimate

Profitable
Period Revenue (BTC) Revenue (USD) Power Cost Net Profit
Daily
Monthly
Yearly
Break-Even Electricity
$/kWh
Cost per BTC Mined
USD
Daily Power Draw
kWh / day
Solo Mining Odds

If you mine solo (without a pool), your chance of finding a block depends on your share of the total network hashrate. Here are your odds with the current hardware configuration:

Network Share
Avg. Time to Find Block
Block Reward Value
Remember: Solo mining is a lottery — you either earn the full block reward or nothing. These are statistical averages. With devices like the Bitaxe, you are joining a growing community of solo miners who believe every hash counts.

Ready to Start Mining?

Browse our complete lineup of miners — from Bitaxe solo miners to full Antminer rigs and Bitcoin Space Heaters.

Browse All Miners

Frequently Asked Questions

How is Bitcoin mining profitability calculated?

Mining profitability is determined by comparing your mining revenue (how much BTC you earn based on your hashrate relative to the total network) against your electricity costs. The formula uses your hashrate, the current network difficulty, block reward (currently 3.125 BTC after the April 2024 halving), and the current Bitcoin price to estimate daily earnings. Then your electricity cost (power consumption in watts multiplied by hours and your rate per kWh) is subtracted to determine net profit. Keep in mind that difficulty adjusts roughly every two weeks, and BTC price is constantly changing, so profitability is a moving target.

What electricity rate do I need to be profitable?

The break-even electricity rate varies by hardware. Newer, more efficient miners like the Antminer S21 (17.5 J/TH) can be profitable at much higher electricity rates than older models like the S9 (96.4 J/TH). In Canada, Quebec hydropower offers some of the lowest rates in North America at around $0.06 CAD/kWh, making it ideal for mining. Use the “Break-Even Electricity” metric in our calculator above to see the maximum rate your specific setup can handle. Many home miners also offset costs by using their miner as a space heater, effectively reducing the net electricity cost.

Is solo mining with a Bitaxe actually profitable?

In terms of expected value from pool payouts, a single Bitaxe earns very small daily BTC amounts. However, solo mining is a different game entirely — it is a lottery. With a Bitaxe connected to a solo mining pool, you have a small but real chance of finding an entire block and earning the full 3.125 BTC reward (~$300,000+ at current prices). Many Bitaxe miners view it as a fun, educational hobby that supports network decentralization and heats a small space. It is not about ROI in the traditional sense — it is about participating in Bitcoin’s security and hoping for a lucky block. Learn more at our Bitaxe Hub.

How does Bitcoin’s difficulty affect my mining revenue?

Network difficulty adjusts approximately every 2,016 blocks (roughly every 14 days) to maintain the target block time of 10 minutes. When more miners join the network (hashrate increases), difficulty goes up, reducing everyone’s revenue per TH/s. When miners leave, difficulty drops and revenue per TH/s increases. Historically, difficulty has trended upward as more powerful hardware enters the market. This calculator uses the current difficulty, but remember that future difficulty changes will impact your long-term projections. More efficient hardware gives you a wider margin to stay profitable as difficulty climbs.

Should I factor in the cost of the miner itself?

Yes, for a complete financial picture you should consider your hardware purchase price. This calculator shows ongoing operational profitability (revenue minus electricity), which helps you understand your cash flow. To calculate your full ROI, take your monthly net profit from this calculator and divide your hardware cost by that amount to get your payback period in months. For example, if a Bitaxe Hex costs $400 and earns $15/month in net profit, your payback period would be approximately 27 months. Browse our hardware lineup to compare options and plan your investment.

Every hash counts. D-Central Technologies — Bitcoin Mining Hackers since 2016.

(function() { ‘use strict’; // ===== Miner Presets ===== var MINERS = { ‘custom’: { hashrate: 0, power: 0, unit: ‘TH’ }, ‘bitaxe-supra’: { hashrate: 0.6, power: 15, unit: ‘TH’, ghVal: 600 }, ‘bitaxe-ultra’: { hashrate: 0.5, power: 12, unit: ‘TH’, ghVal: 500 }, ‘bitaxe-hex’: { hashrate: 3, power: 65, unit: ‘TH’ }, ‘antminer-s9’: { hashrate: 14, power: 1350, unit: ‘TH’ }, ‘antminer-s19’: { hashrate: 95, power: 3250, unit: ‘TH’ }, ‘antminer-s19xp’: { hashrate: 140, power: 3010, unit: ‘TH’ }, ‘antminer-s21’: { hashrate: 200, power: 3500, unit: ‘TH’ } }; // ===== DOM References ===== var el = { model: document.getElementById(‘mcMinerModel’), hashrate: document.getElementById(‘mcHashrate’), power: document.getElementById(‘mcPower’), electricity: document.getElementById(‘mcElectricity’), poolFee: document.getElementById(‘mcPoolFee’), btcPrice: document.getElementById(‘mcBtcPrice’), difficulty: document.getElementById(‘mcDifficulty’), blockReward: document.getElementById(‘mcBlockReward’), resultsCard: document.getElementById(‘mcResultsCard’), profitInd: document.getElementById(‘mcProfitIndicator’), hashUnitLabel:document.getElementById(‘mcHashrateUnitLabel’), liveDot: document.getElementById(‘mcLiveDot’), liveStatus: document.getElementById(‘mcLiveStatus’), liveBtcPrice: document.getElementById(‘mcLiveBtcPrice’), liveDiff: document.getElementById(‘mcLiveDifficulty’), btcFallback: document.getElementById(‘mcBtcPriceFallback’), diffFallback: document.getElementById(‘mcDifficultyFallback’) }; // Result cells var res = { revBtcDaily: document.getElementById(‘mcRevBtcDaily’), revBtcMonthly: document.getElementById(‘mcRevBtcMonthly’), revBtcYearly: document.getElementById(‘mcRevBtcYearly’), revUsdDaily: document.getElementById(‘mcRevUsdDaily’), revUsdMonthly: document.getElementById(‘mcRevUsdMonthly’), revUsdYearly: document.getElementById(‘mcRevUsdYearly’), costDaily: document.getElementById(‘mcCostDaily’), costMonthly: document.getElementById(‘mcCostMonthly’), costYearly: document.getElementById(‘mcCostYearly’), profitDaily: document.getElementById(‘mcProfitDaily’), profitMonthly: document.getElementById(‘mcProfitMonthly’), profitYearly: document.getElementById(‘mcProfitYearly’), breakEven: document.getElementById(‘mcBreakEven’), costPerBtc: document.getElementById(‘mcCostPerBtc’), dailyKwh: document.getElementById(‘mcDailyKwh’), soloShare: document.getElementById(‘mcSoloShare’), soloTime: document.getElementById(‘mcSoloTime’), soloReward: document.getElementById(‘mcSoloReward’) }; // ===== State ===== var currentUnit = ‘TH’; // GH, TH, PH var liveDataLoaded = { price: false, difficulty: false }; // ===== Hashrate Unit Toggle ===== var toggleButtons = document.querySelectorAll(‘#mcHashToggle button’); for (var i = 0; i < toggleButtons.length; i++) { toggleButtons[i].addEventListener('click', function() { var newUnit = this.getAttribute('data-unit'); switchHashUnit(newUnit); }); } function switchHashUnit(newUnit) { if (newUnit === currentUnit) return; var currentVal = parseFloat(el.hashrate.value) || 0; var thsValue = toTHs(currentVal, currentUnit); var newVal = fromTHs(thsValue, newUnit); currentUnit = newUnit; el.hashrate.value = formatInputNumber(newVal); el.hashUnitLabel.textContent = newUnit + '/s'; // Update toggle button styles for (var i = 0; i = 1) return parseFloat(n.toPrecision(6)); // For very small numbers return parseFloat(n.toPrecision(4)); } // ===== Miner Model Selection ===== el.model.addEventListener(‘change’, function() { var preset = MINERS[this.value]; if (!preset || this.value === ‘custom’) return; // Always set to TH/s when selecting a preset switchHashUnit(‘TH’); el.hashrate.value = preset.hashrate; el.power.value = preset.power; calculate(); }); // ===== Fetch Live Data ===== function fetchBtcPrice() { var controller; var timeoutId; if (typeof AbortController !== ‘undefined’) { controller = new AbortController(); timeoutId = setTimeout(function() { controller.abort(); }, 8000); } var fetchOpts = controller ? { signal: controller.signal } : {}; fetch(‘https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd,cad’, fetchOpts) .then(function(r) { if (timeoutId) clearTimeout(timeoutId); if (!r.ok) throw new Error(‘HTTP ‘ + r.status); return r.json(); }) .then(function(data) { if (data && data.bitcoin && data.bitcoin.usd) { var price = Math.round(data.bitcoin.usd); el.btcPrice.value = price; el.liveBtcPrice.textContent = ‘$’ + price.toLocaleString(‘en-US’); el.liveBtcPrice.classList.remove(‘mc-stale’); liveDataLoaded.price = true; updateLiveStatus(); calculate(); } }) .catch(function() { if (timeoutId) clearTimeout(timeoutId); el.btcFallback.classList.add(‘mc-visible’); el.liveBtcPrice.textContent = ‘Manual’; el.liveBtcPrice.classList.add(‘mc-stale’); updateLiveStatus(); }); } function fetchDifficulty() { // Try mempool.space API first (CORS-friendly) fetch(‘https://mempool.space/api/v1/mining/hashrate/1d’) .then(function(r) { if (!r.ok) throw new Error(‘HTTP ‘ + r.status); return r.json(); }) .then(function(data) { if (data && data.currentDifficulty) { var diff = data.currentDifficulty; el.difficulty.value = Math.round(diff); el.liveDiff.textContent = formatDifficulty(diff); el.liveDiff.classList.remove(‘mc-stale’); liveDataLoaded.difficulty = true; updateLiveStatus(); calculate(); } else { throw new Error(‘No difficulty in response’); } }) .catch(function() { // Fallback: try blockchain.info via different endpoint fetch(‘https://blockchain.info/q/getdifficulty’) .then(function(r) { if (!r.ok) throw new Error(‘HTTP ‘ + r.status); return r.text(); }) .then(function(text) { var diff = parseFloat(text); if (!isNaN(diff) && diff > 0) { el.difficulty.value = Math.round(diff); el.liveDiff.textContent = formatDifficulty(diff); el.liveDiff.classList.remove(‘mc-stale’); liveDataLoaded.difficulty = true; updateLiveStatus(); calculate(); } else { throw new Error(‘Invalid difficulty’); } }) .catch(function() { el.diffFallback.classList.add(‘mc-visible’); el.liveDiff.textContent = ‘Manual’; el.liveDiff.classList.add(‘mc-stale’); updateLiveStatus(); }); }); } function formatDifficulty(d) { if (d >= 1e15) return (d / 1e15).toFixed(2) + ‘ P’; if (d >= 1e12) return (d / 1e12).toFixed(2) + ‘ T’; if (d >= 1e9) return (d / 1e9).toFixed(2) + ‘ G’; if (d >= 1e6) return (d / 1e6).toFixed(2) + ‘ M’; return d.toFixed(0); } function updateLiveStatus() { if (liveDataLoaded.price && liveDataLoaded.difficulty) { el.liveDot.classList.remove(‘mc-offline’); el.liveStatus.textContent = ‘Live data connected’; } else if (!liveDataLoaded.price && !liveDataLoaded.difficulty) { el.liveDot.classList.add(‘mc-offline’); el.liveStatus.textContent = ‘Using manual values’; } else { el.liveDot.classList.remove(‘mc-offline’); el.liveStatus.textContent = ‘Partial live data’; } } // ===== Core Calculation ===== function calculate() { var hashrateTH = toTHs(parseFloat(el.hashrate.value) || 0, currentUnit); var powerW = parseFloat(el.power.value) || 0; var elecRate = parseFloat(el.electricity.value) || 0; var poolFee = parseFloat(el.poolFee.value) || 0; var btcPrice = parseFloat(el.btcPrice.value) || 0; var difficulty = parseFloat(el.difficulty.value) || 0; var blockReward = parseFloat(el.blockReward.value) || 3.125; // Guard against division by zero if (difficulty <= 0 || hashrateTH 0) { breakEvenRate = dailyRevUsd / dailyKwh; } // Cost per BTC mined var costPerBtc = 0; if (dailyBtc > 0) { costPerBtc = dailyCost / dailyBtc; } // ===== Solo mining stats ===== // Network hashrate estimate from difficulty // networkHashrate (H/s) = difficulty * 2^32 / 600 var networkHashrateH = (difficulty * 4294967296) / 600; var networkSharePercent = (hashrateH / networkHashrateH) * 100; // Average time to find a block (seconds) var avgBlockTimeSeconds = 0; if (hashrateH > 0) { avgBlockTimeSeconds = (difficulty * 4294967296) / hashrateH; } var blockRewardUsd = blockReward * btcPrice; // ===== Update DOM ===== // Revenue BTC res.revBtcDaily.textContent = formatBtc(dailyBtc); res.revBtcMonthly.textContent = formatBtc(monthlyBtc); res.revBtcYearly.textContent = formatBtc(yearlyBtc); // Revenue USD res.revUsdDaily.textContent = formatUsd(dailyRevUsd); res.revUsdMonthly.textContent = formatUsd(monthlyRevUsd); res.revUsdYearly.textContent = formatUsd(yearlyRevUsd); // Costs res.costDaily.textContent = ‘-‘ + formatUsd(dailyCost); res.costMonthly.textContent = ‘-‘ + formatUsd(monthlyCost); res.costYearly.textContent = ‘-‘ + formatUsd(yearlyCost); // Profits setProfitCell(res.profitDaily, dailyProfit); setProfitCell(res.profitMonthly, monthlyProfit); setProfitCell(res.profitYearly, yearlyProfit); // Key metrics res.breakEven.textContent = ‘$’ + breakEvenRate.toFixed(4); res.costPerBtc.textContent = formatUsd(costPerBtc); res.dailyKwh.textContent = dailyKwh.toFixed(2); // Profit/Loss indicator if (dailyProfit >= 0) { el.profitInd.textContent = ‘Profitable’; el.profitInd.className = ‘mc-profit-indicator mc-positive’; el.resultsCard.className = ‘mc-results-card mc-profit’; } else { el.profitInd.textContent = ‘Unprofitable’; el.profitInd.className = ‘mc-profit-indicator mc-negative’; el.resultsCard.className = ‘mc-results-card mc-loss’; } // Solo mining stats res.soloShare.textContent = formatNetworkShare(networkSharePercent); res.soloTime.textContent = formatTimeToBlock(avgBlockTimeSeconds); res.soloReward.textContent = formatUsd(blockRewardUsd); } function clearResults() { var dashes = ‘–‘; res.revBtcDaily.textContent = dashes; res.revBtcMonthly.textContent = dashes; res.revBtcYearly.textContent = dashes; res.revUsdDaily.textContent = dashes; res.revUsdMonthly.textContent = dashes; res.revUsdYearly.textContent = dashes; res.costDaily.textContent = dashes; res.costMonthly.textContent = dashes; res.costYearly.textContent = dashes; res.profitDaily.textContent = dashes; res.profitMonthly.textContent = dashes; res.profitYearly.textContent = dashes; res.breakEven.textContent = dashes; res.costPerBtc.textContent = dashes; res.dailyKwh.textContent = dashes; res.soloShare.textContent = dashes; res.soloTime.textContent = dashes; res.soloReward.textContent = dashes; } // ===== Formatting Helpers ===== function formatBtc(val) { if (val <= 0) return '0.00000000'; if (val < 0.00000001) return val.toExponential(2); if (val < 0.001) return val.toFixed(8); if (val = 1000000) { return ‘$’ + (val / 1000000).toFixed(2) + ‘M’; } if (val >= 100000) { return ‘$’ + Math.round(val).toLocaleString(‘en-US’); } if (val >= 1) { return ‘$’ + val.toFixed(2); } if (val >= 0.01) { return ‘$’ + val.toFixed(4); } return ‘$’ + val.toFixed(6); } function setProfitCell(cell, val) { var prefix = val >= 0 ? ‘+’ : ”; cell.textContent = prefix + formatUsd(val); cell.className = ‘mc-val-profit ‘ + (val >= 0 ? ‘mc-positive’ : ‘mc-negative’); } function formatNetworkShare(percent) { if (percent = 1) return percent.toFixed(2) + ‘%’; if (percent >= 0.001) return percent.toFixed(6) + ‘%’; if (percent >= 0.000001) return percent.toExponential(2) + ‘%’; return percent.toExponential(2) + ‘%’; } function formatTimeToBlock(seconds) { if (seconds = 1000000) { return (years / 1000000).toFixed(1) + ‘ million years’; } if (years >= 1000) { return Math.round(years).toLocaleString(‘en-US’) + ‘ years’; } if (years >= 1) { return years.toFixed(1) + ‘ years’; } if (days >= 1) { return days.toFixed(1) + ‘ days’; } if (hours >= 1) { return hours.toFixed(1) + ‘ hours’; } if (minutes >= 1) { return minutes.toFixed(1) + ‘ minutes’; } return Math.round(seconds) + ‘ seconds’; } // ===== Debounced Input Listeners ===== var calcTimer = null; function debouncedCalc() { if (calcTimer) clearTimeout(calcTimer); calcTimer = setTimeout(calculate, 80); } var inputs = [el.hashrate, el.power, el.electricity, el.poolFee, el.btcPrice, el.difficulty, el.blockReward]; for (var i = 0; i < inputs.length; i++) { inputs[i].addEventListener('input', debouncedCalc); inputs[i].addEventListener('change', debouncedCalc); } // If user edits hashrate or power, switch model to custom el.hashrate.addEventListener('input', function() { el.model.value = 'custom'; }); el.power.addEventListener('input', function() { el.model.value = 'custom'; }); // ===== Initialize ===== fetchBtcPrice(); fetchDifficulty(); calculate(); })();

How is Bitcoin mining profitability calculated?

Mining profitability is determined by comparing your mining revenue (how much BTC you earn based on your hashrate relative to the total network) against your electricity costs. The formula uses your hashrate, the current network difficulty, block reward (currently 3.125 BTC after the April 2024 halving), and the current Bitcoin price to estimate daily earnings. Then your electricity cost (power consumption in watts multiplied by hours and your rate per kWh) is subtracted to determine net…

What electricity rate do I need to be profitable?

The break-even electricity rate varies by hardware. Newer, more efficient miners like the Antminer S21 (17.5 J/TH) can be profitable at much higher electricity rates than older models like the S9 (96.4 J/TH). In Canada, Quebec hydropower offers some of the lowest rates in North America at around $0.06 CAD/kWh, making it ideal for mining. Use the “Break-Even Electricity” metric in our calculator above to see the maximum rate your specific setup can handle. Many home miners also offset costs…

Is solo mining with a Bitaxe actually profitable?

In terms of expected value from pool payouts, a single Bitaxe earns very small daily BTC amounts. However, solo mining is a different game entirely — it is a lottery. With a Bitaxe connected to a solo mining pool, you have a small but real chance of finding an entire block and earning the full 3.125 BTC reward (~$300,000+ at current prices). Many Bitaxe miners view it as a fun, educational hobby that supports network decentralization and heats a small space. It is not about ROI in the…

How does Bitcoin’s difficulty affect my mining revenue?

Network difficulty adjusts approximately every 2,016 blocks (roughly every 14 days) to maintain the target block time of 10 minutes. When more miners join the network (hashrate increases), difficulty goes up, reducing everyone’s revenue per TH/s. When miners leave, difficulty drops and revenue per TH/s increases. Historically, difficulty has trended upward as more powerful hardware enters the market. This calculator uses the current difficulty, but remember that future difficulty changes…

Should I factor in the cost of the miner itself?

Yes, for a complete financial picture you should consider your hardware purchase price. This calculator shows ongoing operational profitability (revenue minus electricity), which helps you understand your cash flow. To calculate your full ROI, take your monthly net profit from this calculator and divide your hardware cost by that amount to get your payback period in months. For example, if a Bitaxe Hex costs $400 and earns $15/month in net profit, your payback period would be approximately…