-An optional "Extracted By" column can now be added to the homepage tx data, the block page, tx page and/or in the /ext/getlasttxs api
-Added 4 new settings to allow displaying the "Extracted By" data on the homepage, block page, transaction page and/or in the /ext/getlasttxs api
-Fixed an issue with the get_txs function where it wasn't properly searching by txid
-The rl_labels.pug file has been updated to consolidate similar code without being duplicated
-Updated the README with new verbiage for the extracted by data
-A number of functions have been rewritten to be more optimized and faster: calculate_total, is_unique, convert_to_satoshi, get_input_addresses, processVoutAddresses, prepare_vout, prepare_vin
-Txes are now written to database via bulk writes which helps improve the sync speed and also controls memory usage with batching to write data once a certain threshold is reached
-update_address function changed to update_addresses since it now bulk writes the addresses in batches to improve sync speed and also controls memory usage with batching to write data once a certain threshold is reached
-The syncLoop function has been completely removed from the project and replaced with async library loops or even normal "for" loops in some cases which greatly improves sync speeds over large batches of data
-Fixed an issue with the flattened count of txes that is saved to the coinstats collection which could save incorrectly when using more than 1 thread
-Fixed an issue with the block sync which caused an unwanted delay when syncing less blocks than the amount of threads used to sync the data
-Fixed an issue with vout data processing that could sometimes populate data out of order
-Added a new sync.batch_size setting used to determine how many records (txes, addresses, addresstxes) should be saved in a single database transaction
-Added a new wait_for_bulk_database_save setting used to increase the block sync speed at the cost of not returning any error msgs for data that failed to save
-get_input_addresses function no longer returns in the exports section of the explorer.js file since it is only referenced in that file
-Updated explorerspec tests to use the newest function changes for any tests that needed to be updated
Special thanks to Karzo from Pepecoin for help with the bulkwrite code changes!
-Plugins can now be enabled via settings.json after dropping the plugin files into the new plugins directory
-Enabling plugins will allow extending the normal functionality of the explorer with new database collections, menus, pages and apis + open up a new url for data to be sent from the plugin to the explorer
-A new plugins section was added to the settings with a definition for the generic-snapshots plugin
-Locale strings are now loaded and shared out via the settings so there is generally no more need to explicitly include the locale.js file
-The locale object has been updated to localization within the explorer
-A number of new locale strings have been added and their values replaced with the locale string within the explorer
-Added plugin support verbiage and a link to the generic-snapshots crowdfunding task to the README
-The index.js code has been reduced from 895 to 701 lines of code which also cuts down the file size from 39KB to 26KB in size while still retaining the same functionality as before
-Created a new claimaddress collection to hold claim address data to make it easier to work with and preserve that data if necessary in the future without being cluttered into the address collection
-The database init function has been updated to move claim address data to the new collection and remove the data from the address collection. This process will update existing explorer databases automatically and is smart enough to only run this process one time to prevent from slowing down startup of the explorer on each run
-The claim name field has been changed from "name" to "claim_name" wherever possible to be easier to find in the future. Searching for the keyword "name" brings back way too many matches and makes it difficult to find all the correct code snippets for future changes
-Added a newer_claim_address field to the stats collection to determine if the claim address data needs to be moved to the new collection or not
-All previous claim address code has been updated to pull from the new table and/or join to the address table if/when necessary
-The block sync will now remove orphaned block data from the txes collecton, address balances/sent/received data as well as addresstx data and now stores limited info in a new orphans collection
-Added a new optional page for viewing orphaned block data
-The coinbase address now updates sent totals from POS rewards and other transactions that have vout but no vin addresses
-Block and transaction pages now display a warning when viewing an orphaned block or tx
-Added a couple new fields to the coinstats collection for tracking orphaned blocks
-Added new locale strings for the orphaned block feature
-This exchange has 2 separate sites using the same api, so new functionality was added to the explorer to handle alt markets like this
-market files now allow for new field names: "market_name_alt" was added for the alternate market name, "market_logo_alt" was added for displaying an alternate logo, a "market_url" function was added that will return a url string to replace the {url_prefix} code in the market_url_template and an "isAlt" function was added to determine if the alt name/logo should be used
-A new freiexchange entry was added to the markets_page.exchanges setting
-Updated the README with the updated market info
-The custom.scss file can be used to add custom css changes without affecting the ability to do a git pull update
-Added a quick explanation of using the custom.scss file in the "Configure Explorer Settings" section of the README
-Added new setting 'show_exchange_url' which hides/shows the exchange link
-Updated all exchanges with a trade url template which can be used to automatically determine the correct url for each trading pair
-All pages (including the reward and error pages) were updated to include options for displaying a configurable page header with title, image, description and in some cases a last updated date
-The error page was restructured slightly to display a different description based on the type of error (page not found error vs problem loading page error)
-Added new setting options to the `shared_pages` setting for `page_title_image` which allows changing the page title image displayed on applicable pages and also determines whether it uses a flip/spin animation or not
-Added a collection of new `page_header` settings to all pages that control displaying the new page title + image + description and also moved the last updated date from applicable pages into this section as well
-Existing `show_last_updated` settings that were moved a level deeper into the `page_header` have been automatically mapped to the new setting location upon statup to help older installs to work better out-of-the-box
-Added new css rules to the styles.scss file to support the new page header/title options
-Added a number of new locale strings for page titles and descriptions, and moved a few locale strings around to different names internally that were already using the same naming scheme for different elements (such as api_title being moved to api_documentation for example)
-Started adding new locale strings with replacement text such as {1} and {2} that get automatically replaced with proper values when loaded to allow for locale strings that support dynamic text
-Fixed an issue with too much empty space in the page header (especially in mobile and tablet modes) when `show_panels` was set to false on any page
-Added a new `shared_pages.page_header.search.position` setting that determines where the search bar is located (valid options include the old 'below-header' and the new 'inside-header' options)
-`shared_pages.page_header.show_search` setting has been re-mapped to `shared_pages.page_header.search.enabled`
-Updated the search placeholder locale text
-Changed the Explorer menu item icon from a magnifying glass to a cubes/blocks icon
-Updated css rules to fix some small glitches and allow the new 'inside-header' search option to function
-Add new address_page.enable_hidden_address_view setting which controls whether the special hidden_address address page can be viewed
-Add new address_page.enable_unknown_address_view setting which controls whether the special unknown_address address page can be viewed
-route to special coinbase address is permanently disabled
-Adds a tx_type field to the tx model which is typically null for "normal" transaction types, but can also display 'p2pk' for bitcoin txes which require addtional encoding to reveal the P2PKH address as well as 'zksnarks' for transactions with hidden sender or receiver data
-Additional fixes for how data is displayed when a valid wallet address cannot be found
-Includes some small updates to how zksnarks transactions display hidden sender/receiver data
-Replace tabs with double-spaces
-Betting spacing and lining up of code functions
-Add missing semi-colons
-Remove extra characters and spaces where applicable
-Remove commented-out code fragments
-Add missing 2021 date to LICENSE
-Small touchups and other misc nitpickings
-Restructured the settings.json.template and settings.js files with better groupings
-Added better comments for improved explanations of all settings
-Better handling of page length options on all datatables; Page length options are now configurable and also only display options based on limits set by certain items_per_page and max_items_per_query settings
-Markets have been extended to support unlimited trading pairs for each exchange
-Added coin_symbol and pair_symbol to the markets schema to support multiple trading pairs
-Added a burned field to the richlist schema for tracking burned coin addresses
-Added a locale string for the new richlist wealth distribution "Top 1-100 Total" table row
-Updated a couple locale strings that were incomplete or needed fixing (api_getblockhash and api_getnextrewardwhenstr)
-Added a new css class to remove some redundant inline styles for the richlist wealth distribution color boxes
-Richlist page now allows better separation of the top list(s) and the wealth distribution table and chart (you can now hide or show sections as desired)
-Richlist page now allows for better burned coin support (Hide burned coin addresses from lists and totals even when the burned coin amounts are still included in the total coin supply value)
-Block page now only displays the raw block link if the api_page.public_apis.rpc.getblock.enabled settings is set to true
-Transaction page now only displays the raw tx link if the api_page.public_apis.rpc.getrawtransaction.enabled setting is set to true
-Rate limiting class has been made global and is now used to limit market requests
-getnetworkhashps rpc call now returns a '-' if shared_pages.show_hashrate is not set to true
-Searching for unsycned blocks/txs no longer saves the data locally but instead still shows the data on screen. This helps prevent syncing data out-of-order (This eliminates the need for db_index.pid which has been removed)
-Coin supply is now always taken from the stats collection database instead of from the wallet via rpc command in all cases except when syncing
-Lots of misc fixes and code cleanup changes
-List of changed settings:
-title -> shared_pages.page_title
-coin -> coin.name
-symbol -> coin.symbol
-logo -> shared_pages.logo
-headerlogo -> shared_pages.page_header.home_link_logo
-favicon -> shared_pages.favicon
-homelink -> shared_pages.page_header.home_link
-logoheight -> shared_pages.page_header.home_link_logo_height
-sticky_header -> shared_pages.page_header.sticky_header
-sticky_footer -> shared_pages.page_footer.sticky_footer
-footer_height_desktop -> shared_pages.page_footer.footer_height_desktop
-footer_height_tablet -> shared_pages.page_footer.footer_height_tablet
-footer_height_mobile -> shared_pages.page_footer.footer_height_mobile
-social_link_percent_height_desktop -> shared_pages.page_footer.social_link_percent_height_desktop
-social_link_percent_height_tablet -> shared_pages.page_footer.social_link_percent_height_tablet
-social_link_percent_height_mobile -> shared_pages.page_footer.social_link_percent_height_mobile
-theme -> shared_pages.theme
-port -> webserver.port
-update_timeout -> sync.update_timeout
-check_timeout -> sync.check_timeout
-block_parallel_tasks -> sync.block_parallel_tasks
-use_rpc -> api_cmds.use_rpc
-confirmations -> shared_pages.confirmations
-display.api -> api_page.enabled
-display.markets -> markets_page.enabled
-display.richlist -> richlist_page.enabled
-display.search -> shared_pages.page_header.show_search
-display.movement -> movement_page.enabled
-display.network -> network_page.enabled
-display.masternodes -> masternodes_page.enabled
-display.claim_address -> claim_address_page.enabled
-display.claim_address_header_menu -> claim_address_page.show_header_menu
-display.page_header_bgcolor -> shared_pages.page_header.bgcolor
-display.page_footer_bgcolor -> shared_pages.page_footer.bgcolor
-display.table_header_bgcolor -> shared_pages.table_header_bgcolor
-display.networkpnl -> shared_pages.page_header.panels.network_panel.display_order
-display.difficultypnl -> shared_pages.page_header.panels.difficulty_panel.display_order
-display.masternodespnl -> shared_pages.page_header.panels.masternodes_panel.display_order
-display.coinsupplypnl -> shared_pages.page_header.panels.coin_supply_panel.display_order
-display.pricepnl -> shared_pages.page_header.panels.price_panel.display_order
-display.marketcappnl -> shared_pages.page_header.panels.market_cap_panel.display_order
-display.logopnl -> shared_pages.page_header.panels.logo_panel.display_order
-index.show_last_updated -> index_page.show_last_updated
-index.show_hashrate -> shared_pages.show_hashrate
-index.difficulty -> shared_pages.difficulty
-index.last_txs -> api_page.public_apis.ext.getlasttxs.max_items_per_query
-index.txs_per_page -> index_page.transaction_table.items_per_page (for index page) AND movement_page.movement_table.items_per_page (for movement page)
-reward_page.show_last_updated -> blockchain_specific.heavycoin.reward_page.show_last_updated
-api.blockindex -> api_page.sample_data.blockindex
-api.blockhash -> api_page.sample_data.blockhash
-api.txhash -> api_page.sample_data.txhash
-api.address -> api_page.sample_data.address
-markets.exchange -> markets_page.default_exchange.trading_pair
-markets.default -> markets_page.default_exchange.exchange_name
-markets.market_dropdown_menu -> markets_page.show_market_dropdown_menu
-markets.market_select_visible -> markets_page.show_market_select
-richlist.distribution -> richlist_page.wealth_distribution.show_distribution_chart
-richlist.received -> richlist_page.show_received_coins
-richlist.balance -> richlist_page.show_current_balance
-movement.min_amount -> movement_page.movement_table.min_amount
-movement.low_flag -> movement_page.movement_table.low_warning_flag
-movement.high_flag -> movement_page.movement_table.high_warning_flag
-social_links -> shared_pages.page_footer.social_links
-social_links[x].image_url -> shared_pages.page_footer.social_links[x].image_path
-genesis_tx -> transaction_page.genesis_tx
-genesis_block -> block_page.genesis_block
-heavy -> blockchain_specific.heavycoin.enabled
-save_stats_after_sync_blocks -> sync.save_stats_after_sync_blocks
-txcount -> api_page.public_apis.ext.getaddresstxs.max_items_per_query
-txcount_per_page -> address_page.history_table.items_per_page
-show_sent_received -> address_page.show_sent_received
-supply -> sync.supply
-nethash -> shared_pages.page_header.panels.network_panel.nethash
-nethash_units -> shared_pages.page_header.panels.network_panel.nethash_units
-usecors -> webserver.cors.enabled
-corsorigin -> webserver.cors.corsorigin
-burned_coins -> richlist_page.burned_coins.addresses
-public_api.rpc.getdifficulty -> api_page.public_apis.rpc.getdifficulty.enabled
-public_api.rpc.getconnectioncount -> api_page.public_apis.rpc.getconnectioncount.enabled
-public_api.rpc.getblockcount -> api_page.public_apis.rpc.getblockcount.enabled
-public_api.rpc.getblockhash -> api_page.public_apis.rpc.getblockhash.enabled
-public_api.rpc.getblock -> api_page.public_apis.rpc.getblock.enabled
-public_api.rpc.getrawtransaction -> api_page.public_apis.rpc.getrawtransaction.enabled
-public_api.rpc.getnetworkhashps -> api_page.public_apis.rpc.getnetworkhashps.enabled
-public_api.rpc.getvotelist -> api_page.public_apis.rpc.getvotelist.enabled
-public_api.rpc.getmasternodecount -> api_page.public_apis.rpc.getmasternodecount.enabled
-public_api.rpc.getmaxmoney -> blockchain_specific.heavycoin.public_apis.getmaxmoney.enabled
-public_api.rpc.getmaxvote -> blockchain_specific.heavycoin.public_apis.getmaxvote.enabled
-public_api.rpc.getvote -> blockchain_specific.heavycoin.public_apis.getvote.enabled
-public_api.rpc.getphase -> blockchain_specific.heavycoin.public_apis.getphase.enabled
-public_api.rpc.getreward -> blockchain_specific.heavycoin.public_apis.getreward.enabled
-public_api.rpc.getsupply -> blockchain_specific.heavycoin.public_apis.getsupply.enabled
-public_api.rpc.getnextrewardestimate -> blockchain_specific.heavycoin.public_apis.getnextrewardestimate.enabled
-public_api.rpc.getnextrewardwhenstr -> blockchain_specific.heavycoin.public_apis.getnextrewardwhenstr.enabled
-public_api.ext.getmoneysupply -> api_page.public_apis.ext.getmoneysupply.enabled
-public_api.ext.getdistribution -> api_page.public_apis.ext.getdistribution.enabled
-public_api.ext.getaddress -> api_page.public_apis.ext.getaddress.enabled
-public_api.ext.getaddresstxs -> api_page.public_apis.ext.getaddresstxs.enabled
-public_api.ext.gettx -> api_page.public_apis.ext.gettx.enabled
-public_api.ext.getbalance -> api_page.public_apis.ext.getbalance.enabled
-public_api.ext.getlasttxs -> api_page.public_apis.ext.getlasttxs.enabled
-public_api.ext.getcurrentprice -> api_page.public_apis.ext.getcurrentprice.enabled
-public_api.ext.getbasicstats -> api_page.public_apis.ext.getbasicstats.enabled
-public_api.ext.getsummary -> api_page.public_apis.ext.getsummary.enabled
-public_api.ext.getnetworkpeers -> api_page.public_apis.ext.getnetworkpeers.enabled
-public_api.ext.getmasternodelist -> api_page.public_apis.ext.getmasternodelist.enabled
-public_api.ext.getmasternoderewards -> api_page.public_apis.ext.getmasternoderewards.enabled
-public_api.ext.getmasternoderewardstotal -> api_page.public_apis.ext.getmasternoderewardstotal.enabled
-api_cmds.heavies.getmaxmoney -> blockchain_specific.heavycoin.api_cmds.getmaxmoney
-api_cmds.heavies.getmaxvote -> blockchain_specific.heavycoin.api_cmds.getmaxvote
-api_cmds.heavies.getvote -> blockchain_specific.heavycoin.api_cmds.getvote
-api_cmds.heavies.getphase -> blockchain_specific.heavycoin.api_cmds.getphase
-api_cmds.heavies.getreward -> blockchain_specific.heavycoin.api_cmds.getreward
-api_cmds.heavies.getnextrewardestimate -> blockchain_specific.heavycoin.api_cmds.getnextrewardestimate
-api_cmds.heavies.getnextrewardwhenstr -> blockchain_specific.heavycoin.api_cmds.getnextrewardwhenstr
-api_cmds.heavies.getsupply -> blockchain_specific.heavycoin.api_cmds.getsupply
-List of new settings:
-shared_pages.page_header.panels.network_panel.enabled: allow enabling/disabling of the network panel
-shared_pages.page_header.panels.difficulty_panel.enabled: allow enabling/disabling of the difficulty panel
-shared_pages.page_header.panels.masternodes_panel.enabled: allow enabling/disabling of the masternodes panel
-shared_pages.page_header.panels.coin_supply_panel.enabled: allow enabling/disabling of the coin supply panel
-shared_pages.page_header.panels.price_panel.enabled: allow enabling/disabling of the price panel
-shared_pages.page_header.panels.market_cap_panel.enabled: allow enabling/disabling of the market cap panel
-shared_pages.page_header.panels.logo_panel.enabled: allow enabling/disabling of the logo panel
-index_page.transaction_table.page_length_options: specify the page length options that determine how many items/records to display in the table at any given time
-index_page.transaction_table.reload_table_seconds: the time in seconds to automatically reload the table data from the server
-address_page.history_table.page_length_options: specify the page length options that determine how many items/records to display in the table at any given time
-masternodes_page.masternode_table.page_length_options: specify the page length options that determine how many items/records to display in the table at any given time
-masternodes_page.masternode_table.items_per_page: the default amount of items/records to display in the table at any given time
-movement_page.movement_table.page_length_options: specify the page length options that determine how many items/records to display in the table at any given time
-movement_page.movement_table.reload_table_seconds: the time in seconds to automatically reload the table data from the server
-network_page.connections_table.page_length_options: specify the page length options that determine how many items/records to display in the table at any given time
-network_page.connections_table.items_per_page: the default amount of items/records to display in the table at any given time
-network_page.addnodes_table.page_length_options: specify the page length options that determine how many items/records to display in the table at any given time
-network_page.addnodes_table.items_per_page: the default amount of items/records to display in the table at any given time
-network_page.onetry_table.page_length_options: specify the page length options that determine how many items/records to display in the table at any given time
-network_page.onetry_table.items_per_page: the default amount of items/records to display in the table at any given time
-richlist_page.wealth_distribution.show_distribution_table: show/hide the wealth distribution summary table
-richlist_page.wealth_distribution.colors: a list of html color codes to represent the top 100 groupings in the wealth distribution table and pie chart
-richlist_page.burned_coins.include_burned_coins_in_distribution: determine whether to include burned coins in the wealth distribution section or not
-markets_page.exchanges.altmarkets.enabled: enable/disable the altmarkets exchange
-markets_page.exchanges.altmarkets.trading_pairs: a list of market trading pair symbols
-markets_page.exchanges.bittrex.enabled: enable/disable the bittrex exchange
-markets_page.exchanges.bittrex.trading_pairs: a list of market trading pair symbols
-markets_page.exchanges.bleutrade.enabled: enable/disable the bleutrade exchange
-markets_page.exchanges.bleutrade.trading_pairs: a list of market trading pair symbols
-markets_page.exchanges.crex.enabled: enable/disable the crex exchange
-markets_page.exchanges.crex.trading_pairs: a list of market trading pair symbols
-markets_page.exchanges.poloniex.enabled: enable/disable the poloniex exchange
-markets_page.exchanges.poloniex.trading_pairs: a list of market trading pair symbols
-markets_page.exchanges.stex.enabled: enable/disable the stex exchange
-markets_page.exchanges.stex.trading_pairs: a list of market trading pair symbols
-markets_page.exchanges.yobit.enabled: enable/disable the yobit exchange
-markets_page.exchanges.yobit.trading_pairs: a list of market trading pair symbols
-claim_address_page.enable_bad_word_filter: enable/disable the "bad word" filter for claimed addresses, so that trying to claim an address with a bad word will fail
-sync.show_sync_msg_when_syncing_more_than_blocks: show the sync msg at the top of all pages during index syncronization if there are more than this many blocks to process
-labels[x].enabled: allow enabling/disabling of specific wallet address labels
-blockchain_specific.heavycoin.reward_page.enabled: enable/disable the reward page
-blockchain_specific.zksnarks.enabled: enable/disable Zcash zk-SNARKs private transaction support (WIP - 90% complete)
-List of deleted settings
-address: unnecessary setting has been replaced by dynamic values via http request
-markets.coin: replaced by a richer set of settings that allow choosing the coin for each market
-markets.enabled -> replaced by a richer set of settings that allow enabling/disabling each market specifically
-lock_during_index: no longer possible to save unsynced blocks/txs via search so this settings is now obsolete/unused
-Moved /ext/summary from routes/index.js to app.js with the rest of the extended apis and renamed to /etc/getsummary
-Added a new setting to enable/disable public use of /ext/getsummary + added it to list of public apis on the /info page
-Added a new setting to enable/disable public use of /ext/getaddresstxs + added it to list of public apis on the /info page + updated the return data so that it returns a named object array for public api for better readability and still returns the same array list for internal datatable use
-Updated /ext/getlasttxs so that it returns a named object array for public api for better readability and still returns the same array list for internal datatable use
-/ext/getsummary now only returns the online and offline masternode counts if the getmasternodecount api is available and enabled
-Added new configurable settings to allow displaying a "last updated date" timestamp for: index, reward, masternode, movement, network, richlist and market pages
-Affected pages are now configured to be completely hidden and disabled when their display settings are set to false
-Added a new "Masternodes" page which displays the current list of masternodes on the network
-/api/getmasternodelist is no longer publicly accessible and has been replaced by /ext/getmasternodelist which returns the masternode list from local collection instead of directly from wallet
-Added new masternode sync options to sync.js and sync.sh
-Added new masternodes_last_updated field to the Stats collection
-Updated delete_database.sh and restore_backup.sh to include support for the new masternodes collection
-Network header menu icon changed to allow the new Masternodes menu item to use the old network icon
-Lots of changes to the claim address page: now supports the ability to enter a wallet address instead of always being read-only; no longer displays address information summary; updated alert text and display with better icons; initial info alert denotes current claim status when viewing an existing address; you can now show/hide claim instructions which are defaulted to hidden; Submit button changed to Claim button; Updated page text and verbiage
-Added new setting, "claim_address_header_menu" which shows/hides a new "Claim Address" header menu item
-Claim url changed from /address/{hash}/claim to /claim and /claim/{hash}
-Added additional error handling for successfully verifying a wallet address that is now known to the explorer
-Added a new locale string for the "Claim Address" header menu
-Claimed addresses now replace actual wallet addresses across all pages of the site
-Add new claim_address setting to enable/disable claiming of addresses
-Add ability to un-claim an address by signing a blank message
Reason: db.get_stats() function was originally thought to be returning the wrong supply value after changing the 'supply' value in settings.json. While it was true at first glance, the value eventually corrected itself and the original implementation is less code = faster/better