UNPKG

btc-rpc-explorer

Version:

Open-source, self-hosted Bitcoin explorer

572 lines (550 loc) 19.4 kB
"use strict"; const Decimal = require("decimal.js"); const Decimal8 = Decimal.clone({ precision:8, rounding:8 }); const btcFun = require("./btcFun.js"); const blockRewardEras = [ new Decimal8(50) ]; for (let i = 1; i < 34; i++) { let previous = blockRewardEras[i - 1]; blockRewardEras.push(new Decimal8(previous).dividedBy(2)); } const currencyUnits = [ { type:"native", name:"BTC", multiplier:1, default:true, values:["", "btc", "BTC"], decimalPlaces:8 }, { type:"native", name:"mBTC", multiplier:1000, values:["mbtc"], decimalPlaces:5 }, { type:"native", name:"bits", multiplier:1000000, values:["bits"], decimalPlaces:2 }, { type:"native", name:"sat", multiplier:100000000, values:["sat", "satoshi"], decimalPlaces:0 }, { type:"exchanged", name:"USD", multiplier:"usd", values:["usd"], decimalPlaces:2, symbol:"$" }, { type:"exchanged", name:"EUR", multiplier:"eur", values:["eur"], decimalPlaces:2, symbol:"€" }, ]; module.exports = { name:"Bitcoin", ticker:"BTC", logoUrlsByNetwork:{ "main":"./img/network-mainnet/logo.svg", "test":"./img/network-testnet/logo.svg", "regtest":"./img/network-regtest/logo.svg", "signet":"./img/network-signet/logo.svg" }, coinIconUrlsByNetwork:{ "main":"./img/network-mainnet/coin-icon.svg", "test":"./img/network-testnet/coin-icon.svg", "signet":"./img/network-signet/coin-icon.svg", "regtest":"./img/network-regtest/coin-icon.svg" }, coinColorsByNetwork: { "main": "#F7931A", "test": "#1daf00", "signet": "#af008c", "regtest": "#777" }, siteTitlesByNetwork: { "main":"Bitcoin Explorer", "test":"Testnet Explorer", "regtest":"Regtest Explorer", "signet":"Signet Explorer", }, demoSiteUrlsByNetwork: { "main": "https://bitcoinexplorer.org", "test": "https://testnet.bitcoinexplorer.org", "signet": "https://signet.bitcoinexplorer.org", }, knownTransactionsByNetwork: { main: "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16", test: "22e7e860660f368b5c653c272b0445a0625d19fdec02fc158ef9800a5c3a07e8", signet: "39332e10af6fe491e8ae4ba1e2dd674698fedf8aa3c8c42bf71572debc1bb5b9" }, miningPoolsConfigUrls:[ "https://raw.githubusercontent.com/btc21/Bitcoin-Known-Miners/master/miners.json", "https://raw.githubusercontent.com/bitcoin-data/mining-pools/generated/pools.json", "https://raw.githubusercontent.com/btccom/Blockchain-Known-Pools/master/pools.json", "https://raw.githubusercontent.com/blockchain/Blockchain-Known-Pools/master/pools.json" ], maxBlockWeight: 4000000, maxBlockSize: 1000000, minTxBytes: 166, // ref: https://en.bitcoin.it/wiki/Maximum_transaction_rate minTxWeight: 166 * 4, // hack difficultyAdjustmentBlockCount: 2016, maxSupplyByNetwork: { "main": new Decimal(20999817.31308491), // ref: https://bitcoin.stackexchange.com/a/38998 "test": new Decimal(21000000), "regtest": new Decimal(21000000), "signet": new Decimal(21000000) }, targetBlockTimeSeconds: 600, targetBlockTimeMinutes: 10, currencyUnits:currencyUnits, currencyUnitsByName:{"BTC":currencyUnits[0], "mBTC":currencyUnits[1], "bits":currencyUnits[2], "sat":currencyUnits[3]}, baseCurrencyUnit:currencyUnits[3], defaultCurrencyUnit:currencyUnits[0], feeSatoshiPerByteBucketMaxima: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 50, 75, 100, 150], halvingBlockIntervalsByNetwork: { "main": 210000, "test": 210000, "regtest": 150, "signet": 210000 }, terminalHalvingCountByNetwork: { "main": 32, "test": 32, "regtest": 32, "signet": 32 }, // used for supply estimates that don't need full gettxoutset accuracy coinSupplyCheckpointsByNetwork: { "main": [ 675046, new Decimal(18656332.38) ], "test": [ 1940614, new Decimal(20963051.112) ], "signet": [ 29472, new Decimal(1473600) ], "regtest": [ 0, new Decimal(0) ] }, utxoSetCheckpointsByNetwork: { // this includes values from running gettxoutsetinfo with both "muhash" and "hash_serialized_2" params "main": { // "muhash" "height": 784796, "bestblock": "000000000000000000026ac332dc8ba0d425b844520acc808af88aac52748281", "txouts": 87769791, "bogosize": 6562752541, "muhash": "90dc87ec3d3dc46a9883f1ce675cc8bcc3e6697c6c1dbb8665c192af35144099", "total_amount": "19342261.957857", "total_unspendable_amount": "219.292143", // "hash_serialized_2" "transactions": 52250541, "disk_size": 5367051020, "hash_serialized_2": "89afe21688f3a2cc01ef837c2b0454d4039830433d49c264856b2578eff2d62b", "lastUpdated": 1681140656788 } }, genesisBlockHashesByNetwork:{ "main": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "test": "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943", "regtest": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206", "signet": "00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6", }, genesisCoinbaseTransactionIdsByNetwork: { "main": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "test": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "regtest": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "signet": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b" }, genesisCoinbaseTransactionsByNetwork:{ "main": { "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d02fd04ffffffff0100f2052a01000000434104f5eeb2b10c944c6b9fbcfff94c35bdeecd93df977882babc7f3a2cf7f5c81d3b09a68db7f0e04f21de5d4230e75e6dbe7ad16eefe0d4325a62067dc6f369446aac00000000", "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "size": 204, "vsize": 204, "version": 1, "confirmations":475000, "vin": [ { "coinbase": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73", "sequence": 4294967295 } ], "vout": [ { "value": 50, "n": 0, "scriptPubKey": { "asm": "04f5eeb2b10c944c6b9fbcfff94c35bdeecd93df977882babc7f3a2cf7f5c81d3b09a68db7f0e04f21de5d4230e75e6dbe7ad16eefe0d4325a62067dc6f369446a OP_CHECKSIG", "hex": "4104f5eeb2b10c944c6b9fbcfff94c35bdeecd93df977882babc7f3a2cf7f5c81d3b09a68db7f0e04f21de5d4230e75e6dbe7ad16eefe0d4325a62067dc6f369446aac", "reqSigs": 1, "type": "pubkey", "addresses": [ "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" ] } } ], "blockhash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "time": 1230988505, "blocktime": 1230988505 }, "test": { "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000", "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "version": 1, "size": 204, "vsize": 204, "weight": 816, "locktime": 0, "vin": [ { "coinbase": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73", "sequence": 4294967295 } ], "vout": [ { "value": 50.00000000, "n": 0, "scriptPubKey": { "asm": "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG", "hex": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac", "reqSigs": 1, "type": "pubkey", "addresses": [ "mpXwg4jMtRhuSpVq4xS3HFHmCmWp9NyGKt" ] } } ], "blockhash": "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943", "time": 1296688602, "blocktime": 1296688602 }, "regtest": { "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000", "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "version": 1, "size": 204, "vsize": 204, "weight": 816, "locktime": 0, "vin": [ { "coinbase": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73", "sequence": 4294967295 } ], "vout": [ { "value": 50.00000000, "n": 0, "scriptPubKey": { "asm": "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG", "hex": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac", "type": "pubkey" } } ], "blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206", "time": 1296688602, "blocktime": 1296688602 }, "signet": { "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000", "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "version": 1, "size": 204, "vsize": 204, "weight": 816, "locktime": 0, "vin": [ { "coinbase": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73", "sequence": 4294967295 } ], "vout": [ { "value": 50.00000000, "n": 0, "scriptPubKey": { "asm": "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG", "hex": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac", "type": "pubkey" } } ], "blockhash": "00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6", "time": 1598918400, "blocktime": 1598918400 } }, genesisBlockStatsByNetwork:{ "main": { "avgfee": 0, "avgfeerate": 0, "avgtxsize": 0, "blockhash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "feerate_percentiles": [ 0, 0, 0, 0, 0 ], "height": 0, "ins": 0, "maxfee": 0, "maxfeerate": 0, "maxtxsize": 0, "medianfee": 0, "mediantime": 1231006505, "mediantxsize": 0, "minfee": 0, "minfeerate": 0, "mintxsize": 0, "outs": 1, "subsidy": 5000000000, "swtotal_size": 0, "swtotal_weight": 0, "swtxs": 0, "time": 1231006505, "total_out": 0, "total_size": 0, "total_weight": 0, "totalfee": 0, "txs": 1, "utxo_increase": 1, "utxo_size_inc": 117 }, "test": { "avgfee": 0, "avgfeerate": 0, "avgtxsize": 0, "blockhash": "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943", "feerate_percentiles": [ 0, 0, 0, 0, 0 ], "height": 0, "ins": 0, "maxfee": 0, "maxfeerate": 0, "maxtxsize": 0, "medianfee": 0, "mediantime": 1296688602, "mediantxsize": 0, "minfee": 0, "minfeerate": 0, "mintxsize": 0, "outs": 1, "subsidy": 5000000000, "swtotal_size": 0, "swtotal_weight": 0, "swtxs": 0, "time": 1296688602, "total_out": 0, "total_size": 0, "total_weight": 0, "totalfee": 0, "txs": 1, "utxo_increase": 1, "utxo_size_inc": 117 }, "regtest": { "avgfee": 0, "avgfeerate": 0, "avgtxsize": 0, "blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206", "feerate_percentiles": [ 0, 0, 0, 0, 0 ], "height": 0, "ins": 0, "maxfee": 0, "maxfeerate": 0, "maxtxsize": 0, "medianfee": 0, "mediantime": 1296688602, "mediantxsize": 0, "minfee": 0, "minfeerate": 0, "mintxsize": 0, "outs": 1, "subsidy": 5000000000, "swtotal_size": 0, "swtotal_weight": 0, "swtxs": 0, "time": 1296688602, "total_out": 0, "total_size": 0, "total_weight": 0, "totalfee": 0, "txs": 1, "utxo_increase": 1, "utxo_size_inc": 117 }, "signet": { "avgfee": 0, "avgfeerate": 0, "avgtxsize": 0, "blockhash": "00000008819873e925422c1ff0f99f7cc9bbb232af63a077a480a3633bee1ef6", "feerate_percentiles": [ 0, 0, 0, 0, 0 ], "height": 0, "ins": 0, "maxfee": 0, "maxfeerate": 0, "maxtxsize": 0, "medianfee": 0, "mediantime": 1598918400, "mediantxsize": 0, "minfee": 0, "minfeerate": 0, "mintxsize": 0, "outs": 1, "subsidy": 5000000000, "swtotal_size": 0, "swtotal_weight": 0, "swtxs": 0, "time": 1598918400, "total_out": 0, "total_size": 0, "total_weight": 0, "totalfee": 0, "txs": 1, "utxo_increase": 1, "utxo_size_inc": 117 } }, testData: { txDisplayTestList: { "634b57cf0673c50b98560dbdf48d0a8633303b5d9162175e08b304df159c259e" : { blockHeight: 694670, blockHash: "0000000000000000000ba61d43854a2460b219b5281db2c731ae03a4347eaf43" }, "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16" : { blockHeight: 170, blockHash: "00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee" }, "a1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d" : { blockHeight: 57043, blockHash: "00000000152340ca42227603908689183edc47355204e7aca59383b0aaac1fd8" }, "7b6e490670a5cfcc9b66d8aab142ac2e9b489ae7f40cadadfc69c19878ae81b0" : { blockHeight: 227835, blockHash: "00000000000001aa077d7aa84c532a4d69bdbff519609d1da0835261b7a74eb6" }, "8f7f13d6b56ea9013f13d298bc0e9e9f4f9825f3e7fd96083a564b10b01025d9" : { blockHeight: 694521, blockHash: "00000000000000000009974b5f6011d7ec8af460dafcc668c7ede4324896b9ca" }, "3215f4a32a26938ddf9eeb4de7f5f42e751410876500f6e93d943abb2c3cccc4" : { blockHeight: 694521, blockHash: "00000000000000000009974b5f6011d7ec8af460dafcc668c7ede4324896b9ca" }, "333d5f27c6fc2d07ef8c19e17d33568706bc3d6875198aba6cff0a996698d46e" : { blockHeight: 694521, blockHash: "00000000000000000009974b5f6011d7ec8af460dafcc668c7ede4324896b9ca" }, "a9ceb47b092f703c30b29cb8b864fb8fa895a5999b24aa56ae08a967b643087c" : { blockHeight: 694521, blockHash: "00000000000000000009974b5f6011d7ec8af460dafcc668c7ede4324896b9ca" }, "bc968c93c6ff39f022f974504a22d548902fe5a8c4fb294f052f845e4c388fcb" : { blockHeight: 694521, blockHash: "00000000000000000009974b5f6011d7ec8af460dafcc668c7ede4324896b9ca" }, "e4bd7949cbf067d17629a5f588bba051b4436d29b5978d674118539356745bd0" : { blockHeight: 227835, blockHash: "00000000000001aa077d7aa84c532a4d69bdbff519609d1da0835261b7a74eb6" }, "54e48e5f5c656b26c3bca14a8c95aa583d07ebe84dde3b7dd4a78f4e4186e713" : { blockHeight: 230009, blockHash: "00000000000000ecbbff6bafb7efa2f7df05b227d5c73dca8f2635af32a2e949" }, "d29c9c0e8e4d2a9790922af73f0b8d51f0bd4bb19940d9cf910ead8fbe85bc9b" : { blockHeight: 268060, blockHash: "000000000000000743aee48cf264e1aa4a05fc3018677be3c1bdbd2429ffeede" }, "143a3d7e7599557f9d63e7f224f34d33e9251b2c23c38f95631b3a54de53f024" : { blockHeight: 306204, blockHash: "000000000000000038dea6f503ed3593b1495e135d9ed646c2ebb97a1ff35bd7" }, "8f907925d2ebe48765103e6845c06f1f2bb77c6adc1cc002865865eb5cfd5c1c" : { blockHeight: 481824, blockHash: "0000000000000000001c8018d9cb3b742ef25114f27563e3fc4a1902167f9893" }, "8f5834d39a634c1b4c6283b546e16e931cb34d28570c77860de1a86256c4344d" : { blockHeight: 629999, blockHash: "0000000000000000000d656be18bb095db1b23bd797266b0ac3ba720b1962b1e" }, "7836d12e741ffc6e50dba9b461e117cfbe444e7daa73df648b3a441d5a9ee958" : { blockHeight: 230009, blockHash: "00000000000000ecbbff6bafb7efa2f7df05b227d5c73dca8f2635af32a2e949" }, "29a3efd3ef04f9153d47a990bd7b048a4b2d213daaa5fb8ed670fb85f13bdbcf" : { blockHeight: 153509, blockHash: "00000000000000fb62bbadc0a9dcda556925b2d0c1ad8634253ac2e83ab8382f" }, "fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33" : { blockHeight: 1000, blockHash: "00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09" }, "b10c007c60e14f9d087e0291d4d0c7869697c6681d979c6639dbd960792b4d41" : { blockHeight: 692261, blockHash: "0000000000000000000f14c35b2d841e986ab5441de8c585d5ffe55ea1e395ad" }, "777c998695de4b7ecec54c058c73b2cab71184cf1655840935cd9388923dc288" : { blockHeight: 709632, blockHash: "0000000000000000000687bca986194dc2c1f949318629b44bb54ec0a94d8244" }, "b53e3bc5edbb41b34a963ecf67eb045266cf841cab73a780940ce6845377f141" : { blockHeight: 608548, blockHash: "00000000000000000009cf4a72b39c634586e6e328365f0d7293964111148094" } } }, genesisCoinbaseOutputAddressScripthash:"8b01df4e368ea28f8dc0423bcf7a4923e3a12d307c875e47a0cfbf90b5c39161", historicalData: btcFun.items, exchangeRateData:{ jsonUrl:"https://api.coindesk.com/v1/bpi/currentprice.json", responseBodySelectorFunction:function(responseBody) { //console.log("Exchange Rate Response: " + JSON.stringify(responseBody)); var exchangedCurrencies = ["USD", "GBP", "EUR"]; if (responseBody.bpi) { var exchangeRates = {}; for (var i = 0; i < exchangedCurrencies.length; i++) { if (responseBody.bpi[exchangedCurrencies[i]]) { exchangeRates[exchangedCurrencies[i].toLowerCase()] = responseBody.bpi[exchangedCurrencies[i]].rate_float; } } return exchangeRates; } return null; } }, goldExchangeRateData:{ jsonUrl:"https://forex-data-feed.swissquote.com/public-quotes/bboquotes/instrument/XAU/USD", responseBodySelectorFunction:function(responseBody) { //console.log("Exchange Rate Response: " + JSON.stringify(responseBody)); if (responseBody[0].topo && responseBody[0].topo.platform == "MT5") { var prices = responseBody[0].spreadProfilePrices[0]; return { usd: prices.ask }; } return null; } }, blockRewardFunction:function(blockHeight, chain) { let halvingBlockInterval = (chain == "regtest" ? 150 : 210000); let index = Math.floor(blockHeight / halvingBlockInterval); return blockRewardEras[index]; } };