├── .gitattributes ├── .github └── workflows │ ├── test-backend.yml │ └── test-frontend.yml ├── .gitignore ├── .nvmrc ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── CHANGELOG.md ├── CONTRIBUTING.md ├── COPYING.md ├── LICENSE ├── README.md ├── backend ├── .dockerignore ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .vscode │ └── settings.json ├── README.md ├── cache │ └── .gitignore ├── jest.config.ts ├── mempool-config.sample.json ├── npm_package.sh ├── npm_package_rm_build_deps.sh ├── package-lock.json ├── package.json ├── src │ ├── __fixtures__ │ │ └── mempool-config.template.json │ ├── __tests__ │ │ ├── api │ │ │ ├── common.ts │ │ │ ├── difficulty-adjustment.test.ts │ │ │ └── test-data │ │ │ │ ├── transactions-random.json │ │ │ │ ├── transactions-rbfs.json │ │ │ │ └── transactions-replaced.json │ │ ├── config.test.ts │ │ └── gbt │ │ │ ├── gbt-tests.ts │ │ │ └── test-data │ │ │ ├── target-template.json │ │ │ ├── test-buffer.bin │ │ │ └── test-data-ids.json │ ├── api │ │ ├── about.routes.ts │ │ ├── acceleration │ │ │ ├── acceleration.routes.ts │ │ │ └── acceleration.ts │ │ ├── audit.ts │ │ ├── backend-info.ts │ │ ├── bitcoin │ │ │ ├── bitcoin-api-abstract-factory.ts │ │ │ ├── bitcoin-api-factory.ts │ │ │ ├── bitcoin-api.interface.ts │ │ │ ├── bitcoin-api.ts │ │ │ ├── bitcoin-client.ts │ │ │ ├── bitcoin-core.routes.ts │ │ │ ├── bitcoin-second-client.ts │ │ │ ├── bitcoin.routes.ts │ │ │ ├── electrum-api.interface.ts │ │ │ ├── electrum-api.ts │ │ │ ├── esplora-api.interface.ts │ │ │ └── esplora-api.ts │ │ ├── blocks.ts │ │ ├── chain-tips.ts │ │ ├── common.ts │ │ ├── cpfp.ts │ │ ├── database-migration.ts │ │ ├── difficulty-adjustment.ts │ │ ├── disk-cache.ts │ │ ├── explorer │ │ │ ├── channels.api.ts │ │ │ ├── channels.routes.ts │ │ │ ├── general.routes.ts │ │ │ ├── nodes.api.ts │ │ │ ├── nodes.routes.ts │ │ │ └── statistics.api.ts │ │ ├── fee-api.ts │ │ ├── fetch-version.ts │ │ ├── lightning │ │ │ ├── clightning │ │ │ │ ├── clightning-client.ts │ │ │ │ └── clightning-convert.ts │ │ │ ├── lightning-api-abstract-factory.ts │ │ │ ├── lightning-api-factory.ts │ │ │ ├── lightning-api.interface.ts │ │ │ └── lnd │ │ │ │ └── lnd-api.ts │ │ ├── liquid │ │ │ ├── elements-parser.ts │ │ │ ├── icons.ts │ │ │ └── liquid.routes.ts │ │ ├── loading-indicators.ts │ │ ├── memory-cache.ts │ │ ├── mempool-blocks.ts │ │ ├── mempool.ts │ │ ├── mining │ │ │ ├── mining-routes.ts │ │ │ └── mining.ts │ │ ├── ordpool-database-migration.ts │ │ ├── pools-parser.ts │ │ ├── prices │ │ │ └── prices.routes.ts │ │ ├── rbf-cache.ts │ │ ├── redis-cache.ts │ │ ├── services │ │ │ └── acceleration.ts │ │ ├── statistics │ │ │ ├── statistics-api.ts │ │ │ ├── statistics.routes.ts │ │ │ └── statistics.ts │ │ ├── transaction-utils.ts │ │ ├── tx-selection-worker.ts │ │ └── websocket-handler.ts │ ├── config.ts │ ├── database.ts │ ├── index.ts │ ├── indexer.ts │ ├── logger.ts │ ├── mempool.interfaces.test.ts │ ├── mempool.interfaces.ts │ ├── replication │ │ ├── AuditReplication.ts │ │ └── replicator.ts │ ├── repositories │ │ ├── AccelerationRepository.ts │ │ ├── BlocksAuditsRepository.ts │ │ ├── BlocksRepository.ts │ │ ├── BlocksSummariesRepository.ts │ │ ├── CpfpRepository.ts │ │ ├── DifficultyAdjustmentsRepository.ts │ │ ├── HashratesRepository.ts │ │ ├── NodeRecordsRepository.ts │ │ ├── NodesSocketsRepository.ts │ │ ├── PoolsRepository.ts │ │ ├── PricesRepository.ts │ │ └── TransactionRepository.ts │ ├── rpc-api │ │ ├── commands.ts │ │ ├── index.ts │ │ └── jsonrpc.ts │ ├── sync-assets.ts │ ├── tasks │ │ ├── lightning │ │ │ ├── forensics.service.ts │ │ │ ├── network-sync.service.ts │ │ │ ├── stats-updater.service.ts │ │ │ └── sync-tasks │ │ │ │ ├── funding-tx-fetcher.ts │ │ │ │ ├── node-locations.ts │ │ │ │ └── stats-importer.ts │ │ ├── pools-updater.ts │ │ ├── price-feeds │ │ │ ├── bitfinex-api.ts │ │ │ ├── bitflyer-api.ts │ │ │ ├── coinbase-api.ts │ │ │ ├── free-currency-api.ts │ │ │ ├── gemini-api.ts │ │ │ ├── kraken-api.ts │ │ │ └── mtgox-weekly.json │ │ └── price-updater.ts │ └── utils │ │ ├── axios-query.ts │ │ ├── bitcoin-script.ts │ │ ├── clone.ts │ │ ├── format.ts │ │ ├── ipcheck.js │ │ ├── p-limit.ts │ │ ├── pairing-heap.ts │ │ └── secp256k1.ts ├── testSetup.ts ├── tsconfig.build.json ├── tsconfig.debug.json └── tsconfig.json ├── contributors ├── 0xBEEFCAF3.txt ├── 0xflicker.txt ├── AlexLloyd0.txt ├── Arooba-git.txt ├── Czino.txt ├── TKone7.txt ├── TechMiX.txt ├── TheBlueMatt.txt ├── WesVleuten.txt ├── afahrer.txt ├── andrewtoth.txt ├── antonilol.txt ├── ayanamidev.txt ├── bennyhodl.txt ├── bguillaumat.txt ├── bosch-0.txt ├── daweilv.txt ├── devinbileck.txt ├── dsbaars.txt ├── emzy.txt ├── erikarvstedt.txt ├── fanquake.txt ├── fiatjaf.txt ├── fubz.txt ├── henrialb.txt ├── hunicus.txt ├── isghe.txt ├── jamesblacklock.txt ├── joostjager.txt ├── junderw.txt ├── knorrium.txt ├── learntheropes.txt ├── miguelmedeiros.txt ├── mononaut.txt ├── natsoni.txt ├── naveensrinivasan.txt ├── nothing0012.txt ├── nymkappa.txt ├── oleonardolima.txt ├── orangesurf.txt ├── pedromvpg.txt ├── pfoytik.txt ├── piterden.txt ├── rishkwal.txt ├── russeree.txt ├── secondl1ght.txt ├── shubhamkmr04.txt ├── softsimon.txt ├── starius.txt ├── takuabonn.txt ├── vostrnad.txt └── wiz.txt ├── docker ├── README.md ├── backend │ ├── Dockerfile │ ├── mempool-config.json │ ├── start.sh │ └── wait-for-it.sh ├── data │ └── .gitkeep ├── docker-compose.yml ├── frontend │ ├── Dockerfile │ ├── entrypoint.sh │ └── wait-for ├── init.sh ├── mysql │ └── data │ │ └── .gitkeep └── scripts │ └── get_image_digest.sh ├── frontend ├── .browserslistrc ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .tx │ └── config ├── README.md ├── angular.json ├── custom-sv-config.json ├── cypress.config.ts ├── cypress │ ├── e2e │ │ ├── liquid │ │ │ └── liquid.spec.ts │ │ ├── liquidtestnet │ │ │ └── liquidtestnet.spec.ts │ │ ├── mainnet │ │ │ ├── mainnet.spec.ts │ │ │ └── mining.spec.ts │ │ ├── signet │ │ │ └── signet.spec.ts │ │ └── testnet │ │ │ └── testnet.spec.ts │ ├── fixtures │ │ ├── assets.json │ │ ├── assets.minimal.json │ │ ├── mainnet_live2hchart.json │ │ ├── mainnet_mempoolInfo.json │ │ ├── mainnet_rbf.json │ │ ├── mainnet_rbf_new.json │ │ ├── mainnet_tx_cached.json │ │ └── pools.json │ ├── support │ │ ├── PageIdleDetector.ts │ │ ├── commands.ts │ │ ├── e2e.ts │ │ ├── index.d.ts │ │ └── websocket.ts │ └── tsconfig.json ├── frontend ├── generate-config.js ├── jest.config.js ├── mempool-frontend-config.sample.json ├── package-lock.json ├── package.json ├── proxy.conf.js ├── proxy.conf.local-esplora.js ├── proxy.conf.local.js ├── proxy.conf.mixed.js ├── proxy.conf.staging.js ├── server.run.ts ├── server.ts ├── setup-jest.ts ├── shims.ts ├── src │ ├── app │ │ ├── app-routing.module.ts │ │ ├── app.constants.ts │ │ ├── app.module.server.ts │ │ ├── app.module.ts │ │ ├── app.preloading-strategy.ts │ │ ├── bisq │ │ │ ├── bisq-dashboard │ │ │ │ └── bisq-dashboard.component.ts │ │ │ └── bisq-main-dashboard │ │ │ │ └── bisq-main-dashboard.component.scss │ │ ├── bitcoin-graphs.module.ts │ │ ├── bitcoin.utils.ts │ │ ├── components │ │ │ ├── about │ │ │ │ ├── about-sponsors.component.html │ │ │ │ ├── about-sponsors.component.scss │ │ │ │ ├── about-sponsors.component.ts │ │ │ │ ├── about.component.html │ │ │ │ ├── about.component.scss │ │ │ │ ├── about.component.ts │ │ │ │ └── about.module.ts │ │ │ ├── accelerate-checkout │ │ │ │ ├── accelerate-checkout.component.html │ │ │ │ ├── accelerate-checkout.component.scss │ │ │ │ └── accelerate-checkout.component.ts │ │ │ ├── accelerate-preview │ │ │ │ ├── accelerate-fee-graph.component.html │ │ │ │ ├── accelerate-fee-graph.component.scss │ │ │ │ ├── accelerate-fee-graph.component.ts │ │ │ │ ├── accelerate-preview.component.html │ │ │ │ ├── accelerate-preview.component.scss │ │ │ │ └── accelerate-preview.component.ts │ │ │ ├── acceleration │ │ │ │ ├── acceleration-fees-graph │ │ │ │ │ ├── acceleration-fees-graph.component.html │ │ │ │ │ ├── acceleration-fees-graph.component.scss │ │ │ │ │ └── acceleration-fees-graph.component.ts │ │ │ │ ├── acceleration-stats │ │ │ │ │ ├── acceleration-stats.component.html │ │ │ │ │ ├── acceleration-stats.component.scss │ │ │ │ │ └── acceleration-stats.component.ts │ │ │ │ ├── accelerations-list │ │ │ │ │ ├── accelerations-list.component.html │ │ │ │ │ ├── accelerations-list.component.scss │ │ │ │ │ └── accelerations-list.component.ts │ │ │ │ ├── accelerator-dashboard │ │ │ │ │ ├── accelerator-dashboard.component.html │ │ │ │ │ ├── accelerator-dashboard.component.scss │ │ │ │ │ └── accelerator-dashboard.component.ts │ │ │ │ └── pending-stats │ │ │ │ │ ├── pending-stats.component.html │ │ │ │ │ ├── pending-stats.component.scss │ │ │ │ │ └── pending-stats.component.ts │ │ │ ├── address-graph │ │ │ │ ├── address-graph.component.html │ │ │ │ ├── address-graph.component.scss │ │ │ │ └── address-graph.component.ts │ │ │ ├── address-group │ │ │ │ ├── address-group.component.html │ │ │ │ ├── address-group.component.scss │ │ │ │ └── address-group.component.ts │ │ │ ├── address-labels │ │ │ │ ├── address-labels.component.html │ │ │ │ ├── address-labels.component.scss │ │ │ │ └── address-labels.component.ts │ │ │ ├── address-transactions-widget │ │ │ │ ├── address-transactions-widget.component.html │ │ │ │ ├── address-transactions-widget.component.scss │ │ │ │ └── address-transactions-widget.component.ts │ │ │ ├── address │ │ │ │ ├── address-preview.component.html │ │ │ │ ├── address-preview.component.scss │ │ │ │ ├── address-preview.component.ts │ │ │ │ ├── address.component.html │ │ │ │ ├── address.component.scss │ │ │ │ └── address.component.ts │ │ │ ├── amount │ │ │ │ ├── amount.component.html │ │ │ │ ├── amount.component.scss │ │ │ │ └── amount.component.ts │ │ │ ├── app │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.scss │ │ │ │ └── app.component.ts │ │ │ ├── asset-circulation │ │ │ │ ├── asset-circulation.component.html │ │ │ │ ├── asset-circulation.component.scss │ │ │ │ └── asset-circulation.component.ts │ │ │ ├── asset │ │ │ │ ├── asset.component.html │ │ │ │ ├── asset.component.scss │ │ │ │ └── asset.component.ts │ │ │ ├── assets │ │ │ │ ├── asset-group │ │ │ │ │ ├── asset-group.component.html │ │ │ │ │ ├── asset-group.component.scss │ │ │ │ │ └── asset-group.component.ts │ │ │ │ ├── assets-featured │ │ │ │ │ ├── assets-featured.component.html │ │ │ │ │ ├── assets-featured.component.scss │ │ │ │ │ └── assets-featured.component.ts │ │ │ │ ├── assets-nav │ │ │ │ │ ├── assets-nav.component.html │ │ │ │ │ ├── assets-nav.component.scss │ │ │ │ │ └── assets-nav.component.ts │ │ │ │ ├── assets.component.html │ │ │ │ ├── assets.component.scss │ │ │ │ └── assets.component.ts │ │ │ ├── balance-widget │ │ │ │ ├── balance-widget.component.html │ │ │ │ ├── balance-widget.component.scss │ │ │ │ └── balance-widget.component.ts │ │ │ ├── block-fee-rates-graph │ │ │ │ ├── block-fee-rates-graph.component.html │ │ │ │ ├── block-fee-rates-graph.component.scss │ │ │ │ └── block-fee-rates-graph.component.ts │ │ │ ├── block-fees-graph │ │ │ │ ├── block-fees-graph.component.html │ │ │ │ ├── block-fees-graph.component.scss │ │ │ │ └── block-fees-graph.component.ts │ │ │ ├── block-fees-subsidy-graph │ │ │ │ ├── block-fees-subsidy-graph.component.html │ │ │ │ ├── block-fees-subsidy-graph.component.scss │ │ │ │ └── block-fees-subsidy-graph.component.ts │ │ │ ├── block-filters │ │ │ │ ├── block-filters.component.html │ │ │ │ ├── block-filters.component.scss │ │ │ │ └── block-filters.component.ts │ │ │ ├── block-health-graph │ │ │ │ ├── block-health-graph.component.html │ │ │ │ ├── block-health-graph.component.scss │ │ │ │ └── block-health-graph.component.ts │ │ │ ├── block-overview-graph │ │ │ │ ├── block-overview-graph.component.html │ │ │ │ ├── block-overview-graph.component.scss │ │ │ │ ├── block-overview-graph.component.ts │ │ │ │ ├── block-scene.ts │ │ │ │ ├── fast-vertex-array.ts │ │ │ │ ├── sprite-types.ts │ │ │ │ ├── tx-sprite.ts │ │ │ │ ├── tx-view.ts │ │ │ │ └── utils.ts │ │ │ ├── block-overview-tooltip │ │ │ │ ├── block-overview-tooltip.component.html │ │ │ │ ├── block-overview-tooltip.component.scss │ │ │ │ └── block-overview-tooltip.component.ts │ │ │ ├── block-rewards-graph │ │ │ │ ├── block-rewards-graph.component.html │ │ │ │ ├── block-rewards-graph.component.scss │ │ │ │ └── block-rewards-graph.component.ts │ │ │ ├── block-sizes-weights-graph │ │ │ │ ├── block-sizes-weights-graph.component.html │ │ │ │ ├── block-sizes-weights-graph.component.scss │ │ │ │ └── block-sizes-weights-graph.component.ts │ │ │ ├── block-view │ │ │ │ ├── block-view.component.html │ │ │ │ ├── block-view.component.scss │ │ │ │ └── block-view.component.ts │ │ │ ├── block │ │ │ │ ├── block-preview.component.html │ │ │ │ ├── block-preview.component.scss │ │ │ │ ├── block-preview.component.ts │ │ │ │ ├── block.component.html │ │ │ │ ├── block.component.scss │ │ │ │ ├── block.component.ts │ │ │ │ └── block.module.ts │ │ │ ├── blockchain-blocks │ │ │ │ ├── blockchain-blocks.component.html │ │ │ │ ├── blockchain-blocks.component.scss │ │ │ │ └── blockchain-blocks.component.ts │ │ │ ├── blockchain │ │ │ │ ├── blockchain.component.html │ │ │ │ ├── blockchain.component.scss │ │ │ │ └── blockchain.component.ts │ │ │ ├── blocks-list │ │ │ │ ├── blocks-list.component.html │ │ │ │ ├── blocks-list.component.scss │ │ │ │ └── blocks-list.component.ts │ │ │ ├── calculator │ │ │ │ ├── calculator.component.html │ │ │ │ ├── calculator.component.scss │ │ │ │ └── calculator.component.ts │ │ │ ├── change │ │ │ │ ├── change.component.html │ │ │ │ ├── change.component.scss │ │ │ │ └── change.component.ts │ │ │ ├── clipboard │ │ │ │ ├── clipboard.component.html │ │ │ │ ├── clipboard.component.scss │ │ │ │ └── clipboard.component.ts │ │ │ ├── clock-face │ │ │ │ ├── clock-face.component.html │ │ │ │ ├── clock-face.component.scss │ │ │ │ └── clock-face.component.ts │ │ │ ├── clock │ │ │ │ ├── clock.component.html │ │ │ │ ├── clock.component.scss │ │ │ │ └── clock.component.ts │ │ │ ├── clockchain │ │ │ │ ├── clockchain.component.html │ │ │ │ ├── clockchain.component.scss │ │ │ │ └── clockchain.component.ts │ │ │ ├── custom-dashboard │ │ │ │ ├── custom-dashboard.component.html │ │ │ │ ├── custom-dashboard.component.scss │ │ │ │ └── custom-dashboard.component.ts │ │ │ ├── difficulty-adjustments-table │ │ │ │ ├── difficulty-adjustments-table.component.html │ │ │ │ ├── difficulty-adjustments-table.component.scss │ │ │ │ └── difficulty-adjustments-table.components.ts │ │ │ ├── difficulty-mining │ │ │ │ ├── difficulty-mining.component.html │ │ │ │ ├── difficulty-mining.component.scss │ │ │ │ └── difficulty-mining.component.ts │ │ │ ├── difficulty │ │ │ │ ├── difficulty-tooltip.component.html │ │ │ │ ├── difficulty-tooltip.component.scss │ │ │ │ ├── difficulty-tooltip.component.ts │ │ │ │ ├── difficulty.component.html │ │ │ │ ├── difficulty.component.scss │ │ │ │ └── difficulty.component.ts │ │ │ ├── eight-blocks │ │ │ │ ├── eight-blocks.component.html │ │ │ │ ├── eight-blocks.component.scss │ │ │ │ └── eight-blocks.component.ts │ │ │ ├── faucet │ │ │ │ ├── faucet.component.html │ │ │ │ ├── faucet.component.scss │ │ │ │ └── faucet.component.ts │ │ │ ├── fee-distribution-graph │ │ │ │ ├── fee-distribution-graph.component.html │ │ │ │ ├── fee-distribution-graph.component.scss │ │ │ │ └── fee-distribution-graph.component.ts │ │ │ ├── fees-box-clickable │ │ │ │ ├── fees-box-clickable.component.html │ │ │ │ ├── fees-box-clickable.component.scss │ │ │ │ └── fees-box-clickable.component.ts │ │ │ ├── fees-box │ │ │ │ ├── fees-box.component.html │ │ │ │ ├── fees-box.component.scss │ │ │ │ └── fees-box.component.ts │ │ │ ├── fiat-selector │ │ │ │ ├── fiat-selector.component.html │ │ │ │ ├── fiat-selector.component.scss │ │ │ │ └── fiat-selector.component.ts │ │ │ ├── footer │ │ │ │ ├── footer.component.html │ │ │ │ ├── footer.component.scss │ │ │ │ └── footer.component.ts │ │ │ ├── graphs │ │ │ │ ├── graphs.component.html │ │ │ │ ├── graphs.component.scss │ │ │ │ └── graphs.component.ts │ │ │ ├── hashrate-chart │ │ │ │ ├── hashrate-chart.component.html │ │ │ │ ├── hashrate-chart.component.scss │ │ │ │ └── hashrate-chart.component.ts │ │ │ ├── hashrates-chart-pools │ │ │ │ ├── hashrate-chart-pools.component.html │ │ │ │ ├── hashrate-chart-pools.component.scss │ │ │ │ └── hashrate-chart-pools.component.ts │ │ │ ├── incoming-transactions-graph │ │ │ │ ├── incoming-transactions-graph.component.html │ │ │ │ └── incoming-transactions-graph.component.ts │ │ │ ├── indexing-progress │ │ │ │ ├── indexing-progress.component.html │ │ │ │ └── indexing-progress.component.ts │ │ │ ├── language-selector │ │ │ │ ├── language-selector.component.html │ │ │ │ ├── language-selector.component.scss │ │ │ │ └── language-selector.component.ts │ │ │ ├── lbtc-pegs-graph │ │ │ │ ├── lbtc-pegs-graph.component.html │ │ │ │ └── lbtc-pegs-graph.component.ts │ │ │ ├── liquid-master-page │ │ │ │ ├── liquid-master-page.component.html │ │ │ │ ├── liquid-master-page.component.scss │ │ │ │ └── liquid-master-page.component.ts │ │ │ ├── liquid-reserves-audit │ │ │ │ ├── expired-utxos-stats │ │ │ │ │ ├── expired-utxos-stats.component.html │ │ │ │ │ ├── expired-utxos-stats.component.scss │ │ │ │ │ └── expired-utxos-stats.component.ts │ │ │ │ ├── federation-addresses-list │ │ │ │ │ ├── federation-addresses-list.component.html │ │ │ │ │ ├── federation-addresses-list.component.scss │ │ │ │ │ └── federation-addresses-list.component.ts │ │ │ │ ├── federation-addresses-stats │ │ │ │ │ ├── federation-addresses-stats.component.html │ │ │ │ │ ├── federation-addresses-stats.component.scss │ │ │ │ │ └── federation-addresses-stats.component.ts │ │ │ │ ├── federation-utxos-list │ │ │ │ │ ├── federation-utxos-list.component.html │ │ │ │ │ ├── federation-utxos-list.component.scss │ │ │ │ │ └── federation-utxos-list.component.ts │ │ │ │ ├── federation-wallet │ │ │ │ │ ├── federation-wallet.component.html │ │ │ │ │ ├── federation-wallet.component.scss │ │ │ │ │ └── federation-wallet.component.ts │ │ │ │ ├── recent-pegs-list │ │ │ │ │ ├── recent-pegs-list.component.html │ │ │ │ │ ├── recent-pegs-list.component.scss │ │ │ │ │ └── recent-pegs-list.component.ts │ │ │ │ ├── recent-pegs-stats │ │ │ │ │ ├── recent-pegs-stats.component.html │ │ │ │ │ ├── recent-pegs-stats.component.scss │ │ │ │ │ └── recent-pegs-stats.component.ts │ │ │ │ ├── reserves-ratio-stats │ │ │ │ │ ├── reserves-ratio-stats.component.html │ │ │ │ │ ├── reserves-ratio-stats.component.scss │ │ │ │ │ └── reserves-ratio-stats.component.ts │ │ │ │ ├── reserves-ratio │ │ │ │ │ ├── reserves-ratio.component.html │ │ │ │ │ ├── reserves-ratio.component.scss │ │ │ │ │ └── reserves-ratio.component.ts │ │ │ │ └── reserves-supply-stats │ │ │ │ │ ├── reserves-supply-stats.component.html │ │ │ │ │ ├── reserves-supply-stats.component.scss │ │ │ │ │ └── reserves-supply-stats.component.ts │ │ │ ├── loading-indicator │ │ │ │ ├── loading-indicator.component.html │ │ │ │ ├── loading-indicator.component.scss │ │ │ │ └── loading-indicator.component.ts │ │ │ ├── master-page-preview │ │ │ │ ├── master-page-preview.component.html │ │ │ │ ├── master-page-preview.component.scss │ │ │ │ ├── master-page-preview.component.ts │ │ │ │ ├── preview-title.component.html │ │ │ │ └── preview-title.component.ts │ │ │ ├── master-page │ │ │ │ ├── master-page.component.html │ │ │ │ ├── master-page.component.scss │ │ │ │ └── master-page.component.ts │ │ │ ├── mempool-block-overview │ │ │ │ ├── mempool-block-overview.component.html │ │ │ │ └── mempool-block-overview.component.ts │ │ │ ├── mempool-block-view │ │ │ │ ├── mempool-block-view.component.html │ │ │ │ ├── mempool-block-view.component.scss │ │ │ │ └── mempool-block-view.component.ts │ │ │ ├── mempool-block │ │ │ │ ├── mempool-block.component.html │ │ │ │ ├── mempool-block.component.scss │ │ │ │ └── mempool-block.component.ts │ │ │ ├── mempool-blocks │ │ │ │ ├── mempool-blocks.component.html │ │ │ │ ├── mempool-blocks.component.scss │ │ │ │ └── mempool-blocks.component.ts │ │ │ ├── mempool-graph │ │ │ │ ├── mempool-graph.component.html │ │ │ │ └── mempool-graph.component.ts │ │ │ ├── menu │ │ │ │ ├── menu.component.html │ │ │ │ ├── menu.component.scss │ │ │ │ └── menu.component.ts │ │ │ ├── mining-dashboard │ │ │ │ ├── mining-dashboard.component.html │ │ │ │ ├── mining-dashboard.component.scss │ │ │ │ └── mining-dashboard.component.ts │ │ │ ├── ngx-bootstrap-multiselect │ │ │ │ ├── autofocus.directive.ts │ │ │ │ ├── ngx-bootstrap-multiselect.component.css │ │ │ │ ├── ngx-bootstrap-multiselect.component.html │ │ │ │ ├── ngx-bootstrap-multiselect.component.ts │ │ │ │ ├── off-click.directive.ts │ │ │ │ ├── search-filter.pipe.ts │ │ │ │ └── types.ts │ │ │ ├── ordinals │ │ │ │ ├── cat21-collab │ │ │ │ │ ├── cat21-collab.component.html │ │ │ │ │ ├── cat21-collab.component.scss │ │ │ │ │ └── cat21-collab.component.ts │ │ │ │ ├── cat21-mint │ │ │ │ │ ├── cat21-mint.component.html │ │ │ │ │ ├── cat21-mint.component.scss │ │ │ │ │ ├── cat21-mint.component.ts │ │ │ │ │ ├── countdown-timer-component.ts │ │ │ │ │ ├── countdown-timer.component.html │ │ │ │ │ └── countdown-timer.component.scss │ │ │ │ ├── cat21-whitelist-checker │ │ │ │ │ ├── cat21-whitelist-checker.component.html │ │ │ │ │ ├── cat21-whitelist-checker.component.scss │ │ │ │ │ └── cat21-whitelist-checker.component.ts │ │ │ │ ├── digital-artifact-viewer │ │ │ │ │ ├── atomical-viewer │ │ │ │ │ │ ├── atomical-viewer.component.html │ │ │ │ │ │ ├── atomical-viewer.component.scss │ │ │ │ │ │ └── atomical-viewer.component.ts │ │ │ │ │ ├── cat21-viewer │ │ │ │ │ │ ├── capitalize-first.pipe.ts │ │ │ │ │ │ ├── cat21-viewer.component.html │ │ │ │ │ │ ├── cat21-viewer.component.scss │ │ │ │ │ │ └── cat21-viewer.component.ts │ │ │ │ │ ├── code-viewer │ │ │ │ │ │ ├── code-viewer.component.html │ │ │ │ │ │ ├── code-viewer.component.scss │ │ │ │ │ │ └── code-viewer.component.ts │ │ │ │ │ ├── digital-artifact-viewer.component.html │ │ │ │ │ ├── digital-artifact-viewer.component.scss │ │ │ │ │ ├── digital-artifact-viewer.component.ts │ │ │ │ │ ├── inscription-viewer │ │ │ │ │ │ ├── inscription-viewer.component.html │ │ │ │ │ │ ├── inscription-viewer.component.scss │ │ │ │ │ │ └── inscription-viewer.component.ts │ │ │ │ │ ├── json-viewer │ │ │ │ │ │ ├── json-viewer.component.html │ │ │ │ │ │ ├── json-viewer.component.scss │ │ │ │ │ │ └── json-viewer.component.ts │ │ │ │ │ ├── metadata-viewer │ │ │ │ │ │ ├── metadata-viewer.component.html │ │ │ │ │ │ ├── metadata-viewer.component.scss │ │ │ │ │ │ └── metadata-viewer.component.ts │ │ │ │ │ ├── preview-viewer │ │ │ │ │ │ ├── preview-viewer.component.html │ │ │ │ │ │ ├── preview-viewer.component.scss │ │ │ │ │ │ └── preview-viewer.component.ts │ │ │ │ │ ├── runestone-viewer │ │ │ │ │ │ ├── big-int-formatter.pipe.spec.ts │ │ │ │ │ │ ├── big-int-formatter.pipe.ts │ │ │ │ │ │ ├── divisibility-pipe.spec.ts │ │ │ │ │ │ ├── divisibility-pipe.ts │ │ │ │ │ │ ├── number-suffix.pipe.spec.ts │ │ │ │ │ │ ├── number-suffix.pipe.ts │ │ │ │ │ │ ├── runestone-viewer.component.html │ │ │ │ │ │ ├── runestone-viewer.component.scss │ │ │ │ │ │ └── runestone-viewer.component.ts │ │ │ │ │ └── src20-viewer │ │ │ │ │ │ ├── src20-viewer.component.html │ │ │ │ │ │ ├── src20-viewer.component.scss │ │ │ │ │ │ └── src20-viewer.component.ts │ │ │ │ ├── full-number.validator.ts │ │ │ │ ├── inscription-accelerator │ │ │ │ │ ├── extract-error-message.ts │ │ │ │ │ ├── inscription-accelerator.component.html │ │ │ │ │ ├── inscription-accelerator.component.scss │ │ │ │ │ └── inscription-accelerator.component.ts │ │ │ │ └── wallet-connect │ │ │ │ │ ├── limit-array.spec.ts │ │ │ │ │ ├── limit-array.ts │ │ │ │ │ ├── wallet-connect.component.html │ │ │ │ │ ├── wallet-connect.component.scss │ │ │ │ │ └── wallet-connect.component.ts │ │ │ ├── pool-ranking │ │ │ │ ├── pool-ranking.component.html │ │ │ │ ├── pool-ranking.component.scss │ │ │ │ └── pool-ranking.component.ts │ │ │ ├── pool │ │ │ │ ├── pool-preview.component.html │ │ │ │ ├── pool-preview.component.scss │ │ │ │ ├── pool-preview.component.ts │ │ │ │ ├── pool.component.html │ │ │ │ ├── pool.component.scss │ │ │ │ └── pool.component.ts │ │ │ ├── privacy-policy │ │ │ │ ├── privacy-policy.component.html │ │ │ │ ├── privacy-policy.component.scss │ │ │ │ ├── privacy-policy.component.ts │ │ │ │ └── privacy-policy.module.ts │ │ │ ├── push-transaction │ │ │ │ ├── push-transaction.component.html │ │ │ │ ├── push-transaction.component.scss │ │ │ │ └── push-transaction.component.ts │ │ │ ├── qrcode │ │ │ │ ├── qrcode.component.html │ │ │ │ ├── qrcode.component.scss │ │ │ │ └── qrcode.component.ts │ │ │ ├── rate-unit-selector │ │ │ │ ├── rate-unit-selector.component.html │ │ │ │ ├── rate-unit-selector.component.scss │ │ │ │ └── rate-unit-selector.component.ts │ │ │ ├── rbf-list │ │ │ │ ├── rbf-list.component.html │ │ │ │ ├── rbf-list.component.scss │ │ │ │ └── rbf-list.component.ts │ │ │ ├── rbf-timeline │ │ │ │ ├── rbf-timeline-tooltip.component.html │ │ │ │ ├── rbf-timeline-tooltip.component.scss │ │ │ │ ├── rbf-timeline-tooltip.component.ts │ │ │ │ ├── rbf-timeline.component.html │ │ │ │ ├── rbf-timeline.component.scss │ │ │ │ └── rbf-timeline.component.ts │ │ │ ├── reward-stats │ │ │ │ ├── reward-stats.component.html │ │ │ │ ├── reward-stats.component.scss │ │ │ │ └── reward-stats.component.ts │ │ │ ├── search-form │ │ │ │ ├── search-form.component.html │ │ │ │ ├── search-form.component.scss │ │ │ │ ├── search-form.component.ts │ │ │ │ └── search-results │ │ │ │ │ ├── search-results.component.html │ │ │ │ │ ├── search-results.component.scss │ │ │ │ │ └── search-results.component.ts │ │ │ ├── server-health │ │ │ │ ├── server-health.component.html │ │ │ │ ├── server-health.component.scss │ │ │ │ ├── server-health.component.ts │ │ │ │ ├── server-status.component.html │ │ │ │ ├── server-status.component.scss │ │ │ │ └── server-status.component.ts │ │ │ ├── start │ │ │ │ ├── start.component.html │ │ │ │ ├── start.component.scss │ │ │ │ └── start.component.ts │ │ │ ├── statistics │ │ │ │ ├── statistics.component.html │ │ │ │ ├── statistics.component.scss │ │ │ │ └── statistics.component.ts │ │ │ ├── status-view │ │ │ │ ├── status-view.component.html │ │ │ │ └── status-view.component.ts │ │ │ ├── svg-images │ │ │ │ ├── svg-images.component.html │ │ │ │ └── svg-images.component.ts │ │ │ ├── television │ │ │ │ ├── television.component.html │ │ │ │ ├── television.component.scss │ │ │ │ └── television.component.ts │ │ │ ├── terms-of-service │ │ │ │ ├── terms-of-service.component.html │ │ │ │ ├── terms-of-service.component.scss │ │ │ │ ├── terms-of-service.component.ts │ │ │ │ └── terms-of-service.module.ts │ │ │ ├── test-transactions │ │ │ │ ├── test-transactions.component.html │ │ │ │ ├── test-transactions.component.scss │ │ │ │ └── test-transactions.component.ts │ │ │ ├── theme-selector │ │ │ │ ├── theme-selector.component.html │ │ │ │ ├── theme-selector.component.scss │ │ │ │ └── theme-selector.component.ts │ │ │ ├── time │ │ │ │ └── time.component.ts │ │ │ ├── tracker │ │ │ │ ├── tracker-bar.component.html │ │ │ │ ├── tracker-bar.component.scss │ │ │ │ ├── tracker-bar.component.ts │ │ │ │ ├── tracker.component.html │ │ │ │ ├── tracker.component.scss │ │ │ │ └── tracker.component.ts │ │ │ ├── trademark-policy │ │ │ │ ├── trademark-policy.component.html │ │ │ │ ├── trademark-policy.component.scss │ │ │ │ ├── trademark-policy.component.ts │ │ │ │ └── trademark-policy.module.ts │ │ │ ├── transaction │ │ │ │ ├── libwally.js │ │ │ │ ├── liquid-ublinding.ts │ │ │ │ ├── transaction-preview.component.html │ │ │ │ ├── transaction-preview.component.scss │ │ │ │ ├── transaction-preview.component.ts │ │ │ │ ├── transaction.component.html │ │ │ │ ├── transaction.component.scss │ │ │ │ ├── transaction.component.ts │ │ │ │ └── transaction.module.ts │ │ │ ├── transactions-list │ │ │ │ ├── transactions-list.component.html │ │ │ │ ├── transactions-list.component.scss │ │ │ │ └── transactions-list.component.ts │ │ │ ├── twitter-widget │ │ │ │ ├── twitter-widget.component.html │ │ │ │ ├── twitter-widget.component.scss │ │ │ │ └── twitter-widget.component.ts │ │ │ ├── tx-bowtie-graph-tooltip │ │ │ │ ├── tx-bowtie-graph-tooltip.component.html │ │ │ │ ├── tx-bowtie-graph-tooltip.component.scss │ │ │ │ └── tx-bowtie-graph-tooltip.component.ts │ │ │ ├── tx-bowtie-graph │ │ │ │ ├── tx-bowtie-graph.component.html │ │ │ │ ├── tx-bowtie-graph.component.scss │ │ │ │ ├── tx-bowtie-graph.component.ts │ │ │ │ └── tx-bowtie.module.ts │ │ │ ├── tx-features │ │ │ │ ├── tx-features.component.html │ │ │ │ ├── tx-features.component.scss │ │ │ │ └── tx-features.component.ts │ │ │ └── tx-fee-rating │ │ │ │ ├── tx-fee-rating.component.html │ │ │ │ ├── tx-fee-rating.component.scss │ │ │ │ └── tx-fee-rating.component.ts │ │ ├── dashboard │ │ │ ├── dashboard.component.html │ │ │ ├── dashboard.component.scss │ │ │ └── dashboard.component.ts │ │ ├── data-cy.directive.ts │ │ ├── docs │ │ │ ├── api-docs │ │ │ │ ├── api-docs-data.ts │ │ │ │ ├── api-docs-nav.component.html │ │ │ │ ├── api-docs-nav.component.scss │ │ │ │ ├── api-docs-nav.component.ts │ │ │ │ ├── api-docs.component.html │ │ │ │ ├── api-docs.component.scss │ │ │ │ └── api-docs.component.ts │ │ │ ├── code-template │ │ │ │ ├── code-template.component.html │ │ │ │ ├── code-template.component.scss │ │ │ │ └── code-template.component.ts │ │ │ ├── docs.module.ts │ │ │ ├── docs.routing.module.ts │ │ │ ├── docs │ │ │ │ ├── docs.component.html │ │ │ │ ├── docs.component.scss │ │ │ │ └── docs.component.ts │ │ │ └── faq-template │ │ │ │ └── faq-template.component.ts │ │ ├── fiat │ │ │ ├── fiat.component.html │ │ │ └── fiat.component.ts │ │ ├── graphs │ │ │ ├── echarts.ts │ │ │ ├── graphs.module.ts │ │ │ ├── graphs.routing.module.ts │ │ │ └── lightning-graphs.module.ts │ │ ├── injection-tokens.ts │ │ ├── interfaces │ │ │ ├── electrs.interface.ts │ │ │ ├── node-api.interface.ts │ │ │ ├── services.interface.ts │ │ │ └── websocket.interface.ts │ │ ├── lightning │ │ │ ├── channel │ │ │ │ ├── channel-box │ │ │ │ │ ├── channel-box.component.html │ │ │ │ │ ├── channel-box.component.scss │ │ │ │ │ └── channel-box.component.ts │ │ │ │ ├── channel-close-box │ │ │ │ │ ├── channel-close-box.component.html │ │ │ │ │ ├── channel-close-box.component.scss │ │ │ │ │ ├── channel-close-box.component.spec.ts │ │ │ │ │ └── channel-close-box.component.ts │ │ │ │ ├── channel-preview.component.html │ │ │ │ ├── channel-preview.component.scss │ │ │ │ ├── channel-preview.component.ts │ │ │ │ ├── channel.component.html │ │ │ │ ├── channel.component.scss │ │ │ │ ├── channel.component.ts │ │ │ │ └── closing-type │ │ │ │ │ ├── closing-type.component.html │ │ │ │ │ ├── closing-type.component.scss │ │ │ │ │ └── closing-type.component.ts │ │ │ ├── channels-list │ │ │ │ ├── channels-list.component.html │ │ │ │ ├── channels-list.component.scss │ │ │ │ └── channels-list.component.ts │ │ │ ├── channels-statistics │ │ │ │ ├── channels-statistics.component.html │ │ │ │ ├── channels-statistics.component.scss │ │ │ │ └── channels-statistics.component.ts │ │ │ ├── group │ │ │ │ ├── group-preview.component.html │ │ │ │ ├── group-preview.component.scss │ │ │ │ ├── group-preview.component.ts │ │ │ │ ├── group.component.html │ │ │ │ ├── group.component.scss │ │ │ │ └── group.component.ts │ │ │ ├── justice-list │ │ │ │ ├── justice-list.component.html │ │ │ │ ├── justice-list.component.scss │ │ │ │ └── justice-list.component.ts │ │ │ ├── lightning-api.service.ts │ │ │ ├── lightning-dashboard │ │ │ │ ├── lightning-dashboard.component.html │ │ │ │ ├── lightning-dashboard.component.scss │ │ │ │ └── lightning-dashboard.component.ts │ │ │ ├── lightning-previews.module.ts │ │ │ ├── lightning-previews.routing.module.ts │ │ │ ├── lightning-wrapper │ │ │ │ ├── lightning-wrapper.component.html │ │ │ │ ├── lightning-wrapper.component.scss │ │ │ │ └── lightning-wrapper.component.ts │ │ │ ├── lightning.module.ts │ │ │ ├── lightning.routing.module.ts │ │ │ ├── node-fee-chart │ │ │ │ ├── node-fee-chart.component.html │ │ │ │ ├── node-fee-chart.component.scss │ │ │ │ └── node-fee-chart.component.ts │ │ │ ├── node-statistics-chart │ │ │ │ ├── node-statistics-chart.component.html │ │ │ │ ├── node-statistics-chart.component.scss │ │ │ │ └── node-statistics-chart.component.ts │ │ │ ├── node-statistics │ │ │ │ ├── node-statistics.component.html │ │ │ │ ├── node-statistics.component.scss │ │ │ │ └── node-statistics.component.ts │ │ │ ├── node │ │ │ │ ├── liquidity-ad.ts │ │ │ │ ├── node-preview.component.html │ │ │ │ ├── node-preview.component.scss │ │ │ │ ├── node-preview.component.ts │ │ │ │ ├── node.component.html │ │ │ │ ├── node.component.scss │ │ │ │ └── node.component.ts │ │ │ ├── nodes-channels-map │ │ │ │ ├── nodes-channels-map.component.html │ │ │ │ ├── nodes-channels-map.component.scss │ │ │ │ └── nodes-channels-map.component.ts │ │ │ ├── nodes-channels │ │ │ │ ├── node-channels.component.html │ │ │ │ ├── node-channels.component.scss │ │ │ │ └── node-channels.component.ts │ │ │ ├── nodes-list │ │ │ │ ├── nodes-list.component.html │ │ │ │ ├── nodes-list.component.scss │ │ │ │ └── nodes-list.component.ts │ │ │ ├── nodes-map │ │ │ │ ├── nodes-map.component.html │ │ │ │ ├── nodes-map.component.scss │ │ │ │ └── nodes-map.component.ts │ │ │ ├── nodes-networks-chart │ │ │ │ ├── nodes-networks-chart.component.html │ │ │ │ ├── nodes-networks-chart.component.scss │ │ │ │ └── nodes-networks-chart.component.ts │ │ │ ├── nodes-per-country-chart │ │ │ │ ├── nodes-per-country-chart.component.html │ │ │ │ ├── nodes-per-country-chart.component.scss │ │ │ │ └── nodes-per-country-chart.component.ts │ │ │ ├── nodes-per-country │ │ │ │ ├── nodes-per-country.component.html │ │ │ │ ├── nodes-per-country.component.scss │ │ │ │ └── nodes-per-country.component.ts │ │ │ ├── nodes-per-isp-chart │ │ │ │ ├── nodes-per-isp-chart.component.html │ │ │ │ ├── nodes-per-isp-chart.component.scss │ │ │ │ └── nodes-per-isp-chart.component.ts │ │ │ ├── nodes-per-isp │ │ │ │ ├── nodes-per-isp-preview.component.html │ │ │ │ ├── nodes-per-isp-preview.component.scss │ │ │ │ ├── nodes-per-isp-preview.component.ts │ │ │ │ ├── nodes-per-isp.component.html │ │ │ │ ├── nodes-per-isp.component.scss │ │ │ │ └── nodes-per-isp.component.ts │ │ │ ├── nodes-ranking │ │ │ │ ├── nodes-ranking.component.html │ │ │ │ ├── nodes-ranking.component.scss │ │ │ │ ├── nodes-ranking.component.ts │ │ │ │ ├── oldest-nodes │ │ │ │ │ ├── oldest-nodes.component.html │ │ │ │ │ ├── oldest-nodes.component.scss │ │ │ │ │ └── oldest-nodes.component.ts │ │ │ │ ├── top-nodes-per-capacity │ │ │ │ │ ├── top-nodes-per-capacity.component.html │ │ │ │ │ ├── top-nodes-per-capacity.component.scss │ │ │ │ │ └── top-nodes-per-capacity.component.ts │ │ │ │ └── top-nodes-per-channels │ │ │ │ │ ├── top-nodes-per-channels.component.html │ │ │ │ │ ├── top-nodes-per-channels.component.scss │ │ │ │ │ └── top-nodes-per-channels.component.ts │ │ │ ├── nodes-rankings-dashboard │ │ │ │ ├── nodes-rankings-dashboard.component.html │ │ │ │ ├── nodes-rankings-dashboard.component.scss │ │ │ │ └── nodes-rankings-dashboard.component.ts │ │ │ └── statistics-chart │ │ │ │ ├── lightning-statistics-chart.component.html │ │ │ │ ├── lightning-statistics-chart.component.scss │ │ │ │ └── lightning-statistics-chart.component.ts │ │ ├── liquid │ │ │ ├── liquid-graphs.module.ts │ │ │ └── liquid-master-page.module.ts │ │ ├── master-page.module.ordpool.ts │ │ ├── master-page.module.ts │ │ ├── previews.module.ts │ │ ├── previews.routing.module.ts │ │ ├── services │ │ │ ├── api.service.ts │ │ │ ├── assets.service.ts │ │ │ ├── audio.service.ts │ │ │ ├── cache.service.ts │ │ │ ├── electrs-api.service.ts │ │ │ ├── enterprise.service.ts │ │ │ ├── http-cache.interceptor.ts │ │ │ ├── http-retry.interceptor.ts │ │ │ ├── language.service.ts │ │ │ ├── mining.service.ts │ │ │ ├── navigation.service.ts │ │ │ ├── opengraph.service.ts │ │ │ ├── ordinals │ │ │ │ ├── blockchain-api.service.ts │ │ │ │ ├── blockstream-api.service.ts │ │ │ │ ├── cat21-api.service.ts │ │ │ │ ├── cat21.service.helper.spec.ts │ │ │ │ ├── cat21.service.helper.ts │ │ │ │ ├── cat21.service.ts │ │ │ │ ├── cat21.service.types.ts │ │ │ │ ├── digital-artifacts-fetcher.service.ts │ │ │ │ ├── inscription-accelerator-api.service.ts │ │ │ │ ├── not-used-atm │ │ │ │ │ ├── big-old-digital-artifacts-fetcher.service.ts │ │ │ │ │ ├── blockchair-api.service.ts │ │ │ │ │ └── rolling-electrs-api.service.ts │ │ │ │ ├── ord-api.service.ts │ │ │ │ ├── wallet.service.ts │ │ │ │ └── wallet.service.types.ts │ │ │ ├── price.service.ts │ │ │ ├── seo.service.ts │ │ │ ├── services-api.service.ts │ │ │ ├── state.service.ts │ │ │ ├── storage.service.ts │ │ │ ├── theme.service.ts │ │ │ ├── websocket.service.ts │ │ │ ├── zone-shim.service.ts │ │ │ └── zone.service.ts │ │ └── shared │ │ │ ├── common.utils.ts │ │ │ ├── components │ │ │ ├── btc │ │ │ │ ├── btc.component.html │ │ │ │ ├── btc.component.scss │ │ │ │ └── btc.component.ts │ │ │ ├── confirmations │ │ │ │ ├── confirmations.component.html │ │ │ │ ├── confirmations.component.scss │ │ │ │ └── confirmations.component.ts │ │ │ ├── fee-rate │ │ │ │ ├── fee-rate.component.html │ │ │ │ ├── fee-rate.component.scss │ │ │ │ └── fee-rate.component.ts │ │ │ ├── geolocation │ │ │ │ ├── geolocation.component.html │ │ │ │ ├── geolocation.component.scss │ │ │ │ └── geolocation.component.ts │ │ │ ├── global-footer │ │ │ │ ├── global-footer.component.html │ │ │ │ ├── global-footer.component.scss │ │ │ │ └── global-footer.component.ts │ │ │ ├── http-error │ │ │ │ ├── http-error.component.html │ │ │ │ ├── http-error.component.scss │ │ │ │ └── http-error.component.ts │ │ │ ├── mempool-error │ │ │ │ ├── mempool-error.component.html │ │ │ │ └── mempool-error.component.ts │ │ │ ├── sats │ │ │ │ ├── sats.component.html │ │ │ │ ├── sats.component.scss │ │ │ │ └── sats.component.ts │ │ │ ├── testnet-alert │ │ │ │ ├── testnet-alert.component.html │ │ │ │ ├── testnet-alert.component.scss │ │ │ │ └── testnet-alert.component.ts │ │ │ ├── timestamp │ │ │ │ ├── timestamp.component.html │ │ │ │ ├── timestamp.component.scss │ │ │ │ └── timestamp.component.ts │ │ │ ├── toggle │ │ │ │ ├── toggle.component.html │ │ │ │ ├── toggle.component.scss │ │ │ │ └── toggle.component.ts │ │ │ ├── truncate │ │ │ │ ├── truncate.component.html │ │ │ │ ├── truncate.component.scss │ │ │ │ └── truncate.component.ts │ │ │ └── weight-directives │ │ │ │ └── weight-directives.ts │ │ │ ├── directives │ │ │ ├── browser-only.directive.ts │ │ │ ├── colored-price.directive.ts │ │ │ └── server-only.directive.ts │ │ │ ├── filters.utils.spec.ts │ │ │ ├── filters.utils.ts │ │ │ ├── graphs.utils.ts │ │ │ ├── i18n │ │ │ └── dates.ts │ │ │ ├── pipes │ │ │ ├── absolute │ │ │ │ └── absolute.pipe.ts │ │ │ ├── amount-shortener.pipe.ts │ │ │ ├── asm-styler │ │ │ │ └── asm-styler.pipe.ts │ │ │ ├── bitcoinsatoshis.pipe.ts │ │ │ ├── bytes-pipe │ │ │ │ ├── bytes.pipe.ts │ │ │ │ ├── utils.ts │ │ │ │ ├── vbytes.pipe.ts │ │ │ │ └── wubytes.pipe.ts │ │ │ ├── cap-address-pipe │ │ │ │ └── cap-address-pipe.ts │ │ │ ├── decimal2hex │ │ │ │ └── decimal2hex.pipe.ts │ │ │ ├── fee-rounding │ │ │ │ └── fee-rounding.pipe.ts │ │ │ ├── fiat-currency.pipe.ts │ │ │ ├── fiat-shortener.pipe.ts │ │ │ ├── hex2ascii │ │ │ │ └── hex2ascii.pipe.ts │ │ │ ├── http-error-pipe │ │ │ │ └── http-error.pipe.ts │ │ │ ├── math-ceil │ │ │ │ └── math-ceil.pipe.ts │ │ │ ├── no-sanitize.pipe.ts │ │ │ ├── relative-url │ │ │ │ └── relative-url.pipe.ts │ │ │ ├── scriptpubkey-type-pipe │ │ │ │ └── scriptpubkey-type.pipe.ts │ │ │ └── shorten-string-pipe │ │ │ │ └── shorten-string.pipe.ts │ │ │ ├── regex.utils.ts │ │ │ ├── script.utils.ts │ │ │ ├── shared.module.ts │ │ │ └── transaction.utils.ts │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.liquid.html │ ├── index.mempool.html │ ├── index.mempool.onbtc.html │ ├── index.ordpool.html │ ├── locale │ │ ├── messages.ar.xlf │ │ ├── messages.ca.xlf │ │ ├── messages.cs.xlf │ │ ├── messages.da.xlf │ │ ├── messages.de.xlf │ │ ├── messages.en_US.xlf │ │ ├── messages.es.xlf │ │ ├── messages.fa.xlf │ │ ├── messages.fi.xlf │ │ ├── messages.fi_FI.xlf │ │ ├── messages.fr.xlf │ │ ├── messages.he.xlf │ │ ├── messages.hi.xlf │ │ ├── messages.hr.xlf │ │ ├── messages.hu.xlf │ │ ├── messages.it.xlf │ │ ├── messages.ja.xlf │ │ ├── messages.ka.xlf │ │ ├── messages.ko.xlf │ │ ├── messages.lt.xlf │ │ ├── messages.mk.xlf │ │ ├── messages.nb.xlf │ │ ├── messages.ne.xlf │ │ ├── messages.nl.xlf │ │ ├── messages.pl.xlf │ │ ├── messages.pt.xlf │ │ ├── messages.pt_BR.xlf │ │ ├── messages.ro.xlf │ │ ├── messages.ru.xlf │ │ ├── messages.sl.xlf │ │ ├── messages.sv.xlf │ │ ├── messages.th.xlf │ │ ├── messages.tr.xlf │ │ ├── messages.uk.xlf │ │ ├── messages.vi.xlf │ │ ├── messages.xlf │ │ └── messages.zh.xlf │ ├── main.server.ts │ ├── main.ts │ ├── polyfills.ts │ ├── resources │ │ ├── .gitkeep │ │ ├── bimi.svg │ │ ├── cat21-example1.svg │ │ ├── cat21-example2.svg │ │ ├── cat21-example3.svg │ │ ├── cat21-example4.svg │ │ ├── cat21-example5.svg │ │ ├── cat21-example6.svg │ │ ├── cat21-logo.svg │ │ ├── cat21-placholder.svg │ │ ├── cat21-small-logo.svg │ │ ├── clock │ │ │ └── gradient.png │ │ ├── dead-cat.png │ │ ├── elsalvador.svg │ │ ├── favicons │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── browserconfig.xml │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon.ico │ │ │ ├── mstile-150x150.png │ │ │ └── site.webmanifest │ │ ├── inscription-assets │ │ │ ├── decode-data-uri.js │ │ │ ├── preview-audio.css │ │ │ ├── preview-markdown-marked.js │ │ │ ├── preview-markdown.css │ │ │ ├── preview-markdown.js │ │ │ ├── preview-model-viewer.js │ │ │ ├── preview-pdf-pdf.worker.js │ │ │ ├── preview-pdf-pdfjs.js │ │ │ ├── preview-pdf.css │ │ │ ├── preview-pdf.js │ │ │ ├── preview-text.css │ │ │ ├── preview-text.js │ │ │ └── preview-video.css │ │ ├── liquid-bitcoin.png │ │ ├── liquid │ │ │ ├── favicons │ │ │ │ ├── android-chrome-192x192.png │ │ │ │ ├── android-chrome-512x512.png │ │ │ │ ├── apple-touch-icon.png │ │ │ │ ├── browserconfig.xml │ │ │ │ ├── favicon-16x16.png │ │ │ │ ├── favicon-32x32.png │ │ │ │ ├── favicon.ico │ │ │ │ ├── mstile-150x150.png │ │ │ │ ├── safari-pinned-tab.svg │ │ │ │ └── site.webmanifest │ │ │ └── liquid-network-preview.png │ │ ├── mempool-accelerator-sparkles-light.svg │ │ ├── mempool-blocks-2-3-logo.jpeg │ │ ├── mempool-blocks-3-2-logo.jpeg │ │ ├── mempool-blocks.png │ │ ├── mempool-cube-logo.png │ │ ├── mempool-logo-bigger.png │ │ ├── mempool-preview.png │ │ ├── mempool-space-logo-bigger.png │ │ ├── mempool-space-logo-horizontal.png │ │ ├── mempool-space-preview.png │ │ ├── mempool-tube.png │ │ ├── mining-pools │ │ │ └── default.svg │ │ ├── onbtc.svg │ │ ├── onbtc │ │ │ ├── favicons │ │ │ │ ├── android-chrome-192x192.png │ │ │ │ ├── android-chrome-512x512.png │ │ │ │ ├── apple-touch-icon.png │ │ │ │ ├── favicon-16x16.png │ │ │ │ ├── favicon-32x32.png │ │ │ │ ├── favicon.ico │ │ │ │ └── site.webmanifest │ │ │ └── onbtc-preview.jpg │ │ ├── onbtclogo.svg │ │ ├── ordinal-wallets │ │ │ ├── btc-leather-logo.png │ │ │ ├── btc-unisat-logo.svg │ │ │ └── btc-xverse-logo.png │ │ ├── ordinals-mempool-logo.png │ │ ├── previews │ │ │ ├── about.jpg │ │ │ ├── accelerator.jpg │ │ │ ├── blocks.jpg │ │ │ ├── dashboard.png │ │ │ ├── docs-api.jpg │ │ │ ├── enterprise.jpg │ │ │ ├── faq.jpg │ │ │ ├── lightning.jpg │ │ │ ├── lightning.png │ │ │ ├── mempool-space-preview.jpg │ │ │ ├── mining.jpg │ │ │ ├── mining.png │ │ │ ├── privacy-policy.jpg │ │ │ ├── rbf.jpg │ │ │ ├── sponsor.jpg │ │ │ ├── terms-of-service.jpg │ │ │ ├── trademark-policy.jpg │ │ │ └── tx-push.jpg │ │ ├── profile │ │ │ ├── bisq.svg │ │ │ ├── bisq_network.png │ │ │ ├── bitcoin-s.svg │ │ │ ├── blixt.png │ │ │ ├── bluewallet.png │ │ │ ├── blw.png │ │ │ ├── boltz.svg │ │ │ ├── btcpayserver.svg │ │ │ ├── copa.png │ │ │ ├── edge.svg │ │ │ ├── electrum.png │ │ │ ├── galoy.svg │ │ │ ├── gnuagplv3.svg │ │ │ ├── liquid.svg │ │ │ ├── lnbits.svg │ │ │ ├── marina.svg │ │ │ ├── mercury.svg │ │ │ ├── mutiny.svg │ │ │ ├── muun.png │ │ │ ├── mynodebtc.png │ │ │ ├── nix-bitcoin.png │ │ │ ├── nunchuk.svg │ │ │ ├── onbtc-full.svg │ │ │ ├── phoenix.svg │ │ │ ├── raspiblitz.svg │ │ │ ├── raspibolt.jpg │ │ │ ├── ronindojo.png │ │ │ ├── runcitadel.svg │ │ │ ├── satpile.jpg │ │ │ ├── schildbach.svg │ │ │ ├── softsimon.jpg │ │ │ ├── sparrow.png │ │ │ ├── specter.png │ │ │ ├── start9.png │ │ │ ├── umbrel.png │ │ │ ├── unknown.svg │ │ │ ├── wiz.png │ │ │ └── zeus.png │ │ ├── promo-video │ │ │ └── mempool-promo.jpg │ │ ├── screenshots │ │ │ ├── v2.1.0-dashboard.png │ │ │ ├── v2.2.0-dashboard.png │ │ │ ├── v2.2.1-dashboard.png │ │ │ ├── v2.3.0-dashboard.png │ │ │ └── v2.4.0-dashboard.png │ │ ├── sounds │ │ │ ├── ascend-chime-cartoon.mp3 │ │ │ ├── bright-harmony.mp3 │ │ │ ├── cha-ching.mp3 │ │ │ ├── chime.mp3 │ │ │ ├── magic.mp3 │ │ │ └── wind-chimes-harp-ascend.mp3 │ │ ├── wallycore │ │ │ ├── wallycore.js │ │ │ └── wallycore.wasm │ │ └── worldmap.json │ ├── robots.txt │ ├── styles-ordpool-overrides1.scss │ ├── styles-ordpool-overrides2.scss │ ├── styles.scss │ ├── styles_form-control.scss │ ├── styles_highlightjs_solarized-dark.scss │ ├── theme-bukele.scss │ ├── theme-contrast.scss │ └── theme-wiz.scss ├── sync-assets.js ├── tsconfig.app.json ├── tsconfig.base.json ├── tsconfig.json ├── tsconfig.server.json ├── tsconfig.spec.json └── update-config.js ├── nginx-mempool.conf ├── nginx.conf ├── node_modules └── .package-lock.json ├── production ├── README.md ├── bitcoin.conf ├── bitcoin.crontab ├── bitcoin.minfee.conf ├── check ├── elements.conf ├── elements.crontab ├── freebsd │ ├── rc.conf │ ├── rc.d │ │ ├── bitcoin │ │ └── bitcoin_testnet │ ├── sysconf.patch │ └── syslog.d │ │ └── bitcoin.conf ├── install ├── linux │ ├── bitcoin-minfee.service │ ├── bitcoin-signet.service │ ├── bitcoin-testnet.service │ ├── bitcoin.service │ ├── elements-liquid.service │ ├── elements-liquidtestnet.service │ └── rsyslog.conf ├── mempool-build-all ├── mempool-config.bisq.json ├── mempool-config.liquid.json ├── mempool-config.liquidtestnet.json ├── mempool-config.mainnet-lightning.json ├── mempool-config.mainnet.json ├── mempool-config.signet-lightning.json ├── mempool-config.signet.json ├── mempool-config.testnet-lightning.json ├── mempool-config.testnet.json ├── mempool-config.testnet4.json ├── mempool-config.unfurl.json ├── mempool-frontend-config.liquid.json ├── mempool-frontend-config.mainnet.json ├── mempool-frontend-config.onbtc.json ├── mempool-frontend-config.ordpool.json ├── mempool-kill-all ├── mempool-logger ├── mempool-reset-all ├── mempool-start-all ├── mempool-update-assets ├── mempool.crontab ├── minfee.crontab ├── newsyslog-mempool-backend.conf ├── newsyslog-mempool-nginx.conf ├── nginx-cache-heater ├── nginx-cache-warmer ├── nginx │ ├── http-acl.conf │ ├── http-basic.conf │ ├── http-language.conf │ ├── http-proxy-cache.conf │ ├── location-api-v1-lightning.conf │ ├── location-api-v1-services.conf │ ├── location-api.conf │ ├── location-liquid-api.conf │ ├── location-liquidtestnet-api.conf │ ├── location-redirects.conf │ ├── location-signet-api-v1-lightning.conf │ ├── location-signet-api.conf │ ├── location-testnet-api-v1-lightning.conf │ ├── location-testnet-api.conf │ ├── location-testnet4-api.conf │ ├── nginx.conf │ ├── server-common.conf │ ├── server-esplora.conf │ ├── server-liquid.conf │ ├── server-mempool.conf │ ├── upstream-esplora.conf │ └── upstream-mempool.conf ├── redis.conf ├── sitemap-update ├── sysctl.conf ├── syslog.conf ├── test-nginx ├── torrc ├── unfurler-config.liquid.json ├── unfurler-config.mainnet.json └── unfurler-config.onbtc.json ├── rust └── gbt │ ├── .gitignore │ ├── Cargo.lock │ ├── Cargo.toml │ ├── README.md │ ├── build.rs │ ├── package.json │ ├── rust-toolchain │ └── src │ ├── audit_transaction.rs │ ├── gbt.rs │ ├── lib.rs │ ├── thread_acceleration.rs │ ├── thread_transaction.rs │ └── u32_hasher_types.rs ├── scripts ├── get_backend_hash.sh └── get_block_tip_height.sh └── unfurler ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc ├── README.md ├── config.sample.json ├── package-lock.json ├── package.json ├── puppeteer.config.json ├── src ├── concurrency │ ├── ReusablePage.ts │ └── ReusableSSRPage.ts ├── config.ts ├── index.ts ├── language │ └── lang.ts ├── logger.ts └── routes.ts ├── tsconfig.json └── views ├── block.ejs ├── footer.ejs ├── head.ejs ├── header.ejs └── tx.ejs /.gitattributes: -------------------------------------------------------------------------------- 1 | # ignore all differences in line endings 2 | package.json eol=crlf -crlf 3 | */package.json eol=crlf -crlf 4 | -------------------------------------------------------------------------------- /.github/workflows/test-backend.yml: -------------------------------------------------------------------------------- 1 | name: Test Backend 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | paths: 7 | - 'backend/**' 8 | - '.github/workflows/test-backend.yml' 9 | 10 | jobs: 11 | 12 | build: 13 | 14 | runs-on: ubuntu-latest 15 | defaults: 16 | run: 17 | working-directory: ./backend 18 | 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: actions/setup-node@v4 22 | with: 23 | node-version: 20 24 | 25 | - run: npm install 26 | - run: npm run build 27 | - run: npm test -------------------------------------------------------------------------------- /.github/workflows/test-frontend.yml: -------------------------------------------------------------------------------- 1 | name: Test Frontend 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | paths: 7 | - 'frontend/**' 8 | - '.github/workflows/test-frontend.yml' 9 | 10 | jobs: 11 | 12 | build: 13 | 14 | runs-on: ubuntu-latest 15 | defaults: 16 | run: 17 | working-directory: ./frontend 18 | 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: actions/setup-node@v4 22 | with: 23 | node-version: 20 24 | 25 | - run: npm install 26 | - run: npm run build 27 | - run: npm test -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | sitemap 2 | data 3 | docker-compose.yml 4 | backend/mempool-config.json 5 | *.swp 6 | frontend/src/resources/config.template.js 7 | frontend/src/resources/config.js 8 | target 9 | docker/backend/start_ci.sh -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.8.0 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 2, 3 | "typescript.preferences.importModuleSpecifier": "relative", 4 | "typescript.tsdk": "./backend/node_modules/typescript/lib", 5 | "rust-analyzer.procMacro.ignored": { "napi-derive": ["napi"] } 6 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "npm: build-debug", 6 | "type": "npm", 7 | "script": "build-debug", 8 | "problemMatcher": ["$tsc"], 9 | "group": { 10 | "kind": "build", 11 | "isDefault": true 12 | }, 13 | "options": { 14 | "cwd": "${workspaceFolder}/backend" 15 | } 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /backend/.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | -------------------------------------------------------------------------------- /backend/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | 18 | -------------------------------------------------------------------------------- /backend/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /backend/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /backend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "printWidth": 80, 4 | "tabWidth": 2, 5 | "trailingComma": "es5" 6 | } 7 | -------------------------------------------------------------------------------- /backend/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 2, 3 | "typescript.tsdk": "../backend/node_modules/typescript/lib" 4 | } -------------------------------------------------------------------------------- /backend/cache/.gitignore: -------------------------------------------------------------------------------- 1 | *.json 2 | -------------------------------------------------------------------------------- /backend/jest.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "@jest/types" 2 | 3 | const config: Config.InitialOptions = { 4 | preset: "ts-jest", 5 | testEnvironment: "node", 6 | verbose: true, 7 | automock: false, 8 | collectCoverage: false, 9 | collectCoverageFrom: ["./src/**/**.ts"], 10 | coverageProvider: "babel", 11 | coverageThreshold: { 12 | global: { 13 | lines: 1 14 | } 15 | }, 16 | setupFiles: [ 17 | "./testSetup.ts", 18 | ], 19 | modulePathIgnorePatterns: ["/dist/"] 20 | } 21 | export default config; 22 | -------------------------------------------------------------------------------- /backend/npm_package.sh: -------------------------------------------------------------------------------- 1 | #/bin/sh 2 | set -e 3 | 4 | # Remove previous dist folder 5 | rm -rf dist 6 | # Build new dist folder 7 | npm run build 8 | # Remove previous package folder 9 | rm -rf package 10 | # Move JS and deps 11 | mv dist package 12 | cp -R node_modules package 13 | # Remove symlink for rust-gbt and insert real folder 14 | rm package/node_modules/rust-gbt 15 | cp -R rust-gbt package/node_modules 16 | # Clean up deps 17 | npm run package-rm-build-deps 18 | -------------------------------------------------------------------------------- /backend/npm_package_rm_build_deps.sh: -------------------------------------------------------------------------------- 1 | #/bin/sh 2 | set -e 3 | 4 | # Cleaning up inside the node_modules folder 5 | cd package/node_modules 6 | rm -rf \ 7 | typescript \ 8 | @typescript-eslint \ 9 | @napi-rs 10 | -------------------------------------------------------------------------------- /backend/src/__tests__/gbt/test-data/test-buffer.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/backend/src/__tests__/gbt/test-data/test-buffer.bin -------------------------------------------------------------------------------- /backend/src/api/bitcoin/bitcoin-api-factory.ts: -------------------------------------------------------------------------------- 1 | import config from '../../config'; 2 | import { AbstractBitcoinApi } from './bitcoin-api-abstract-factory'; 3 | import EsploraApi from './esplora-api'; 4 | import BitcoinApi from './bitcoin-api'; 5 | import ElectrumApi from './electrum-api'; 6 | import bitcoinClient from './bitcoin-client'; 7 | 8 | function bitcoinApiFactory(): AbstractBitcoinApi { 9 | switch (config.MEMPOOL.BACKEND) { 10 | case 'esplora': 11 | return new EsploraApi(); 12 | case 'electrum': 13 | return new ElectrumApi(bitcoinClient); 14 | case 'none': 15 | default: 16 | return new BitcoinApi(bitcoinClient); 17 | } 18 | } 19 | 20 | export const bitcoinCoreApi = new BitcoinApi(bitcoinClient); 21 | 22 | export default bitcoinApiFactory(); 23 | -------------------------------------------------------------------------------- /backend/src/api/bitcoin/bitcoin-client.ts: -------------------------------------------------------------------------------- 1 | import config from '../../config'; 2 | const bitcoin = require('../../rpc-api/index'); 3 | import { BitcoinRpcCredentials } from './bitcoin-api-abstract-factory'; 4 | 5 | const nodeRpcCredentials: BitcoinRpcCredentials = { 6 | host: config.CORE_RPC.HOST, 7 | port: config.CORE_RPC.PORT, 8 | user: config.CORE_RPC.USERNAME, 9 | pass: config.CORE_RPC.PASSWORD, 10 | timeout: config.CORE_RPC.TIMEOUT, 11 | cookie: config.CORE_RPC.COOKIE ? config.CORE_RPC.COOKIE_PATH : undefined, 12 | }; 13 | 14 | export default new bitcoin.Client(nodeRpcCredentials); 15 | -------------------------------------------------------------------------------- /backend/src/api/bitcoin/bitcoin-second-client.ts: -------------------------------------------------------------------------------- 1 | import config from '../../config'; 2 | const bitcoin = require('../../rpc-api/index'); 3 | import { BitcoinRpcCredentials } from './bitcoin-api-abstract-factory'; 4 | 5 | const nodeRpcCredentials: BitcoinRpcCredentials = { 6 | host: config.SECOND_CORE_RPC.HOST, 7 | port: config.SECOND_CORE_RPC.PORT, 8 | user: config.SECOND_CORE_RPC.USERNAME, 9 | pass: config.SECOND_CORE_RPC.PASSWORD, 10 | timeout: config.SECOND_CORE_RPC.TIMEOUT, 11 | cookie: config.SECOND_CORE_RPC.COOKIE ? config.SECOND_CORE_RPC.COOKIE_PATH : undefined, 12 | }; 13 | 14 | export default new bitcoin.Client(nodeRpcCredentials); 15 | -------------------------------------------------------------------------------- /backend/src/api/bitcoin/electrum-api.interface.ts: -------------------------------------------------------------------------------- 1 | export namespace IElectrumApi { 2 | export interface ScriptHashBalance { 3 | confirmed: number; 4 | unconfirmed: number; 5 | } 6 | 7 | export interface ScriptHashHistory { 8 | height: number; 9 | tx_hash: string; 10 | fee?: number; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /backend/src/api/lightning/lightning-api-abstract-factory.ts: -------------------------------------------------------------------------------- 1 | import { ILightningApi } from './lightning-api.interface'; 2 | 3 | export interface AbstractLightningApi { 4 | $getNetworkGraph(): Promise; 5 | } 6 | -------------------------------------------------------------------------------- /backend/src/api/lightning/lightning-api-factory.ts: -------------------------------------------------------------------------------- 1 | import config from '../../config'; 2 | import CLightningClient from './clightning/clightning-client'; 3 | import { AbstractLightningApi } from './lightning-api-abstract-factory'; 4 | import LndApi from './lnd/lnd-api'; 5 | 6 | function lightningApiFactory(): AbstractLightningApi { 7 | switch (config.LIGHTNING.ENABLED === true && config.LIGHTNING.BACKEND) { 8 | case 'cln': 9 | return new CLightningClient(config.CLIGHTNING.SOCKET); 10 | case 'lnd': 11 | default: 12 | return new LndApi(); 13 | } 14 | } 15 | 16 | export default lightningApiFactory(); 17 | -------------------------------------------------------------------------------- /backend/src/api/prices/prices.routes.ts: -------------------------------------------------------------------------------- 1 | import { Application, Request, Response } from 'express'; 2 | import config from '../../config'; 3 | import pricesUpdater from '../../tasks/price-updater'; 4 | 5 | class PricesRoutes { 6 | public initRoutes(app: Application): void { 7 | app.get(config.MEMPOOL.API_URL_PREFIX + 'prices', this.$getCurrentPrices.bind(this)); 8 | } 9 | 10 | private $getCurrentPrices(req: Request, res: Response): void { 11 | res.header('Pragma', 'public'); 12 | res.header('Cache-control', 'public'); 13 | res.setHeader('Expires', new Date(Date.now() + 360_0000 / config.MEMPOOL.PRICE_UPDATES_PER_HOUR).toUTCString()); 14 | 15 | res.json(pricesUpdater.getLatestPrices()); 16 | } 17 | } 18 | 19 | export default new PricesRoutes(); 20 | -------------------------------------------------------------------------------- /backend/src/mempool.interfaces.test.ts: -------------------------------------------------------------------------------- 1 | import { TransactionFlags } from './mempool.interfaces'; 2 | 3 | describe('TransactionFlags conversion tests', () => { 4 | // if the BigInt is to large, it can't be represented by a number anymore 5 | it('should convert all flags to Number and back to BigInt without error', () => { 6 | for (const flagName in TransactionFlags) { 7 | if (Object.prototype.hasOwnProperty.call(TransactionFlags, flagName)) { 8 | const flagValue = TransactionFlags[flagName]; 9 | const flagNumber = Number(flagValue); 10 | const flagBigInt = BigInt(flagNumber); 11 | expect(flagBigInt).toBe(flagValue); 12 | } 13 | } 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /backend/src/tasks/price-feeds/bitflyer-api.ts: -------------------------------------------------------------------------------- 1 | import { query } from '../../utils/axios-query'; 2 | import { PriceFeed, PriceHistory } from '../price-updater'; 3 | 4 | class BitflyerApi implements PriceFeed { 5 | public name: string = 'Bitflyer'; 6 | public currencies: string[] = ['USD', 'EUR', 'JPY']; 7 | 8 | public url: string = 'https://api.bitflyer.com/v1/ticker?product_code=BTC_'; 9 | public urlHist: string = ''; 10 | 11 | constructor() { 12 | } 13 | 14 | public async $fetchPrice(currency): Promise { 15 | const response = await query(this.url + currency); 16 | if (response && response['ltp']) { 17 | return parseInt(response['ltp'], 10); 18 | } else { 19 | return -1; 20 | } 21 | } 22 | 23 | public async $fetchRecentPrice(currencies: string[], type: 'hour' | 'day'): Promise { 24 | return []; 25 | } 26 | } 27 | 28 | export default BitflyerApi; 29 | -------------------------------------------------------------------------------- /backend/src/utils/clone.ts: -------------------------------------------------------------------------------- 1 | // simple recursive deep clone for literal-type objects 2 | // does not preserve Dates, Maps, Sets etc 3 | // does not support recursive objects 4 | // properties deeper than maxDepth will be shallow cloned 5 | export function deepClone(obj: any, maxDepth: number = 50, depth: number = 0): any { 6 | let cloned = obj; 7 | if (depth < maxDepth && typeof obj === 'object') { 8 | cloned = Array.isArray(obj) ? [] : {}; 9 | for (const key in obj) { 10 | cloned[key] = deepClone(obj[key], maxDepth, depth + 1); 11 | } 12 | } 13 | return cloned; 14 | } -------------------------------------------------------------------------------- /backend/testSetup.ts: -------------------------------------------------------------------------------- 1 | jest.mock('./mempool-config.json', () => ({}), { virtual: true }); 2 | jest.mock('./src/logger.ts', () => ({}), { virtual: true }); 3 | jest.mock('./src/api/rbf-cache.ts', () => ({}), { virtual: true }); 4 | jest.mock('./src/api/mempool.ts', () => ({}), { virtual: true }); 5 | jest.mock('./src/api/memory-cache.ts', () => ({}), { virtual: true }); 6 | -------------------------------------------------------------------------------- /backend/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig", 3 | "compilerOptions": { 4 | "types": ["node"] 5 | }, 6 | "exclude": [ 7 | "**/*.test.*", 8 | "**/__mocks__/*", 9 | "**/__tests__/*", 10 | "*.spec.ts" 11 | ], 12 | } 13 | -------------------------------------------------------------------------------- /backend/tsconfig.debug.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig", 3 | "compilerOptions": { 4 | "types": ["node"], 5 | "sourceMap": true, 6 | "outDir": "dist" 7 | }, 8 | "exclude": [ 9 | "**/*.test.*", 10 | "**/__mocks__/*", 11 | "**/__tests__/*", 12 | "*.spec.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "esnext", 5 | "types": ["node", "jest"], 6 | "lib": ["es2019", "dom"], 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "noImplicitAny": false, 10 | "sourceMap": false, 11 | "outDir": "dist", 12 | "moduleResolution": "node", 13 | "typeRoots": [ 14 | "node_modules/@types" 15 | ], 16 | "allowSyntheticDefaultImports": true, 17 | "esModuleInterop": true, 18 | "allowJs": true, 19 | }, 20 | "include": [ 21 | "src/**/*.ts" 22 | ], 23 | "exclude": [ 24 | "dist/**" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /contributors/0xBEEFCAF3.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of November 17, 2023. 2 | 3 | Signed: 0xBEEFCAF3 4 | -------------------------------------------------------------------------------- /contributors/0xflicker.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of June 24, 2023. 2 | 3 | Signed: 0xflicker 4 | -------------------------------------------------------------------------------- /contributors/AlexLloyd0.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: AlexLloyd0 4 | -------------------------------------------------------------------------------- /contributors/Arooba-git.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: Arooba-git -------------------------------------------------------------------------------- /contributors/Czino.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 29, 2023. 2 | 3 | Signed: Czino 4 | -------------------------------------------------------------------------------- /contributors/TKone7.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of October 23, 2023. 2 | 3 | Signed: TKone7 4 | -------------------------------------------------------------------------------- /contributors/TechMiX.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: TechMiX 4 | -------------------------------------------------------------------------------- /contributors/TheBlueMatt.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file with sha256 hash c80c5ee4c71c5a76a1f6cd35339bd0c45b25b491933ea7b02a66470e9f43a6fd. 2 | 3 | Signed: TheBlueMatt 4 | -------------------------------------------------------------------------------- /contributors/WesVleuten.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of September 1, 2022. 2 | 3 | Signed: WesVleuten 4 | -------------------------------------------------------------------------------- /contributors/afahrer.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 23, 2024. 2 | 3 | Signed: afahrer -------------------------------------------------------------------------------- /contributors/andrewtoth.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of August 2, 2023. 2 | 3 | Signed: andrewtoth 4 | -------------------------------------------------------------------------------- /contributors/antonilol.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: antonilol 4 | -------------------------------------------------------------------------------- /contributors/ayanamidev.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of May 15, 2022. 2 | 3 | Signed: ayanamidev 4 | -------------------------------------------------------------------------------- /contributors/bennyhodl.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of June 28, 2023. 2 | 3 | Signed: bennyhodl 4 | -------------------------------------------------------------------------------- /contributors/bguillaumat.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: bguillaumat 4 | -------------------------------------------------------------------------------- /contributors/bosch-0.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: Bosch-0 4 | -------------------------------------------------------------------------------- /contributors/daweilv.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 7, 2024. 2 | 3 | Signed: daweilv 4 | -------------------------------------------------------------------------------- /contributors/devinbileck.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 21, 2023. 2 | 3 | Signed: devinbileck 4 | -------------------------------------------------------------------------------- /contributors/dsbaars.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: dsbaars -------------------------------------------------------------------------------- /contributors/emzy.txt: -------------------------------------------------------------------------------- 1 | Mempool Space K.K. has a signed CLA or other agreement on file with @emzy as of January 25, 2022 2 | -------------------------------------------------------------------------------- /contributors/erikarvstedt.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 6, 2022. 2 | 3 | Signed: erikarvstedt 4 | -------------------------------------------------------------------------------- /contributors/fanquake.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of October 23, 2023. 2 | 3 | Signed: fanquake 4 | -------------------------------------------------------------------------------- /contributors/fiatjaf.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | I also regret having ever contributed to this repository since they keep asking me to sign this legalese timewaste things. 3 | And finally I don't care about licenses and won't sue anyone over intellectual property, which is a fake statist construct invented by evil lobby lawyers. 4 | 5 | Signed: fiatjaf 6 | -------------------------------------------------------------------------------- /contributors/fubz.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: fubz 4 | -------------------------------------------------------------------------------- /contributors/henrialb.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 12, 2024. 2 | 3 | Signed: henrialb 4 | -------------------------------------------------------------------------------- /contributors/hunicus.txt: -------------------------------------------------------------------------------- 1 | Mempool Space K.K. has a signed CLA or other agreement on file with @hunicus as of January 25, 2022 2 | -------------------------------------------------------------------------------- /contributors/isghe.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 18, 2024. 2 | 3 | Signed: isghe 4 | -------------------------------------------------------------------------------- /contributors/jamesblacklock.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of December 20, 2023. 2 | 3 | Signed: jamesblacklock 4 | -------------------------------------------------------------------------------- /contributors/joostjager.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: joostjager 4 | -------------------------------------------------------------------------------- /contributors/junderw.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of August 19, 2022. 2 | 3 | Signed: junderw 4 | -------------------------------------------------------------------------------- /contributors/knorrium.txt: -------------------------------------------------------------------------------- 1 | Mempool Space K.K. has a signed CLA or other agreement on file with @knorrium as of January 25, 2022 2 | -------------------------------------------------------------------------------- /contributors/learntheropes.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 7, 203. 2 | 3 | Signed: learntheropes 4 | -------------------------------------------------------------------------------- /contributors/miguelmedeiros.txt: -------------------------------------------------------------------------------- 1 | Mempool Space K.K. has a signed CLA or other agreement on file with @miguelmedeiros as of January 25, 2022 2 | -------------------------------------------------------------------------------- /contributors/mononaut.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of May 31, 2022. 2 | 3 | Signed: mononaut 4 | -------------------------------------------------------------------------------- /contributors/natsoni.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of November 16, 2023. 2 | 3 | Signed: natsoni 4 | -------------------------------------------------------------------------------- /contributors/naveensrinivasan.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of March 11, 2022. 2 | 3 | Signed: naveensrinivasan 4 | -------------------------------------------------------------------------------- /contributors/nothing0012.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of April 8, 2023. 2 | 3 | Signed: nothing0012 4 | -------------------------------------------------------------------------------- /contributors/nymkappa.txt: -------------------------------------------------------------------------------- 1 | Mempool Space K.K. has a signed CLA or other agreement on file with @nymkappa as of January 25, 2022 2 | -------------------------------------------------------------------------------- /contributors/oleonardolima.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 25, 2022. 2 | 3 | Signed: oleonardolima 4 | -------------------------------------------------------------------------------- /contributors/orangesurf.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of September 12, 2023. 2 | 3 | Signed: orange surf 4 | -------------------------------------------------------------------------------- /contributors/pedromvpg.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 20, 2023. 2 | 3 | Signed: pedromvpg 4 | -------------------------------------------------------------------------------- /contributors/pfoytik.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of June 15, 2023. 2 | 3 | Signed pfoytik 4 | -------------------------------------------------------------------------------- /contributors/piterden.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of December 17, 2022. 2 | 3 | Signed: piterden 4 | -------------------------------------------------------------------------------- /contributors/rishkwal.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 29, 2023. 2 | 3 | Signed: rishkwal 4 | -------------------------------------------------------------------------------- /contributors/russeree.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of March 8, 2024. 2 | 3 | Signed: PortlandHODL 4 | -------------------------------------------------------------------------------- /contributors/secondl1ght.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of June 14, 2023. 2 | 3 | Signed: secondl1ght 4 | -------------------------------------------------------------------------------- /contributors/shubhamkmr04.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of November 15, 2023. 2 | 3 | Signed: shubhamkmr04 -------------------------------------------------------------------------------- /contributors/softsimon.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: softsimon 4 | -------------------------------------------------------------------------------- /contributors/starius.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of Oct 13, 2023. 2 | 3 | Signed starius 4 | -------------------------------------------------------------------------------- /contributors/takuabonn.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of December 13, 2023. 2 | 3 | Signed: takuabonn -------------------------------------------------------------------------------- /contributors/vostrnad.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: vostrnad 4 | -------------------------------------------------------------------------------- /contributors/wiz.txt: -------------------------------------------------------------------------------- 1 | I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of January 25, 2022. 2 | 3 | Signed: wiz 4 | -------------------------------------------------------------------------------- /docker/data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/docker/data/.gitkeep -------------------------------------------------------------------------------- /docker/mysql/data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/docker/mysql/data/.gitkeep -------------------------------------------------------------------------------- /docker/scripts/get_image_digest.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | VERSION=$1 4 | IMAGE="" 5 | 6 | if [ -z "${VERSION}" ]; then 7 | echo "no version provided (i.e, v2.2.0), using latest tag" 8 | VERSION="latest" 9 | fi 10 | 11 | for package in frontend backend; do 12 | PACKAGE=mempool/"$package" 13 | IMAGE="$PACKAGE":"$VERSION" 14 | HASH=`docker pull $IMAGE > /dev/null && docker inspect $IMAGE | sed -n '/RepoDigests/{n;p;}' | grep -o '[0-9a-f]\{64\}'` 15 | if [ -n "${HASH}" ]; then 16 | echo "$IMAGE"@sha256:"$HASH" 17 | fi 18 | done 19 | -------------------------------------------------------------------------------- /frontend/.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # For the full list of supported browsers by the Angular framework, please see: 6 | # https://angular.io/guide/browser-support 7 | 8 | # You can see what browsers were selected by your queries by running: 9 | # npx browserslist 10 | 11 | last 2 Chrome versions 12 | last 1 Firefox version 13 | last 2 Edge major versions 14 | last 2 Safari major versions 15 | last 2 iOS major versions 16 | Firefox ESR 17 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = false 9 | trim_trailing_whitespace = false 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | 18 | -------------------------------------------------------------------------------- /frontend/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | frontend 4 | -------------------------------------------------------------------------------- /frontend/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "printWidth": 80, 4 | "tabWidth": 2, 5 | "trailingComma": "es5" 6 | } 7 | -------------------------------------------------------------------------------- /frontend/.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [o:mempool:p:mempool:r:frontend-src-locale-messages-xlf--master] 5 | file_filter = frontend/src/locale/messages..xlf 6 | source_file = frontend/src/locale/messages.en-US.xlf 7 | source_lang = en-US 8 | type = XLIFF 9 | 10 | -------------------------------------------------------------------------------- /frontend/cypress/fixtures/mainnet_live2hchart.json: -------------------------------------------------------------------------------- 1 | {"live-2h-chart":{"id":1319298,"added":"2021-07-23T18:27:34.000Z","unconfirmed_transactions":546,"tx_per_second":3.93333,"vbytes_per_second":1926,"mempool_byte_weight":1106656,"total_fee":6198583,"vsizes":[255,18128,43701,58534,17144,5532,4483,1759,2394,1089,1683,7409,751,101010,1151,592,1497,703,1369,4747,800,1221,0,0,712,0,0,0,0,0,0,0,0,0,0,0,0,0]}} -------------------------------------------------------------------------------- /frontend/cypress/fixtures/mainnet_rbf.json: -------------------------------------------------------------------------------- 1 | { 2 | "txReplaced": { 3 | "txid": "8913ec7ba0ede285dbd120e46f6d61a28f2903c10814a6f6c4f97d0edf3e1f46" 4 | }} -------------------------------------------------------------------------------- /frontend/cypress/fixtures/mainnet_rbf_new.json: -------------------------------------------------------------------------------- 1 | { 2 | "replacements": { 3 | "tx": { 4 | "txid": "f22735aaa8eb84bcae3e7705f78609c6f5f0cd7dfc34ae03094e61f2dab0cc64", 5 | "fee": 13843, 6 | "vsize": 109.25, 7 | "value": 253003805, 8 | "rate": 36.04666732302845, 9 | "rbf": true 10 | }, 11 | "time": 1683865345, 12 | "fullRbf": false, 13 | "replaces": [ 14 | { 15 | "tx": { 16 | "txid": "21518a98d1aa9df524865d2f88c578499f524eb1d0c4d3e70312ab863508692f", 17 | "fee": 8794, 18 | "vsize": 109.25, 19 | "value": 253008854, 20 | "rate": 35.05247612484001, 21 | "rbf": true 22 | }, 23 | "time": 1683864993, 24 | "interval": 352, 25 | "fullRbf": false, 26 | "replaces": [] 27 | } 28 | ] 29 | }, 30 | "replaces": null 31 | } 32 | -------------------------------------------------------------------------------- /frontend/cypress/support/e2e.ts: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // When a command from ./commands is ready to use, import with `import './commands'` syntax 17 | import 'cypress-wait-until'; 18 | import './commands'; 19 | import failOnConsoleError from 'cypress-fail-on-console-error'; 20 | 21 | failOnConsoleError(); -------------------------------------------------------------------------------- /frontend/cypress/support/index.d.ts: -------------------------------------------------------------------------------- 1 | 2 | /// 3 | declare namespace Cypress { 4 | interface Chainable { 5 | waitForSkeletonGone(): Chainable 6 | waitForPageIdle(): Chainable 7 | mockMempoolSocket(): Chainable 8 | changeNetwork(network: "testnet"|"signet"|"liquid"|"mainnet"): Chainable 9 | } 10 | } -------------------------------------------------------------------------------- /frontend/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "include": ["**/*.ts"], 4 | "compilerOptions": { 5 | "types": ["cypress", "node", "cypress-wait-until"], 6 | "lib": ["es2015", "dom"], 7 | "allowJs": true, 8 | "noEmit": true, 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/frontend: -------------------------------------------------------------------------------- 1 | . -------------------------------------------------------------------------------- /frontend/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'jest-preset-angular', 3 | // testMatch: ['**/*.jest.ts'], 4 | testPathIgnorePatterns: ['/cypress/'], 5 | setupFilesAfterEnv: ['/setup-jest.ts'] 6 | }; -------------------------------------------------------------------------------- /frontend/mempool-frontend-config.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "TESTNET_ENABLED": false, 3 | "SIGNET_ENABLED": false, 4 | "LIQUID_ENABLED": false, 5 | "LIQUID_TESTNET_ENABLED": false, 6 | "ITEMS_PER_PAGE": 10, 7 | "KEEP_BLOCKS_AMOUNT": 8, 8 | "NGINX_PROTOCOL": "http", 9 | "NGINX_HOSTNAME": "127.0.0.1", 10 | "NGINX_PORT": "80", 11 | "BLOCK_WEIGHT_UNITS": 4000000, 12 | "MEMPOOL_BLOCKS_AMOUNT": 8, 13 | "BASE_MODULE": "mempool", 14 | "MEMPOOL_WEBSITE_URL": "https://mempool.space", 15 | "LIQUID_WEBSITE_URL": "https://liquid.network", 16 | "MINING_DASHBOARD": true, 17 | "AUDIT": false, 18 | "MAINNET_BLOCK_AUDIT_START_HEIGHT": 0, 19 | "TESTNET_BLOCK_AUDIT_START_HEIGHT": 0, 20 | "SIGNET_BLOCK_AUDIT_START_HEIGHT": 0, 21 | "LIGHTNING": false, 22 | "HISTORICAL_PRICE": true, 23 | "ADDITIONAL_CURRENCIES": false, 24 | "ACCELERATOR": false, 25 | "PUBLIC_ACCELERATIONS": false 26 | } 27 | -------------------------------------------------------------------------------- /frontend/proxy.conf.staging.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | let PROXY_CONFIG = require('./proxy.conf'); 4 | 5 | PROXY_CONFIG.forEach(entry => { 6 | entry.target = entry.target.replace("mempool.space", "mempool-staging.fra.mempool.space"); 7 | entry.target = entry.target.replace("liquid.network", "liquid-staging.fra.mempool.space"); 8 | }); 9 | 10 | module.exports = PROXY_CONFIG; 11 | -------------------------------------------------------------------------------- /frontend/setup-jest.ts: -------------------------------------------------------------------------------- 1 | import 'jest-preset-angular/setup-jest'; 2 | import '@angular/localize/init'; 3 | 4 | -------------------------------------------------------------------------------- /frontend/shims.ts: -------------------------------------------------------------------------------- 1 | export class ResizeObserver { 2 | constructor() {} 3 | 4 | disconnect() {} 5 | observe() {} 6 | unobserve() {} 7 | } -------------------------------------------------------------------------------- /frontend/src/app/app.module.server.ts: -------------------------------------------------------------------------------- 1 | import { HTTP_INTERCEPTORS } from '@angular/common/http'; 2 | import { NgModule } from '@angular/core'; 3 | import { ServerModule } from '@angular/platform-server'; 4 | 5 | import { ZONE_SERVICE } from './injection-tokens'; 6 | import { AppModule } from './app.module'; 7 | import { AppComponent } from './components/app/app.component'; 8 | import { HttpCacheInterceptor } from './services/http-cache.interceptor'; 9 | import { ZoneService } from './services/zone.service'; 10 | 11 | 12 | @NgModule({ 13 | imports: [ 14 | AppModule, 15 | ServerModule, 16 | ], 17 | providers: [ 18 | { provide: HTTP_INTERCEPTORS, useClass: HttpCacheInterceptor, multi: true }, 19 | { provide: ZONE_SERVICE, useClass: ZoneService }, 20 | ], 21 | bootstrap: [AppComponent], 22 | }) 23 | export class AppServerModule {} -------------------------------------------------------------------------------- /frontend/src/app/app.preloading-strategy.ts: -------------------------------------------------------------------------------- 1 | import { PreloadingStrategy, Route } from '@angular/router'; 2 | import { Observable, timer, mergeMap, of } from 'rxjs'; 3 | 4 | export class AppPreloadingStrategy implements PreloadingStrategy { 5 | preload(route: Route, load: Function): Observable { 6 | return route.data && route.data.preload 7 | ? timer(1500).pipe(mergeMap(() => load())) 8 | : of(null); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/app/bitcoin-graphs.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | import { MasterPageComponent } from './components/master-page/master-page.component'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | component: MasterPageComponent, 10 | loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule), 11 | data: { preload: true }, 12 | } 13 | ]; 14 | 15 | @NgModule({ 16 | imports: [ 17 | RouterModule.forChild(routes) 18 | ], 19 | exports: [ 20 | RouterModule 21 | ] 22 | }) 23 | export class BitcoinGraphsRoutingModule { } 24 | 25 | @NgModule({ 26 | imports: [ 27 | CommonModule, 28 | BitcoinGraphsRoutingModule, 29 | ], 30 | }) 31 | export class BitcoinGraphsModule { } 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /frontend/src/app/components/about/about-sponsors.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { EnterpriseService } from '../../services/enterprise.service'; 3 | 4 | @Component({ 5 | selector: 'app-about-sponsors', 6 | templateUrl: './about-sponsors.component.html', 7 | styleUrls: ['./about-sponsors.component.scss'], 8 | }) 9 | export class AboutSponsorsComponent { 10 | @Input() host = 'https://mempool.space'; 11 | @Input() context = 'about'; 12 | 13 | constructor(private enterpriseService: EnterpriseService) { 14 | } 15 | 16 | onSponsorClick(e): boolean { 17 | this.enterpriseService.goal(5); 18 | return true; 19 | } 20 | 21 | onEnterpriseClick(e): boolean { 22 | this.enterpriseService.goal(6); 23 | return true; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.scss: -------------------------------------------------------------------------------- 1 | .close-button { 2 | position: absolute; 3 | top: 0.5em; 4 | right: 0.5em; 5 | } 6 | 7 | .estimating { 8 | color: var(--green) 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/app/components/address-labels/address-labels.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 11 |   12 |
13 |
14 | 15 | 16 | {{ label }} 20 | -------------------------------------------------------------------------------- /frontend/src/app/components/address-labels/address-labels.component.scss: -------------------------------------------------------------------------------- 1 | .badge { 2 | margin-right: 2px; 3 | } 4 | 5 | .badge-positioner { 6 | position: absolute; 7 | } -------------------------------------------------------------------------------- /frontend/src/app/components/address/address-preview.component.scss: -------------------------------------------------------------------------------- 1 | .title-wrapper { 2 | padding: 0 15px; 3 | } 4 | 5 | .qr-wrapper { 6 | background-color: #fff; 7 | padding: 10px; 8 | padding-bottom: 5px; 9 | display: inline-block; 10 | } 11 | 12 | .qrcode-col { 13 | width: 468px; 14 | min-width: 468px; 15 | flex-grow: 0; 16 | flex-shrink: 0; 17 | text-align: center; 18 | padding: 0; 19 | margin-left: 2px; 20 | margin-right: 15px; 21 | } 22 | 23 | .table-col { 24 | max-width: calc(100% - 470px); 25 | overflow: hidden; 26 | } 27 | 28 | .table { 29 | font-size: 32px; 30 | margin-top: 48px; 31 | 32 | ::ng-deep .symbol { 33 | font-size: 24px; 34 | } 35 | } -------------------------------------------------------------------------------- /frontend/src/app/components/amount/amount.component.scss: -------------------------------------------------------------------------------- 1 | .green-color { 2 | color: var(--green); 3 | } -------------------------------------------------------------------------------- /frontend/src/app/components/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /frontend/src/app/components/app/app.component.scss: -------------------------------------------------------------------------------- 1 | footer { 2 | max-width: 960px; 3 | } 4 | 5 | .logo { 6 | height: 40px; 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/app/components/asset-circulation/asset-circulation.component.html: -------------------------------------------------------------------------------- 1 | 2 | Confidential 3 | 4 | {{ circulating.amount | amountShortener }} 5 | {{ circulating.amount | number: '1.2-2' }} {{ circulating.ticker }} 6 | -------------------------------------------------------------------------------- /frontend/src/app/components/asset-circulation/asset-circulation.component.scss: -------------------------------------------------------------------------------- 1 | .ticker { 2 | color: grey; 3 | } 4 | -------------------------------------------------------------------------------- /frontend/src/app/components/assets/assets-featured/assets-featured.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | import { ApiService } from '../../../services/api.service'; 4 | import { StateService } from '../../../services/state.service'; 5 | 6 | @Component({ 7 | selector: 'app-assets-featured', 8 | templateUrl: './assets-featured.component.html', 9 | styleUrls: ['./assets-featured.component.scss'] 10 | }) 11 | export class AssetsFeaturedComponent implements OnInit { 12 | featuredAssets$: Observable; 13 | 14 | constructor( 15 | private apiService: ApiService, 16 | private stateService: StateService, 17 | ) { } 18 | 19 | ngOnInit(): void { 20 | this.featuredAssets$ = this.apiService.listFeaturedAssets$(this.stateService.network); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /frontend/src/app/components/assets/assets-nav/assets-nav.component.scss: -------------------------------------------------------------------------------- 1 | ul { 2 | margin-bottom: 20px; 3 | float: left; 4 | 5 | } 6 | 7 | form { 8 | float: right; 9 | width: 300px; 10 | @media (max-width: 767.98px) { 11 | width: 90%; 12 | margin-bottom: 15px; 13 | } 14 | } 15 | 16 | @media (max-width: 767.98px) { 17 | .nav-container { 18 | display: flex; 19 | flex-direction: column; 20 | align-items: center; 21 | justify-content: center; 22 | margin: auto; 23 | } 24 | } -------------------------------------------------------------------------------- /frontend/src/app/components/assets/assets.component.scss: -------------------------------------------------------------------------------- 1 | .td-name { 2 | max-width: 200px; 3 | overflow: hidden; 4 | text-overflow: ellipsis; 5 | white-space: nowrap; 6 | } 7 | .title-asset { 8 | h1 { 9 | line-height: 1; 10 | margin: 0px; 11 | padding-bottom: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/app/components/block-view/block-view.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 14 |
15 |
16 | -------------------------------------------------------------------------------- /frontend/src/app/components/block-view/block-view.component.scss: -------------------------------------------------------------------------------- 1 | .block-wrapper { 2 | width: 100vw; 3 | height: 100vh; 4 | background: var(--stat-box-bg); 5 | } 6 | 7 | .block-container { 8 | flex-grow: 0; 9 | flex-shrink: 0; 10 | width: 100vw; 11 | max-width: 100vh; 12 | height: 100vh; 13 | padding: 0; 14 | margin: auto; 15 | display: flex; 16 | justify-content: center; 17 | align-items: center; 18 | 19 | * { 20 | flex-grow: 1; 21 | } 22 | } -------------------------------------------------------------------------------- /frontend/src/app/components/calculator/calculator.component.scss: -------------------------------------------------------------------------------- 1 | .input-group-text { 2 | width: 75px; 3 | } 4 | 5 | .bitcoin-satoshis-text { 6 | font-size: 40px; 7 | } 8 | 9 | .fiat-text { 10 | font-size: 24px; 11 | } 12 | 13 | .symbol { 14 | font-style: italic; 15 | } 16 | 17 | @media (max-width: 767.98px) { 18 | .bitcoin-satoshis-text { 19 | font-size: 30px; 20 | } 21 | } 22 | 23 | .sats { 24 | font-size: 20px; 25 | margin-left: 5px; 26 | } 27 | 28 | .row { 29 | margin: auto; 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/app/components/change/change.component.html: -------------------------------------------------------------------------------- 1 | 2 | ‎{{ change >= 0 ? '+' : '' }}{{ change | amountShortener }}% 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/app/components/change/change.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/change/change.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/change/change.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-change', 5 | templateUrl: './change.component.html', 6 | styleUrls: ['./change.component.scss'], 7 | changeDetection: ChangeDetectionStrategy.OnPush, 8 | }) 9 | export class ChangeComponent implements OnChanges { 10 | @Input() current: number; 11 | @Input() previous: number; 12 | 13 | change: number; 14 | 15 | constructor() { } 16 | 17 | ngOnChanges(): void { 18 | if (!this.previous) { 19 | this.change = 0; 20 | } else { 21 | this.change = (this.current - this.previous) / this.previous * 100; 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/app/components/clipboard/clipboard.component.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /frontend/src/app/components/clipboard/clipboard.component.scss: -------------------------------------------------------------------------------- 1 | .btn-link { 2 | padding: 0.25rem 0 0.1rem 0rem; 3 | line-height: 0; 4 | } 5 | 6 | .padding { 7 | padding-left: 0.4rem; 8 | } 9 | 10 | img { 11 | position: relative; 12 | left: -3px; 13 | } -------------------------------------------------------------------------------- /frontend/src/app/components/difficulty-adjustments-table/difficulty-adjustments-table.component.scss: -------------------------------------------------------------------------------- 1 | .latest-adjustments { 2 | width: 100%; 3 | text-align: left; 4 | table-layout:fixed; 5 | tr, th { 6 | border: 0px; 7 | padding-top: 0.65rem !important; 8 | padding-bottom: 0.7rem !important; 9 | } 10 | td { 11 | border: 0px; 12 | padding-top: 0.71rem !important; 13 | padding-bottom: 0.75rem !important; 14 | width: 25%; 15 | @media (max-width: 376px) { 16 | padding: 0.85rem; 17 | } 18 | } 19 | } 20 | 21 | .date { 22 | @media (min-width: 767px) AND (max-width: 991px) { 23 | display: none; 24 | } 25 | @media (max-width: 500px) { 26 | display: none; 27 | } 28 | } -------------------------------------------------------------------------------- /frontend/src/app/components/difficulty/difficulty-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | .difficulty-tooltip { 2 | position: fixed; 3 | background: color-mix(in srgb, var(--active-bg) 95%, transparent); 4 | border-radius: 4px; 5 | box-shadow: 1px 1px 10px rgba(0,0,0,0.5); 6 | color: var(--tooltip-grey); 7 | padding: 10px 15px; 8 | text-align: left; 9 | pointer-events: none; 10 | max-width: 300px; 11 | min-width: 200px; 12 | text-align: center; 13 | 14 | p { 15 | margin: 0; 16 | white-space: nowrap; 17 | } 18 | } 19 | 20 | .next-block { 21 | text-transform: lowercase; 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/app/components/faucet/faucet.component.scss: -------------------------------------------------------------------------------- 1 | .formGroup { 2 | width: 100%; 3 | } 4 | 5 | .input-group { 6 | display: flex; 7 | flex-wrap: wrap; 8 | align-items: stretch; 9 | justify-content: flex-end; 10 | row-gap: 0.5rem; 11 | gap: 0.5rem; 12 | 13 | .form-control { 14 | min-width: 160px; 15 | flex-grow: 100; 16 | } 17 | 18 | .button-group { 19 | display: flex; 20 | align-items: stretch; 21 | } 22 | 23 | .submit-button, .button-group, .button-group .btn { 24 | flex-grow: 1; 25 | } 26 | 27 | #satoshis::after { 28 | content: 'sats'; 29 | position: absolute; 30 | right: 0.5em; 31 | top: 0; 32 | bottom: 0; 33 | } 34 | } 35 | 36 | .faucet-container { 37 | display: flex; 38 | flex-direction: column; 39 | align-items: center; 40 | justify-content: flex-start; 41 | width: 100%; 42 | max-width: 800px; 43 | margin: auto; 44 | } -------------------------------------------------------------------------------- /frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 |
7 |
8 |
9 |
10 | -------------------------------------------------------------------------------- /frontend/src/app/components/fee-distribution-graph/fee-distribution-graph.component.scss: -------------------------------------------------------------------------------- 1 | .fee-distribution-chart { 2 | margin-top: 0.75rem; 3 | } -------------------------------------------------------------------------------- /frontend/src/app/components/fiat-selector/fiat-selector.component.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | -------------------------------------------------------------------------------- /frontend/src/app/components/fiat-selector/fiat-selector.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/fiat-selector/fiat-selector.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/graphs/graphs.component.scss: -------------------------------------------------------------------------------- 1 | .menu { 2 | flex-grow: 1; 3 | padding: 0 35px; 4 | @media (min-width: 576px) { 5 | max-width: 600px; 6 | } 7 | 8 | & > * { 9 | margin: 0; 10 | margin-inline-end: 0.25rem; 11 | &.last-child { 12 | margin-inline-end: 0; 13 | } 14 | margin-bottom: 5px; 15 | } 16 | } -------------------------------------------------------------------------------- /frontend/src/app/components/graphs/graphs.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { StateService } from '../../services/state.service'; 3 | import { WebsocketService } from '../../services/websocket.service'; 4 | 5 | @Component({ 6 | selector: 'app-graphs', 7 | templateUrl: './graphs.component.html', 8 | styleUrls: ['./graphs.component.scss'], 9 | }) 10 | export class GraphsComponent implements OnInit { 11 | flexWrap = false; 12 | 13 | constructor( 14 | public stateService: StateService, 15 | private websocketService: WebsocketService 16 | ) { } 17 | 18 | ngOnInit(): void { 19 | this.websocketService.want(['blocks']); 20 | 21 | if (this.stateService.env.ACCELERATOR === true && (this.stateService.env.MINING_DASHBOARD === true || this.stateService.env.LIGHTNING === true)) { 22 | this.flexWrap = true; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/app/components/incoming-transactions-graph/incoming-transactions-graph.component.html: -------------------------------------------------------------------------------- 1 |
3 |
4 |
5 |
6 |
-------------------------------------------------------------------------------- /frontend/src/app/components/indexing-progress/indexing-progress.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/app/components/indexing-progress/indexing-progress.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-indexing-progress', 5 | templateUrl: './indexing-progress.component.html', 6 | changeDetection: ChangeDetectionStrategy.OnPush 7 | }) 8 | export class IndexingProgressComponent implements OnInit { 9 | constructor( 10 | ) {} 11 | 12 | ngOnInit() { 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/app/components/language-selector/language-selector.component.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | -------------------------------------------------------------------------------- /frontend/src/app/components/language-selector/language-selector.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/language-selector/language-selector.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/lbtc-pegs-graph/lbtc-pegs-graph.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
-------------------------------------------------------------------------------- /frontend/src/app/components/liquid-reserves-audit/federation-wallet/federation-wallet.component.scss: -------------------------------------------------------------------------------- 1 | ul { 2 | margin-bottom: 20px; 3 | } 4 | 5 | @media (max-width: 767.98px) { 6 | .nav-container { 7 | display: flex; 8 | flex-direction: column; 9 | align-items: center; 10 | justify-content: center; 11 | margin: auto; 12 | } 13 | } 14 | 15 | @media (max-width: 436px) { 16 | .nav-link { 17 | padding: 0.8rem 0.8rem; 18 | font-size: 0.8rem; 19 | } 20 | } -------------------------------------------------------------------------------- /frontend/src/app/components/liquid-reserves-audit/federation-wallet/federation-wallet.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { SeoService } from '../../../services/seo.service'; 3 | 4 | @Component({ 5 | selector: 'app-federation-wallet', 6 | templateUrl: './federation-wallet.component.html', 7 | styleUrls: ['./federation-wallet.component.scss'] 8 | }) 9 | export class FederationWalletComponent implements OnInit { 10 | 11 | constructor( 12 | private seoService: SeoService 13 | ) { 14 | this.seoService.setTitle($localize`:@@993e5bc509c26db81d93018e24a6afe6e50cae52:Liquid Federation Wallet`); 15 | } 16 | 17 | ngOnInit(): void { 18 | } 19 | 20 | isExpiredFragment(): boolean { 21 | return location.hash === '#expired'; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | import { PegsVolume } from '../../../interfaces/node-api.interface'; 4 | 5 | @Component({ 6 | selector: 'app-recent-pegs-stats', 7 | templateUrl: './recent-pegs-stats.component.html', 8 | styleUrls: ['./recent-pegs-stats.component.scss'], 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class RecentPegsStatsComponent implements OnInit { 12 | @Input() pegsVolume$: Observable; 13 | 14 | constructor() { } 15 | 16 | ngOnInit(): void { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/app/components/liquid-reserves-audit/reserves-ratio/reserves-ratio.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | -------------------------------------------------------------------------------- /frontend/src/app/components/liquid-reserves-audit/reserves-ratio/reserves-ratio.component.scss: -------------------------------------------------------------------------------- 1 | .loadingGraphs { 2 | position: absolute; 3 | top: 50%; 4 | left: calc(50% - 16px); 5 | z-index: 100; 6 | } -------------------------------------------------------------------------------- /frontend/src/app/components/loading-indicator/loading-indicator.component.html: -------------------------------------------------------------------------------- 1 |
2 | {{ this.label }} ({{ progress }}%) 3 |
-------------------------------------------------------------------------------- /frontend/src/app/components/loading-indicator/loading-indicator.component.scss: -------------------------------------------------------------------------------- 1 | .sticky-loading { 2 | position: absolute; 3 | right: 10px; 4 | z-index: 100; 5 | font-size: 14px; 6 | @media (width >= 992px) { 7 | left: 32px; 8 | top: 55px; 9 | } 10 | @media (576px <= width < 992px ) { 11 | left: 18px; 12 | top: 55px; 13 | } 14 | @media (width <= 575px) { 15 | left: 18px; 16 | top: 100px; 17 | } 18 | } -------------------------------------------------------------------------------- /frontend/src/app/components/master-page-preview/preview-title.component.html: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | Liquid 5 | Liquid 6 | Bitcoin 7 | 8 | 9 | 10 |

-------------------------------------------------------------------------------- /frontend/src/app/components/master-page-preview/preview-title.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { StateService } from '../../services/state.service'; 3 | import { Observable, merge, of } from 'rxjs'; 4 | 5 | @Component({ 6 | selector: 'app-preview-title', 7 | templateUrl: './preview-title.component.html', 8 | styleUrls: [], 9 | }) 10 | export class PreviewTitleComponent implements OnInit { 11 | network$: Observable; 12 | 13 | constructor( 14 | public stateService: StateService, 15 | ) { } 16 | 17 | ngOnInit() { 18 | this.network$ = merge(of(''), this.stateService.networkChanged$); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/app/components/mempool-block-overview/mempool-block-overview.component.html: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /frontend/src/app/components/mempool-block-view/mempool-block-view.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
-------------------------------------------------------------------------------- /frontend/src/app/components/mempool-block-view/mempool-block-view.component.scss: -------------------------------------------------------------------------------- 1 | .block-wrapper { 2 | width: 100vw; 3 | height: 100vh; 4 | background: var(--stat-box-bg); 5 | } 6 | 7 | .block-container { 8 | flex-grow: 0; 9 | flex-shrink: 0; 10 | width: 100vw; 11 | max-width: 100vh; 12 | height: 100vh; 13 | padding: 0; 14 | margin: auto; 15 | display: flex; 16 | justify-content: center; 17 | align-items: center; 18 | 19 | * { 20 | flex-grow: 1; 21 | } 22 | } -------------------------------------------------------------------------------- /frontend/src/app/components/mempool-block/mempool-block.component.scss: -------------------------------------------------------------------------------- 1 | .progress { 2 | background-color: var(--secondary); 3 | position: relative; 4 | top: 5px; 5 | } 6 | 7 | .fiat { 8 | font-size: 13px; 9 | display: inline-block; 10 | margin-left: 10px; 11 | } 12 | 13 | .table { 14 | tr td { 15 | &:last-child{ 16 | text-align: right; 17 | @media (min-width: 992px) { 18 | text-align: left; 19 | } 20 | } 21 | } 22 | } 23 | 24 | h1 { 25 | margin: 0px; 26 | padding: 0px; 27 | line-height: 1; 28 | @media (min-width: 576px) { 29 | float: left; 30 | } 31 | } 32 | 33 | .chart-container{ 34 | margin: 20px auto; 35 | @media (min-width: 768px) { 36 | margin: auto; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /frontend/src/app/components/mempool-graph/mempool-graph.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
-------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/cat21-collab/cat21-collab.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/ordinals/cat21-collab/cat21-collab.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/cat21-collab/cat21-collab.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; 2 | 3 | import { SeoService } from '../../../services/seo.service'; 4 | 5 | 6 | @Component({ 7 | selector: 'app-cat21-collab', 8 | templateUrl: './cat21-collab.component.html', 9 | styleUrls: ['./cat21-collab.component.scss'], 10 | changeDetection: ChangeDetectionStrategy.OnPush 11 | }) 12 | export class Cat21CollabComponent { 13 | 14 | seoService = inject(SeoService); 15 | 16 | ngOnInit() { 17 | this.seoService.setTitle('CAT-21: Invitation to Collaborate'); 18 | this.seoService.setDescription('We are thrilled to offer you and your community the chance to participate in a new, fun protocol built on top of Bitcoin ordinals – created by the maker of Ordpool!'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/cat21-mint/cat21-mint.component.scss: -------------------------------------------------------------------------------- 1 | 2 | .shape-border { 3 | background-color: #181b2d; 4 | border-radius: 4px; 5 | } 6 | 7 | .shape-border.selected { 8 | 9 | background-color: #276134; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/cat21-mint/countdown-timer.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |

CCC (Colossal Cat Countdown)

5 |

{{ countdown }}

6 | 7 | 8 |
9 |
10 | Don't sleep on the cats!
11 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/cat21-mint/countdown-timer.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/ordinals/cat21-mint/countdown-timer.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/cat21-whitelist-checker/cat21-whitelist-checker.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/ordinals/cat21-whitelist-checker/cat21-whitelist-checker.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/atomical-viewer/atomical-viewer.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | ⚛ Atomical
4 |
5 | 6 | This transaction reveals an Atomical!
7 | Unfortunately, we do not yet have a parser for Atomicals.
8 | If you can contribute, please send a 🧡 pull request (Github) to our repository. 9 | 10 |
11 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/atomical-viewer/atomical-viewer.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/ordinals/digital-artifact-viewer/atomical-viewer/atomical-viewer.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/cat21-viewer/capitalize-first.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | /** 4 | * A pipe that transforms the first letter of a string to uppercase. 5 | * It leaves the rest of the string unchanged. 6 | */ 7 | @Pipe({ 8 | name: 'capitalizeFirst' 9 | }) 10 | export class CapitalizeFirstPipe implements PipeTransform { 11 | 12 | /** 13 | * Transforms the input string by capitalizing its first letter. 14 | * @param value The string to be transformed. 15 | * @returns The transformed string with the first letter in uppercase. If the input is falsy, it returns the input as is. 16 | */ 17 | transform(value: string): string { 18 | if (!value) return value; 19 | 20 | return value.charAt(0).toUpperCase() + value.slice(1); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/cat21-viewer/cat21-viewer.component.scss: -------------------------------------------------------------------------------- 1 | .cat-container { 2 | max-width: 600px; 3 | background-color: #11131f; 4 | } 5 | 6 | i.colorBlock { 7 | display: inline-block; 8 | width: 12px; 9 | height: 12px; 10 | border: 1px solid white; 11 | } 12 | 13 | // same as in transaction.component.scss 14 | .table { 15 | tr td { 16 | padding: 0.75rem 0.5rem; 17 | @media (min-width: 576px) { 18 | padding: 0.75rem 0.75rem; 19 | } 20 | &:last-child { 21 | text-align: right; 22 | @media (min-width: 850px) { 23 | text-align: left; 24 | } 25 | } 26 | .btn { 27 | display: block; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/code-viewer/code-viewer.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/code-viewer/code-viewer.component.scss: -------------------------------------------------------------------------------- 1 | .formatedText { 2 | max-height: 600px; 3 | overflow: scroll; 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/digital-artifact-viewer.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/ordinals/digital-artifact-viewer/digital-artifact-viewer.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/inscription-viewer/inscription-viewer.component.scss: -------------------------------------------------------------------------------- 1 | 2 | // as seen in transactions-list.component.scss 3 | .address { 4 | font-family: monospace; 5 | 6 | // same as for tr's in global stylesheet 7 | white-space: nowrap; 8 | } 9 | 10 | .smaller-text { 11 | font-size: 12px; 12 | @media (min-width: 576px) { 13 | font-size: 14px !important; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/json-viewer/json-viewer.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/json-viewer/json-viewer.component.scss: -------------------------------------------------------------------------------- 1 | .formatedText { 2 | max-height: 600px; 3 | overflow: scroll; 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/metadata-viewer/metadata-viewer.component.scss: -------------------------------------------------------------------------------- 1 | .metadata-container { 2 | padding: 6px; 3 | display: grid; 4 | grid-template-columns: max-content auto; 5 | gap: 6px; 6 | padding-left: 6px; 7 | border-left: 1px solid #839496; 8 | } 9 | 10 | .row-item { 11 | display: contents; 12 | } 13 | 14 | .key { 15 | font-weight: bold; 16 | grid-column: 1; 17 | } 18 | 19 | .value, .array-item, .nested-object, .list-unstyled { 20 | grid-column: 2; 21 | } 22 | 23 | .nested-object, .list-unstyled { 24 | padding-left: 6px; 25 | } 26 | 27 | .list-unstyled { 28 | list-style-type: none; 29 | padding-left: 0; 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/preview-viewer/preview-viewer.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/preview-viewer/preview-viewer.component.scss: -------------------------------------------------------------------------------- 1 | iframe { 2 | aspect-ratio: 1 / 1; 3 | border: none; 4 | width: 100%; 5 | max-width: 600px; 6 | } 7 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/runestone-viewer/big-int-formatter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({name: 'bigIntFormatter'}) 4 | export class BigIntFormatterPipe implements PipeTransform { 5 | transform(value: bigint, locale: string = 'en-US'): string { 6 | return value.toLocaleString(locale); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/src20-viewer/src20-viewer.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | SRC-20 (Stamps)
4 |
5 | 6 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/digital-artifact-viewer/src20-viewer/src20-viewer.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/ordinals/digital-artifact-viewer/src20-viewer/src20-viewer.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/full-number.validator.ts: -------------------------------------------------------------------------------- 1 | import { AbstractControl, ValidatorFn } from '@angular/forms'; 2 | 3 | // Validator function that allows only full numbers 4 | export function fullNumberValidator(): ValidatorFn { 5 | return (control: AbstractControl): {[key: string]: any} | null => { 6 | // Check if the control value is not null or empty before testing 7 | if (control.value !== null && control.value !== '') { 8 | // Test if the value is an integer 9 | const isFullNumber = Number.isInteger(Number(control.value)); 10 | // Return null if valid (is an integer), or an object if invalid 11 | return isFullNumber ? null : { 'notFullNumber': { value: control.value } }; 12 | } 13 | return null; // Consider null or empty string as valid 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/inscription-accelerator/inscription-accelerator.component.scss: -------------------------------------------------------------------------------- 1 | .text-decoration-underline { 2 | text-decoration: underline; 3 | 4 | &:hover { 5 | text-decoration: none; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/wallet-connect/limit-array.spec.ts: -------------------------------------------------------------------------------- 1 | import { limitArray } from './limit-array'; 2 | 3 | describe('limitArray', () => { 4 | it('should return the first N elements if the array has more than N elements', () => { 5 | const array = [1, 2, 3, 4, 5]; 6 | const N = 3; 7 | const result = limitArray(array, N); 8 | expect(result).toEqual([1, 2, 3]); 9 | }); 10 | 11 | it('should return the input array if it has less than N elements', () => { 12 | const array = [1, 2, 3]; 13 | const N = 5; 14 | const result = limitArray(array, N); 15 | expect(result).toEqual([1, 2, 3]); 16 | }); 17 | 18 | it('should return the input array if it has exactly N elements', () => { 19 | const array = [1, 2, 3, 4, 5]; 20 | const N = 5; 21 | const result = limitArray(array, N); 22 | expect(result).toEqual([1, 2, 3, 4, 5]); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/wallet-connect/limit-array.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns an array that contains the first N elements of the input array. 3 | * If the input array has less than N elements, it returns the input array. 4 | * 5 | * @param {T[]} array - The input array. 6 | * @param {number} N - The number of elements to keep. 7 | * @return {T[]} The array containing the first N elements of the input array. 8 | * @template T 9 | */ 10 | export function limitArray(array: T[], N: number): T[] { 11 | return array.length > N ? array.slice(0, N) : array; 12 | } 13 | -------------------------------------------------------------------------------- /frontend/src/app/components/ordinals/wallet-connect/wallet-connect.component.scss: -------------------------------------------------------------------------------- 1 | .my-flex-container li { 2 | display: flex; 3 | align-items: center; 4 | } 5 | 6 | .label { 7 | width: 150px; 8 | flex-shrink: 0; /* Prevents the label from shrinking */ 9 | } 10 | 11 | .address { 12 | flex-grow: 1; /* Allows the address to take up remaining space */ 13 | } 14 | 15 | ::ng-deep .walletConnectPopover { 16 | min-width: 380px !important; 17 | font-size: 1rem; 18 | 19 | .popover-header { 20 | border-bottom: 1px solid #f8f9fa; // $light 21 | } 22 | } 23 | 24 | .btn-testnet { 25 | background-color: #5fd15c; 26 | } 27 | -------------------------------------------------------------------------------- /frontend/src/app/components/privacy-policy/privacy-policy.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/privacy-policy/privacy-policy.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/push-transaction/push-transaction.component.html: -------------------------------------------------------------------------------- 1 |
2 |

Broadcast Transaction

3 | 4 |
5 |
6 | 7 |
8 | 9 |

{{ error }}

{{ txId }} 10 |
11 | 12 |
-------------------------------------------------------------------------------- /frontend/src/app/components/push-transaction/push-transaction.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/push-transaction/push-transaction.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/qrcode/qrcode.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | -------------------------------------------------------------------------------- /frontend/src/app/components/qrcode/qrcode.component.scss: -------------------------------------------------------------------------------- 1 | img { 2 | position: absolute; 3 | top: 67px; 4 | left: 67px; 5 | width: 65px; 6 | height: 65px; 7 | } 8 | 9 | .holder { 10 | position: relative; 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | -------------------------------------------------------------------------------- /frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/rbf-list/rbf-list.component.scss: -------------------------------------------------------------------------------- 1 | .spinner-border { 2 | height: 25px; 3 | width: 25px; 4 | margin-top: 13px; 5 | } 6 | 7 | .rbf-trees { 8 | .info { 9 | display: flex; 10 | flex-direction: row; 11 | justify-content: space-between; 12 | align-items: baseline; 13 | margin: 0; 14 | margin-bottom: 0.5em; 15 | 16 | .type { 17 | .badge { 18 | margin-left: .5em; 19 | } 20 | } 21 | } 22 | 23 | .tree { 24 | margin-bottom: 1em; 25 | } 26 | 27 | .timeline-wrapper.mined { 28 | border: solid 4px var(--success); 29 | } 30 | 31 | .no-replacements { 32 | margin: 1em; 33 | text-align: center; 34 | } 35 | } -------------------------------------------------------------------------------- /frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | .rbf-tooltip { 2 | position: fixed; 3 | z-index: 3; 4 | background: color-mix(in srgb, var(--active-bg) 95%, transparent); 5 | border-radius: 4px; 6 | box-shadow: 1px 1px 10px rgba(0,0,0,0.5); 7 | color: var(--tooltip-grey); 8 | display: flex; 9 | flex-direction: column; 10 | justify-content: space-between; 11 | padding: 10px 15px; 12 | text-align: left; 13 | pointer-events: none; 14 | 15 | .badge { 16 | margin-right: 1em; 17 | &:last-child { 18 | margin-right: 0; 19 | } 20 | } 21 | } 22 | 23 | .td-width { 24 | padding-right: 10px; 25 | } -------------------------------------------------------------------------------- /frontend/src/app/components/search-form/search-results/search-results.component.scss: -------------------------------------------------------------------------------- 1 | .card-title { 2 | color: var(--title-fg); 3 | font-size: 10px; 4 | margin-bottom: 4px; 5 | font-size: 1rem; 6 | 7 | margin-left: 10px; 8 | } 9 | 10 | .danger { 11 | color: var(--red); 12 | } 13 | 14 | .dropdown-menu { 15 | position: absolute; 16 | top: 42px; 17 | left: 0px; 18 | box-shadow: 0.125rem 0.125rem 0.25rem rgba(0,0,0,0.075); 19 | width: 100%; 20 | } 21 | 22 | .inactive { 23 | opacity: 0.2; 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/app/components/server-health/server-status.component.html: -------------------------------------------------------------------------------- 1 |
2 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 |
17 | -------------------------------------------------------------------------------- /frontend/src/app/components/server-health/server-status.component.scss: -------------------------------------------------------------------------------- 1 | .tomahawk { 2 | .links { 3 | text-align: right; 4 | margin-inline-end: 1em; 5 | 6 | a, span { 7 | margin-left: 1em; 8 | } 9 | } 10 | 11 | .mempoolStatus { 12 | width: 100%; 13 | height: 270px; 14 | border: none; 15 | } 16 | 17 | .hostLink { 18 | text-align: center; 19 | margin: auto; 20 | margin-top: 1em; 21 | } 22 | } -------------------------------------------------------------------------------- /frontend/src/app/components/status-view/status-view.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /frontend/src/app/components/status-view/status-view.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { WebsocketService } from '../../services/websocket.service'; 3 | 4 | @Component({ 5 | selector: 'app-status-view', 6 | templateUrl: './status-view.component.html' 7 | }) 8 | export class StatusViewComponent implements OnInit { 9 | constructor( 10 | private websocketService: WebsocketService, 11 | ) { } 12 | 13 | ngOnInit() { 14 | this.websocketService.want(['mempool-blocks', 'stats', 'blocks']); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/app/components/svg-images/svg-images.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-svg-images', 5 | templateUrl: './svg-images.component.html', 6 | changeDetection: ChangeDetectionStrategy.OnPush, 7 | }) 8 | export class SvgImagesComponent { 9 | randomId = Math.floor(Math.random() * 10000); 10 | @Input() name: string; 11 | @Input() class: string; 12 | @Input() style: string; 13 | @Input() width: string; 14 | @Input() height: string; 15 | @Input() viewBox: string; 16 | @Input() fill: string; 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/app/components/television/television.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 12 |
13 |
14 |
15 | 16 |
17 | 18 | 19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /frontend/src/app/components/terms-of-service/terms-of-service.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/terms-of-service/terms-of-service.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/terms-of-service/terms-of-service.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { Routes, RouterModule } from '@angular/router'; 4 | import { TermsOfServiceComponent } from './terms-of-service.component'; 5 | import { SharedModule } from '../../shared/shared.module'; 6 | 7 | const routes: Routes = [ 8 | { 9 | path: '', 10 | component: TermsOfServiceComponent, 11 | } 12 | ]; 13 | 14 | @NgModule({ 15 | imports: [ 16 | RouterModule.forChild(routes) 17 | ], 18 | exports: [ 19 | RouterModule 20 | ] 21 | }) 22 | export class TermsModule { } 23 | 24 | @NgModule({ 25 | imports: [ 26 | CommonModule, 27 | TermsModule, 28 | SharedModule, 29 | ], 30 | declarations: [ 31 | TermsOfServiceComponent, 32 | ] 33 | }) 34 | export class TermsOfServiceModule { } 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /frontend/src/app/components/test-transactions/test-transactions.component.scss: -------------------------------------------------------------------------------- 1 | .accept-results { 2 | td, th { 3 | &.allowed { 4 | width: 10%; 5 | text-align: center; 6 | } 7 | &.txid { 8 | width: 50%; 9 | } 10 | &.rate { 11 | width: 20%; 12 | text-align: right; 13 | white-space: wrap; 14 | } 15 | &.reason { 16 | width: 20%; 17 | text-align: right; 18 | white-space: wrap; 19 | } 20 | } 21 | 22 | @media (max-width: 950px) { 23 | table-layout: auto; 24 | 25 | td, th { 26 | &.allowed { 27 | width: 100px; 28 | } 29 | &.txid { 30 | max-width: 200px; 31 | } 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /frontend/src/app/components/theme-selector/theme-selector.component.html: -------------------------------------------------------------------------------- 1 |
2 | 7 |
8 | -------------------------------------------------------------------------------- /frontend/src/app/components/theme-selector/theme-selector.component.scss: -------------------------------------------------------------------------------- 1 | .custom-select { 2 | width: 100px; 3 | } 4 | -------------------------------------------------------------------------------- /frontend/src/app/components/tracker/tracker-bar.component.html: -------------------------------------------------------------------------------- 1 |
2 |
Sent
3 |
4 |
Pending
5 |
6 |
Soon
7 |
8 |
Next block
9 |
10 |
Confirmed
11 |
-------------------------------------------------------------------------------- /frontend/src/app/components/trademark-policy/trademark-policy.component.scss: -------------------------------------------------------------------------------- 1 | .trademark-policy { 2 | .logo { 3 | height: 62.5px; 4 | width: 250px; 5 | margin: 10px; 6 | } 7 | .circle { 8 | margin-top: -50px; 9 | margin-bottom: -30px; 10 | } 11 | .circle:before { 12 | content: ' \25CF'; 13 | font-size: 250px; 14 | } 15 | ol { 16 | list-style-type: upper-roman; 17 | } 18 | ol li { 19 | font-size: 1.75rem; 20 | } 21 | ol ol { 22 | list-style-type: lower-alpha; 23 | } 24 | ol ol li { 25 | font-size: 1.25rem; 26 | } 27 | ol ol ol { 28 | list-style-type: lower-roman; 29 | } 30 | ol ol ol li { 31 | font-size: 1.15rem; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /frontend/src/app/components/twitter-widget/twitter-widget.component.html: -------------------------------------------------------------------------------- 1 | @if (loading) { 2 |
3 |
4 |
5 | } @else if (error) { 6 |
7 | failed to load X timeline 8 |
9 | } 10 | 16 | 17 | -------------------------------------------------------------------------------- /frontend/src/app/components/twitter-widget/twitter-widget.component.scss: -------------------------------------------------------------------------------- 1 | .spinner-wrapper, .error-wrapper { 2 | position: absolute; 3 | left: 0; 4 | right: 0; 5 | top: 0; 6 | bottom: 0; 7 | display: flex; 8 | justify-content: center; 9 | align-items: center; 10 | } -------------------------------------------------------------------------------- /frontend/src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.scss: -------------------------------------------------------------------------------- 1 | .bowtie-graph-tooltip { 2 | position: absolute; 3 | background: color-mix(in srgb, var(--active-bg) 95%, transparent); 4 | border-radius: 4px; 5 | box-shadow: 1px 1px 10px rgba(0,0,0,0.5); 6 | color: var(--tooltip-grey); 7 | padding: 10px 15px; 8 | text-align: left; 9 | pointer-events: none; 10 | max-width: 350px; 11 | 12 | p { 13 | margin: 0; 14 | white-space: nowrap; 15 | } 16 | 17 | .address { 18 | width: 100%; 19 | max-width: 100%; 20 | } 21 | } -------------------------------------------------------------------------------- /frontend/src/app/components/tx-bowtie-graph/tx-bowtie.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { SharedModule } from '../../shared/shared.module'; 4 | import { TxBowtieGraphComponent } from '../tx-bowtie-graph/tx-bowtie-graph.component'; 5 | import { TxBowtieGraphTooltipComponent } from '../tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component'; 6 | 7 | 8 | @NgModule({ 9 | imports: [ 10 | CommonModule, 11 | SharedModule, 12 | ], 13 | declarations: [ 14 | TxBowtieGraphComponent, 15 | TxBowtieGraphTooltipComponent, 16 | ], 17 | exports: [ 18 | TxBowtieGraphComponent, 19 | TxBowtieGraphTooltipComponent, 20 | ] 21 | }) 22 | export class TxBowtieModule { } 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /frontend/src/app/components/tx-features/tx-features.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/components/tx-features/tx-features.component.scss -------------------------------------------------------------------------------- /frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.html: -------------------------------------------------------------------------------- 1 | Optimal 2 | Overpaid {{ overpaidTimes }}x 3 | Overpaid {{ overpaidTimes }}x 4 | -------------------------------------------------------------------------------- /frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.scss: -------------------------------------------------------------------------------- 1 | .badge { 2 | position: relative; 3 | top: -1px; 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/app/data-cy.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, ElementRef, Renderer2 } from '@angular/core'; 2 | import { environment } from '../environments/environment'; 3 | 4 | @Directive({ 5 | selector: '[data-cy]' 6 | }) 7 | export class DataCyDirective { 8 | constructor(private el: ElementRef, private renderer: Renderer2) { 9 | if (environment.production) { 10 | renderer.removeAttribute(el.nativeElement, 'data-cy'); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/app/docs/api-docs/api-docs-nav.component.scss: -------------------------------------------------------------------------------- 1 | p { 2 | color: var(--title-fg); 3 | font-weight: 700; 4 | margin: 10px 0; 5 | margin: 15px 0 10px 0; 6 | } 7 | 8 | a { 9 | color: var(--fg); 10 | text-decoration: none; 11 | display: block; 12 | margin: 5px 0; 13 | cursor: pointer; 14 | } 15 | 16 | #enterprise-cta-desktop { 17 | text-align: center; 18 | padding: 20px; 19 | margin: 20px 20px 20px 0; 20 | background-color: var(--bg); 21 | border-radius: 12px; 22 | } 23 | 24 | #enterprise-cta-desktop p { 25 | margin: 0 auto 16px auto; 26 | color: var(--fg); 27 | font-weight: 400; 28 | } 29 | 30 | #enterprise-cta-desktop a { 31 | display: inline-block; 32 | } 33 | 34 | -------------------------------------------------------------------------------- /frontend/src/app/docs/docs/docs.component.scss: -------------------------------------------------------------------------------- 1 | #main-tab-content { 2 | text-align: left; 3 | padding-top: 1rem; 4 | scroll-behavior: smooth; 5 | margin-bottom: 20px; 6 | } 7 | 8 | #footer { 9 | clear: both; 10 | } 11 | 12 | @media (max-width: 992px) { 13 | .hide-on-mobile { 14 | display: none; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/app/docs/faq-template/faq-template.component.ts: -------------------------------------------------------------------------------- 1 | import { Directive, Input, TemplateRef } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: 'ng-template[type]' 5 | }) 6 | export class FaqTemplateDirective { 7 | @Input() type: string; 8 | constructor(public template: TemplateRef) { } 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/app/fiat/fiat.component.html: -------------------------------------------------------------------------------- 1 | 2 | {{ 3 | ( 4 | (blockConversion.price[currency] > -1 ? blockConversion.price[currency] : null) ?? 5 | (blockConversion.price['USD'] > -1 ? blockConversion.price['USD'] * blockConversion.exchangeRates['USD' + currency] : null) ?? 0 6 | ) * value / 100000000 | fiatCurrency : digitsInfo : currency 7 | }} 8 | 9 | 10 | 11 | 12 | {{ (conversions[currency] > -1 ? conversions[currency] : 0) * value / 100000000 | fiatCurrency : digitsInfo : currency }} 13 | 14 | 15 |   16 | 17 | -------------------------------------------------------------------------------- /frontend/src/app/injection-tokens.ts: -------------------------------------------------------------------------------- 1 | import { InjectionToken } from '@angular/core'; 2 | 3 | export const ZONE_SERVICE = new InjectionToken('ZONE_TASK'); -------------------------------------------------------------------------------- /frontend/src/app/interfaces/services.interface.ts: -------------------------------------------------------------------------------- 1 | import { IconName } from '@fortawesome/fontawesome-common-types'; 2 | 3 | export type MenuItem = { 4 | title: string; 5 | i18n: string; 6 | faIcon: IconName; 7 | link: string; 8 | }; 9 | export type MenuGroup = { 10 | title: string; 11 | i18n: string; 12 | items: MenuItem[]; 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/channel/channel-box/channel-box.component.scss: -------------------------------------------------------------------------------- 1 | .box-top { 2 | display: flex; 3 | } 4 | 5 | .box-left { 6 | width: 100%; 7 | } 8 | 9 | .box-right { 10 | text-align: right; 11 | margin: auto; 12 | white-space: nowrap; 13 | } 14 | 15 | .shared-block { 16 | color: var(--transparent-fg); 17 | font-size: 12px; 18 | } 19 | 20 | @media (max-width: 768px) { 21 | .box { 22 | margin-bottom: 20px; 23 | } 24 | } 25 | 26 | .base-fee { 27 | @media (max-width: 768px) { 28 | padding-right: 0px; 29 | } 30 | } -------------------------------------------------------------------------------- /frontend/src/app/lightning/channel/channel-box/channel-box.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-channel-box', 5 | templateUrl: './channel-box.component.html', 6 | styleUrls: ['./channel-box.component.scss'], 7 | changeDetection: ChangeDetectionStrategy.OnPush, 8 | }) 9 | export class ChannelBoxComponent { 10 | @Input() channel: any; 11 | 12 | constructor() { } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/channel/channel-close-box/channel-close-box.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ChannelCloseBoxComponent } from './channel-close-box.component'; 4 | 5 | describe('ChannelCloseBoxComponent', () => { 6 | let component: ChannelCloseBoxComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ChannelCloseBoxComponent ] 12 | }) 13 | .compileComponents(); 14 | }); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(ChannelCloseBoxComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/channel/closing-type/closing-type.component.html: -------------------------------------------------------------------------------- 1 | {{ label.label }} -------------------------------------------------------------------------------- /frontend/src/app/lightning/channel/closing-type/closing-type.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/lightning/channel/closing-type/closing-type.component.scss -------------------------------------------------------------------------------- /frontend/src/app/lightning/channels-statistics/channels-statistics.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | import { INodesStatistics } from '../../interfaces/node-api.interface'; 4 | 5 | @Component({ 6 | selector: 'app-channels-statistics', 7 | templateUrl: './channels-statistics.component.html', 8 | styleUrls: ['./channels-statistics.component.scss'], 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class ChannelsStatisticsComponent implements OnInit { 12 | @Input() statistics$: Observable; 13 | mode: string = 'avg'; 14 | 15 | constructor() { } 16 | 17 | ngOnInit(): void { 18 | } 19 | 20 | switchMode(mode: 'avg' | 'med') { 21 | this.mode = mode; 22 | return false; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/lightning-wrapper/lightning-wrapper.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/lightning-wrapper/lightning-wrapper.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/lightning/lightning-wrapper/lightning-wrapper.component.scss -------------------------------------------------------------------------------- /frontend/src/app/lightning/lightning-wrapper/lightning-wrapper.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; 2 | import { WebsocketService } from '../../services/websocket.service'; 3 | 4 | @Component({ 5 | selector: 'app-lightning-wrapper', 6 | templateUrl: './lightning-wrapper.component.html', 7 | styleUrls: ['./lightning-wrapper.component.scss'], 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export class LightningWrapperComponent implements OnInit { 11 | 12 | constructor( 13 | private websocketService: WebsocketService, 14 | ) { } 15 | 16 | ngOnInit() { 17 | this.websocketService.want(['blocks']); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.html: -------------------------------------------------------------------------------- 1 |
2 |

Fee distribution

3 |
4 |
5 |
6 |
7 |
8 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/node-fee-chart/node-fee-chart.component.scss: -------------------------------------------------------------------------------- 1 | .full-container { 2 | position: relative; 3 | margin-top: 25px; 4 | margin-bottom: 25px; 5 | min-height: 100%; 6 | min-height: 450px; 7 | } -------------------------------------------------------------------------------- /frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 | 8 |
9 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/node-statistics-chart/node-statistics-chart.component.scss: -------------------------------------------------------------------------------- 1 | .full-container { 2 | margin-top: 25px; 3 | margin-bottom: 25px; 4 | min-height: 100%; 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/node-statistics/node-statistics.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | import { INodesStatistics } from '../../interfaces/node-api.interface'; 4 | 5 | @Component({ 6 | selector: 'app-node-statistics', 7 | templateUrl: './node-statistics.component.html', 8 | styleUrls: ['./node-statistics.component.scss'], 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class NodeStatisticsComponent implements OnInit { 12 | @Input() statistics$: Observable; 13 | 14 | constructor() { } 15 | 16 | ngOnInit(): void { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-channels/node-channels.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Active channels map

4 |
5 |
6 |
7 | 8 |
9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-channels/node-channels.component.scss: -------------------------------------------------------------------------------- 1 | .node-channels-container { 2 | position: relative; 3 | } 4 | 5 | .loading-spinner { 6 | position: absolute; 7 | top: 0; 8 | left: 0; 9 | right: 0; 10 | width: 100%; 11 | z-index: 100; 12 | } 13 | 14 | .spinner-border { 15 | position: relative; 16 | top: 225px; 17 | } -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-list/nodes-list.component.scss: -------------------------------------------------------------------------------- 1 | .capacity.mobile-channels { 2 | @media (max-width: 767.98px) { 3 | display: none; 4 | } 5 | } 6 | 7 | .channels.mobile-capacity { 8 | @media (max-width: 767.98px) { 9 | display: none; 10 | } 11 | } -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-list/nodes-list.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | 4 | @Component({ 5 | selector: 'app-nodes-list', 6 | templateUrl: './nodes-list.component.html', 7 | styleUrls: ['./nodes-list.component.scss'], 8 | changeDetection: ChangeDetectionStrategy.OnPush, 9 | }) 10 | export class NodesListComponent implements OnInit { 11 | @Input() nodes$: Observable; 12 | @Input() show: string; 13 | 14 | constructor() { } 15 | 16 | ngOnInit(): void { 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-per-isp/nodes-per-isp-preview.component.scss: -------------------------------------------------------------------------------- 1 | .table { 2 | font-size: 32px; 3 | margin-top: 0px; 4 | } 5 | 6 | .map-col { 7 | flex-grow: 0; 8 | flex-shrink: 0; 9 | width: 470px; 10 | height: 360px; 11 | min-width: 470px; 12 | min-height: 360px; 13 | max-height: 360px; 14 | padding: 0; 15 | background: var(--stat-box-bg); 16 | overflow: hidden; 17 | margin-top: 0; 18 | } 19 | 20 | .row { 21 | margin-right: 0; 22 | } 23 | 24 | .full-width-row { 25 | padding-left: 15px; 26 | flex-wrap: nowrap; 27 | } 28 | 29 | ::ng-deep .symbol { 30 | font-size: 24px; 31 | } -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-ranking/nodes-ranking.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-ranking/nodes-ranking.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/lightning/nodes-ranking/nodes-ranking.component.scss -------------------------------------------------------------------------------- /frontend/src/app/lightning/nodes-rankings-dashboard/nodes-rankings-dashboard.component.scss: -------------------------------------------------------------------------------- 1 | .main { 2 | max-width: 90%; 3 | } 4 | 5 | .col { 6 | padding-bottom: 20px; 7 | padding-left: 10px; 8 | padding-right: 10px; 9 | } 10 | 11 | .card { 12 | background-color: var(--bg); 13 | } 14 | 15 | .card-title { 16 | font-size: 1rem; 17 | color: var(--title-fg); 18 | } 19 | .card-title > a { 20 | color: var(--title-fg); 21 | } 22 | 23 | .card-text { 24 | font-size: 22px; 25 | } 26 | 27 | .title-link, .title-link:hover, .title-link:focus, .title-link:active { 28 | text-align: center; 29 | display: block; 30 | margin-bottom: 10px; 31 | text-decoration: none; 32 | color: inherit; 33 | } -------------------------------------------------------------------------------- /frontend/src/app/master-page.module.ordpool.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Cat21MintComponent } from './components/ordinals/cat21-mint/cat21-mint.component'; 3 | import { Cat21CollabComponent } from './components/ordinals/cat21-collab/cat21-collab.component'; 4 | import { Cat21WhitelistCheckerComponent } from './components/ordinals/cat21-whitelist-checker/cat21-whitelist-checker.component'; 5 | 6 | export const extraOrdpoolRoutes = [ 7 | { 8 | path: 'cat21-mint', 9 | component: Cat21MintComponent, 10 | }, 11 | { 12 | path: 'cat21-collab', 13 | component: Cat21CollabComponent, 14 | }, 15 | { 16 | path: 'cat21-whitelist-checker', 17 | component: Cat21WhitelistCheckerComponent, 18 | } 19 | ]; -------------------------------------------------------------------------------- /frontend/src/app/services/audio.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable({ 4 | providedIn: 'root' 5 | }) 6 | export class AudioService { 7 | audio: HTMLAudioElement; 8 | isPlaying = false; 9 | 10 | constructor() { 11 | try { 12 | this.audio = new Audio(); 13 | } catch (e) {} 14 | } 15 | 16 | public playSound(name: 'magic' | 'chime' | 'cha-ching' | 'bright-harmony' | 'wind-chimes-harp-ascend' | 'ascend-chime-cartoon') { 17 | if (this.isPlaying || !this.audio) { 18 | return; 19 | } 20 | this.isPlaying = true; 21 | this.audio.src = '/resources/sounds/' + name + '.mp3'; 22 | this.audio.load(); 23 | this.audio.volume = 0.65; // 65% volume 24 | this.audio.play().catch((e) => { 25 | console.log('Play sound failed' + e); 26 | }); 27 | setTimeout(() => this.isPlaying = false, 100); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /frontend/src/app/services/zone-shim.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | 4 | @Injectable({ 5 | providedIn: 'root' 6 | }) 7 | export class ZoneService { 8 | 9 | constructor() { } 10 | 11 | wrapObservable(obs: Observable): Observable { 12 | return obs; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/btc/btc.component.html: -------------------------------------------------------------------------------- 1 | {{ valueOverride }} 2 | ‎{{ addPlus && satoshis >= 0 ? '+' : '' }}{{ value | number }} 3 | 4 | L- 5 | tL- 6 | t- 7 | t- 8 | s-{{ unit }} 9 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/btc/btc.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/shared/components/btc/btc.component.scss -------------------------------------------------------------------------------- /frontend/src/app/shared/components/confirmations/confirmations.component.scss: -------------------------------------------------------------------------------- 1 | .no-cursor { 2 | cursor: default !important; 3 | pointer-events: none; 4 | } -------------------------------------------------------------------------------- /frontend/src/app/shared/components/fee-rate/fee-rate.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/shared/components/fee-rate/fee-rate.component.scss -------------------------------------------------------------------------------- /frontend/src/app/shared/components/fee-rate/fee-rate.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | import { Observable } from 'rxjs'; 3 | import { StateService } from '../../../services/state.service'; 4 | 5 | @Component({ 6 | selector: 'app-fee-rate', 7 | templateUrl: './fee-rate.component.html', 8 | styleUrls: ['./fee-rate.component.scss'] 9 | }) 10 | export class FeeRateComponent implements OnInit { 11 | @Input() fee: number | undefined; 12 | @Input() weight: number = 4; 13 | @Input() rounding: string = null; 14 | @Input() showUnit: boolean = true; 15 | @Input() unitClass: string = 'symbol'; 16 | @Input() unitStyle: any; 17 | 18 | rateUnits$: Observable; 19 | 20 | constructor( 21 | private stateService: StateService, 22 | ) { } 23 | 24 | ngOnInit() { 25 | this.rateUnits$ = this.stateService.rateUnits$; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/geolocation/geolocation.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/geolocation/geolocation.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/shared/components/geolocation/geolocation.component.scss -------------------------------------------------------------------------------- /frontend/src/app/shared/components/http-error/http-error.component.html: -------------------------------------------------------------------------------- 1 |
2 |

3 | ({{ error | httpErrorMsg }}) 4 |
-------------------------------------------------------------------------------- /frontend/src/app/shared/components/http-error/http-error.component.scss: -------------------------------------------------------------------------------- 1 | .http-error { 2 | width: 100%; 3 | margin: 1em auto; 4 | text-align: center; 5 | } -------------------------------------------------------------------------------- /frontend/src/app/shared/components/http-error/http-error.component.ts: -------------------------------------------------------------------------------- 1 | import { HttpErrorResponse } from '@angular/common/http'; 2 | import { Component, Input } from '@angular/core'; 3 | 4 | @Component({ 5 | selector: 'app-http-error', 6 | templateUrl: './http-error.component.html', 7 | styleUrls: ['./http-error.component.scss'] 8 | }) 9 | export class HttpErrorComponent { 10 | @Input() error: HttpErrorResponse | null; 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/mempool-error/mempool-error.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/sats/sats.component.html: -------------------------------------------------------------------------------- 1 | {{ valueOverride }} 2 | ‎{{ addPlus && satoshis >= 0 ? '+' : '' }}{{ satoshis | number : digitsInfo }} 3 | 4 | L- 5 | tL- 6 | t- 7 | t- 8 | s-sats 9 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/sats/sats.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/shared/components/sats/sats.component.scss -------------------------------------------------------------------------------- /frontend/src/app/shared/components/testnet-alert/testnet-alert.component.scss: -------------------------------------------------------------------------------- 1 | .alert-danger { 2 | color: #fff; 3 | background-color: #b71c1c; 4 | border-color: #b71c1c; 5 | padding: 0.5rem 1.25rem; 6 | margin: 0px 10px 0px 10px; 7 | 8 | display: flex; 9 | justify-content: center; 10 | align-items: flex-start; 11 | } 12 | 13 | .message-container { 14 | display: flex; 15 | flex-direction: column; 16 | margin-left: auto; 17 | } 18 | 19 | .close { 20 | display: flex; 21 | color: #fff; 22 | align-items: center; 23 | } 24 | 25 | button { 26 | display: flex; 27 | margin-left: auto; 28 | } 29 | 30 | span { 31 | position: relative; 32 | top: -2px; 33 | } -------------------------------------------------------------------------------- /frontend/src/app/shared/components/testnet-alert/testnet-alert.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component } from '@angular/core'; 2 | import { StorageService } from '../../../services/storage.service'; 3 | import { StateService } from '../../../services/state.service'; 4 | 5 | @Component({ 6 | selector: 'app-testnet-alert', 7 | templateUrl: './testnet-alert.component.html', 8 | styleUrls: ['./testnet-alert.component.scss'], 9 | changeDetection: ChangeDetectionStrategy.OnPush, 10 | }) 11 | export class TestnetAlertComponent { 12 | 13 | constructor( 14 | public storageService: StorageService, 15 | public stateService: StateService, 16 | ) { } 17 | 18 | dismissWarning(): void { 19 | this.storageService.setValue('hideWarning', 'hidden'); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/timestamp/timestamp.component.html: -------------------------------------------------------------------------------- 1 | - 2 | 3 | ‎{{ seconds * 1000 | date: customFormat ?? 'yyyy-MM-dd HH:mm' }} 4 |
5 | () 6 |
7 |
8 | -------------------------------------------------------------------------------- /frontend/src/app/shared/components/timestamp/timestamp.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/app/shared/components/timestamp/timestamp.component.scss -------------------------------------------------------------------------------- /frontend/src/app/shared/components/toggle/toggle.component.html: -------------------------------------------------------------------------------- 1 |
2 | {{ textLeft }}  3 | 7 |  {{ textRight }} 8 |
9 | -------------------------------------------------------------------------------- /frontend/src/app/shared/directives/browser-only.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, TemplateRef, ViewContainerRef, Inject, PLATFORM_ID } from '@angular/core'; 2 | import { isPlatformBrowser } from '@angular/common'; 3 | 4 | @Directive({ 5 | selector: '[browserOnly]' 6 | }) 7 | export class BrowserOnlyDirective { 8 | constructor( 9 | private templateRef: TemplateRef, 10 | private viewContainer: ViewContainerRef, 11 | @Inject(PLATFORM_ID) private platformId: Object 12 | ) { 13 | if (isPlatformBrowser(this.platformId)) { 14 | this.viewContainer.createEmbeddedView(this.templateRef); 15 | } else { 16 | this.viewContainer.clear(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/app/shared/directives/colored-price.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, ElementRef, Input, OnChanges } from '@angular/core'; 2 | 3 | @Directive({ 4 | selector: '[appColoredPrice]', 5 | }) 6 | export class ColoredPriceDirective implements OnChanges { 7 | @Input() appColoredPrice: number; 8 | previousValue = null; 9 | 10 | constructor( 11 | private element: ElementRef 12 | ) { } 13 | 14 | ngOnChanges() { 15 | if (this.previousValue && this.appColoredPrice < this.previousValue) { 16 | this.element.nativeElement.classList.add('red-color'); 17 | } else { 18 | this.element.nativeElement.classList.remove('red-color'); 19 | } 20 | this.previousValue = this.appColoredPrice; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/app/shared/directives/server-only.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, TemplateRef, ViewContainerRef, Inject, PLATFORM_ID } from '@angular/core'; 2 | import { isPlatformServer } from '@angular/common'; 3 | 4 | @Directive({ 5 | selector: '[serverOnly]' 6 | }) 7 | export class ServerOnlyDirective { 8 | constructor( 9 | private templateRef: TemplateRef, 10 | private viewContainer: ViewContainerRef, 11 | @Inject(PLATFORM_ID) private platformId: Object 12 | ) { 13 | if (isPlatformServer(this.platformId)) { 14 | this.viewContainer.createEmbeddedView(this.templateRef); 15 | } else { 16 | this.viewContainer.clear(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/absolute/absolute.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'absolute' }) 4 | export class AbsolutePipe implements PipeTransform { 5 | transform(nr: number) { 6 | return Math.abs(nr); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/cap-address-pipe/cap-address-pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'capAddress' }) 4 | export class CapAddressPipe implements PipeTransform { 5 | transform(str: string, cap: number, leftover: number) { 6 | if (!str) { return; } 7 | if (str.length <= cap) { 8 | return str; 9 | } 10 | return str.slice(-Math.max(cap - str.length, leftover)); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/decimal2hex/decimal2hex.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'decimal2hex' 5 | }) 6 | export class Decimal2HexPipe implements PipeTransform { 7 | transform(decimal: number): string { 8 | return `0x` + ( decimal.toString(16) ).padStart(8, '0'); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/fee-rounding/fee-rounding.pipe.ts: -------------------------------------------------------------------------------- 1 | import { formatNumber } from "@angular/common"; 2 | import { Inject, LOCALE_ID, Pipe, PipeTransform } from "@angular/core"; 3 | 4 | @Pipe({ 5 | name: "feeRounding", 6 | }) 7 | export class FeeRoundingPipe implements PipeTransform { 8 | constructor( 9 | @Inject(LOCALE_ID) private locale: string, 10 | ) {} 11 | 12 | transform(fee: number, rounding = null): string { 13 | if (rounding) { 14 | return formatNumber(fee, this.locale, rounding); 15 | } 16 | 17 | if (fee >= 100) { 18 | return formatNumber(fee, this.locale, '1.0-0') 19 | } else if (fee < 10) { 20 | return formatNumber(fee, this.locale, '1.2-2') 21 | } 22 | return formatNumber(fee, this.locale, '1.1-1') 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/hex2ascii/hex2ascii.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'hex2ascii' 5 | }) 6 | export class Hex2asciiPipe implements PipeTransform { 7 | 8 | transform(hex: string): string { 9 | 10 | // see https://github.com/mempool/mempool/pull/5162 11 | if (!hex) { 12 | return ''; 13 | } 14 | 15 | const opPush = hex.split(' ').filter((_, i, a) => i > 0 && /^OP_PUSH/.test(a[i - 1])); 16 | 17 | if (opPush[0]) { 18 | hex = opPush[0]; 19 | } 20 | 21 | if (!hex) { 22 | return ''; 23 | } 24 | const bytes: number[] = []; 25 | for (let i = 0; i < hex.length; i += 2) { 26 | bytes.push(parseInt(hex.substr(i, 2), 16)); 27 | } 28 | return new TextDecoder('utf8').decode(Uint8Array.from(bytes)).replace(/\uFFFD/g, '').replace(/\\0/g, ''); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/http-error-pipe/http-error.pipe.ts: -------------------------------------------------------------------------------- 1 | import { HttpErrorResponse } from '@angular/common/http'; 2 | import { Pipe, PipeTransform } from '@angular/core'; 3 | 4 | @Pipe({ name: 'httpErrorMsg' }) 5 | export class HttpErrorPipe implements PipeTransform { 6 | transform(e: HttpErrorResponse | null): string { 7 | return e ? `${e.status}: ${e.statusText}` : ''; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/math-ceil/math-ceil.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'ceil' }) 4 | export class CeilPipe implements PipeTransform { 5 | transform(nr: number) { 6 | return Math.ceil(nr); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/no-sanitize.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; 3 | 4 | @Pipe({ name: 'noSanitize' }) 5 | export class NoSanitizePipe implements PipeTransform { 6 | constructor(private domSanitizer: DomSanitizer) { } 7 | 8 | transform(html: string): SafeHtml { 9 | return this.domSanitizer.bypassSecurityTrustHtml(html); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/relative-url/relative-url.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { StateService } from '../../../services/state.service'; 3 | 4 | @Pipe({ 5 | name: 'relativeUrl' 6 | }) 7 | export class RelativeUrlPipe implements PipeTransform { 8 | 9 | constructor( 10 | private stateService: StateService, 11 | ) { } 12 | 13 | transform(value: string, swapNetwork?: string): string { 14 | let network = swapNetwork || this.stateService.network; 15 | if (network === 'mainnet') network = ''; 16 | if (this.stateService.env.BASE_MODULE === 'liquid' && network === 'liquidtestnet') { 17 | network = 'testnet'; 18 | } else if (this.stateService.env.BASE_MODULE !== 'mempool') { 19 | network = ''; 20 | } 21 | return (network ? '/' + network : '') + value; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/scriptpubkey-type-pipe/scriptpubkey-type.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'scriptpubkeyType' 5 | }) 6 | export class ScriptpubkeyTypePipe implements PipeTransform { 7 | 8 | transform(value: string): string { 9 | switch (value) { 10 | case 'fee': 11 | return $localize`Transaction fee`; 12 | case 'p2pk': 13 | return 'P2PK'; 14 | case 'op_return': 15 | return 'OP_RETURN'; 16 | default: 17 | return value.toUpperCase(); 18 | } 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /frontend/src/app/shared/pipes/shorten-string-pipe/shorten-string.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ name: 'shortenString' }) 4 | export class ShortenStringPipe implements PipeTransform { 5 | transform(str: string, length: number = 12) { 6 | if (!str) { return; } 7 | if (str.length <= length) { 8 | return str; 9 | } 10 | const half = length / 2; 11 | return str.substring(0, half) + '...' + str.substring(str.length - half); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | nativeAssetId: '6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d', 4 | nativeTestAssetId: '144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49', 5 | enableInscriptionAccelerator: true, 6 | enableCat21Mint: true, 7 | ordBaseUrl: 'https://explorer.ordinalsbot.com', 8 | ordBaseUrlTestnet: 'https://testnet-explorer.ordinalsbot.com', 9 | cat21BaseUrl: 'https://backend.cat21.space' 10 | }; 11 | -------------------------------------------------------------------------------- /frontend/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/favicon.ico -------------------------------------------------------------------------------- /frontend/src/main.server.ts: -------------------------------------------------------------------------------- 1 | 2 | import '@angular/localize/init'; 3 | import { enableProdMode } from '@angular/core'; 4 | import { environment } from './environments/environment'; 5 | 6 | if (environment.production) { 7 | enableProdMode(); 8 | } 9 | 10 | export { AppServerModule } from './app/app.module.server'; 11 | export { renderModule } from '@angular/platform-server'; 12 | -------------------------------------------------------------------------------- /frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | document.addEventListener('DOMContentLoaded', () => { 12 | platformBrowserDynamic().bootstrapModule(AppModule) 13 | .catch(err => console.error(err)); 14 | }); 15 | -------------------------------------------------------------------------------- /frontend/src/resources/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/.gitkeep -------------------------------------------------------------------------------- /frontend/src/resources/clock/gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/clock/gradient.png -------------------------------------------------------------------------------- /frontend/src/resources/dead-cat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/dead-cat.png -------------------------------------------------------------------------------- /frontend/src/resources/favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /frontend/src/resources/favicons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/favicons/android-chrome-512x512.png -------------------------------------------------------------------------------- /frontend/src/resources/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /frontend/src/resources/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #000000 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /frontend/src/resources/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /frontend/src/resources/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /frontend/src/resources/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/favicons/favicon.ico -------------------------------------------------------------------------------- /frontend/src/resources/favicons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/favicons/mstile-150x150.png -------------------------------------------------------------------------------- /frontend/src/resources/favicons/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ordinals-mempool", 3 | "short_name": "ordinals-mempool", 4 | "icons": [ 5 | { 6 | "src": "/resources/favicons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/resources/favicons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#000000", 17 | "background_color": "#000000", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-audio.css: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | } 4 | 5 | body { 6 | align-items: center; 7 | display: flex; 8 | height: 100%; 9 | margin: 0; 10 | } 11 | 12 | audio { 13 | width: 100%; 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-markdown.css: -------------------------------------------------------------------------------- 1 | html { 2 | color: #98a3ad; 3 | background-color: #131516; 4 | max-width: 900px; 5 | margin: 0 auto; 6 | font-family: system-ui, sans-serif; 7 | } 8 | 9 | img { 10 | max-width: 100%; 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-markdown.js: -------------------------------------------------------------------------------- 1 | import { marked } from '/resources/inscription-assets/preview-markdown-marked.js'; 2 | import { decodeDataURI } from '/resources/inscription-assets/decode-data-uri.js'; 3 | 4 | 5 | const markdown = decodeDataURI(window.markdownBase64); 6 | document.body.innerHTML = marked.parse(markdown); 7 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-pdf.css: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | } 4 | 5 | body { 6 | height: 100%; 7 | margin: 0; 8 | } 9 | 10 | canvas { 11 | height: 100%; 12 | width: 100%; 13 | object-fit: contain; 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-pdf.js: -------------------------------------------------------------------------------- 1 | import pdfjs from '/resources/inscription-assets/preview-pdf-pdfjs.js'; 2 | import { decodeDataURI } from '/resources/inscription-assets/decode-data-uri.js'; 3 | 4 | 5 | pdfjs.GlobalWorkerOptions.workerSrc = '/resources/inscription-assets/preview-pdf-pdf.worker.js'; 6 | 7 | let canvas = document.querySelector('canvas'); 8 | 9 | const pdf = await pdfjs.getDocument({data: decodeDataURI(window.pdfBase64) }).promise; 10 | let page = await pdf.getPage(1); 11 | let scale = window.devicePixelRatio || 1; 12 | let viewport = page.getViewport({ scale }); 13 | 14 | canvas.width = Math.ceil(viewport.width * scale); 15 | canvas.height = Math.ceil(viewport.height * scale); 16 | 17 | page.render({ 18 | canvasContext: canvas.getContext('2d'), 19 | transform: [scale, 0, 0, scale, 0, 0], 20 | viewport, 21 | }); 22 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-text.css: -------------------------------------------------------------------------------- 1 | html { 2 | background-color: #131516; 3 | color: white; 4 | font-size: 16px; 5 | height: 100%; 6 | line-height: 1; 7 | } 8 | 9 | body { 10 | display: grid; 11 | grid-template: 1fr / 1fr; 12 | height: 100%; 13 | margin: 0; 14 | place-items: center; 15 | } 16 | 17 | pre { 18 | margin: 0; 19 | } 20 | 21 | body > * { 22 | grid-column: 1 / 1; 23 | grid-row: 1 / 1; 24 | } 25 | 26 | body > pre { 27 | opacity: 0; 28 | } 29 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-text.js: -------------------------------------------------------------------------------- 1 | 2 | import { decodeDataURI } from '/resources/inscription-assets/decode-data-uri.js'; 3 | 4 | const text = decodeDataURI(window.textBase64); 5 | 6 | let pre = document.querySelector('body > pre'); 7 | pre.innerText = text; 8 | 9 | let { width, height } = pre.getBoundingClientRect(); 10 | let columns = width / 16; 11 | let rows = height / 16; 12 | pre.style.fontSize = `min(${95/columns}vw, ${95/rows}vh)`; 13 | pre.style.opacity = 1; 14 | -------------------------------------------------------------------------------- /frontend/src/resources/inscription-assets/preview-video.css: -------------------------------------------------------------------------------- 1 | html { 2 | background-color: #131516; 3 | height: 100%; 4 | } 5 | 6 | body { 7 | align-items: center; 8 | display: flex; 9 | height: 100%; 10 | margin: 0; 11 | } 12 | 13 | video { 14 | height: 100%; 15 | width: 100%; 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/resources/liquid-bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid-bitcoin.png -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/favicons/android-chrome-512x512.png -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #000000 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/favicons/favicon.ico -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/favicons/mstile-150x150.png -------------------------------------------------------------------------------- /frontend/src/resources/liquid/favicons/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "liquid.network", 3 | "short_name": "liquid", 4 | "icons": [ 5 | { 6 | "src": "/resources/liquid/favicons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/resources/liquid/favicons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#000000", 17 | "background_color": "#000000", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/resources/liquid/liquid-network-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/liquid/liquid-network-preview.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-blocks-2-3-logo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-blocks-2-3-logo.jpeg -------------------------------------------------------------------------------- /frontend/src/resources/mempool-blocks-3-2-logo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-blocks-3-2-logo.jpeg -------------------------------------------------------------------------------- /frontend/src/resources/mempool-blocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-blocks.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-cube-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-cube-logo.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-logo-bigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-logo-bigger.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-preview.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-space-logo-bigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-space-logo-bigger.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-space-logo-horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-space-logo-horizontal.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-space-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-space-preview.png -------------------------------------------------------------------------------- /frontend/src/resources/mempool-tube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/mempool-tube.png -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/onbtc/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/favicons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/onbtc/favicons/android-chrome-512x512.png -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/onbtc/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/onbtc/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/onbtc/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/onbtc/favicons/favicon.ico -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/favicons/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /frontend/src/resources/onbtc/onbtc-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/onbtc/onbtc-preview.jpg -------------------------------------------------------------------------------- /frontend/src/resources/ordinal-wallets/btc-leather-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/ordinal-wallets/btc-leather-logo.png -------------------------------------------------------------------------------- /frontend/src/resources/ordinal-wallets/btc-xverse-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/ordinal-wallets/btc-xverse-logo.png -------------------------------------------------------------------------------- /frontend/src/resources/ordinals-mempool-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/ordinals-mempool-logo.png -------------------------------------------------------------------------------- /frontend/src/resources/previews/about.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/about.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/accelerator.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/accelerator.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/blocks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/blocks.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/dashboard.png -------------------------------------------------------------------------------- /frontend/src/resources/previews/docs-api.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/docs-api.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/enterprise.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/enterprise.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/faq.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/faq.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/lightning.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/lightning.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/lightning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/lightning.png -------------------------------------------------------------------------------- /frontend/src/resources/previews/mempool-space-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/mempool-space-preview.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/mining.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/mining.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/mining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/mining.png -------------------------------------------------------------------------------- /frontend/src/resources/previews/privacy-policy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/privacy-policy.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/rbf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/rbf.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/sponsor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/sponsor.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/terms-of-service.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/terms-of-service.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/trademark-policy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/trademark-policy.jpg -------------------------------------------------------------------------------- /frontend/src/resources/previews/tx-push.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/previews/tx-push.jpg -------------------------------------------------------------------------------- /frontend/src/resources/profile/bisq_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/bisq_network.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/blixt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/blixt.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/bluewallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/bluewallet.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/blw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/blw.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/copa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/copa.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/edge.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /frontend/src/resources/profile/electrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/electrum.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/lnbits.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /frontend/src/resources/profile/mutiny.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /frontend/src/resources/profile/muun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/muun.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/mynodebtc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/mynodebtc.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/nix-bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/nix-bitcoin.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/nunchuk.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /frontend/src/resources/profile/raspiblitz.svg: -------------------------------------------------------------------------------- 1 | RaspiBlitz_Logo_Icon_Negative 2 | -------------------------------------------------------------------------------- /frontend/src/resources/profile/raspibolt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/raspibolt.jpg -------------------------------------------------------------------------------- /frontend/src/resources/profile/ronindojo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/ronindojo.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/satpile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/satpile.jpg -------------------------------------------------------------------------------- /frontend/src/resources/profile/softsimon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/softsimon.jpg -------------------------------------------------------------------------------- /frontend/src/resources/profile/sparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/sparrow.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/specter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/specter.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/start9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/start9.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/umbrel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/umbrel.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/unknown.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/resources/profile/wiz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/wiz.png -------------------------------------------------------------------------------- /frontend/src/resources/profile/zeus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/profile/zeus.png -------------------------------------------------------------------------------- /frontend/src/resources/promo-video/mempool-promo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/promo-video/mempool-promo.jpg -------------------------------------------------------------------------------- /frontend/src/resources/screenshots/v2.1.0-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/screenshots/v2.1.0-dashboard.png -------------------------------------------------------------------------------- /frontend/src/resources/screenshots/v2.2.0-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/screenshots/v2.2.0-dashboard.png -------------------------------------------------------------------------------- /frontend/src/resources/screenshots/v2.2.1-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/screenshots/v2.2.1-dashboard.png -------------------------------------------------------------------------------- /frontend/src/resources/screenshots/v2.3.0-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/screenshots/v2.3.0-dashboard.png -------------------------------------------------------------------------------- /frontend/src/resources/screenshots/v2.4.0-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/screenshots/v2.4.0-dashboard.png -------------------------------------------------------------------------------- /frontend/src/resources/sounds/ascend-chime-cartoon.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/sounds/ascend-chime-cartoon.mp3 -------------------------------------------------------------------------------- /frontend/src/resources/sounds/bright-harmony.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/sounds/bright-harmony.mp3 -------------------------------------------------------------------------------- /frontend/src/resources/sounds/cha-ching.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/sounds/cha-ching.mp3 -------------------------------------------------------------------------------- /frontend/src/resources/sounds/chime.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/sounds/chime.mp3 -------------------------------------------------------------------------------- /frontend/src/resources/sounds/magic.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/sounds/magic.mp3 -------------------------------------------------------------------------------- /frontend/src/resources/sounds/wind-chimes-harp-ascend.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/sounds/wind-chimes-harp-ascend.mp3 -------------------------------------------------------------------------------- /frontend/src/resources/wallycore/wallycore.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ordpool-space/ordpool/c707d6a337fb5dcab86b511ca1a011507c0c6bf5/frontend/src/resources/wallycore/wallycore.wasm -------------------------------------------------------------------------------- /frontend/src/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | -------------------------------------------------------------------------------- /frontend/src/styles-ordpool-overrides2.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | --search-button: #d5a90a; 4 | --search-button-border: #d5a90a; 5 | --search-button-focus: #eba814; 6 | --search-button-shadow: #eba814; 7 | } 8 | 9 | 10 | @import "./styles_highlightjs_solarized-dark"; 11 | @import "./styles_form-control"; -------------------------------------------------------------------------------- /frontend/src/styles_form-control.scss: -------------------------------------------------------------------------------- 1 | .validated.form-control { 2 | &.ng-valid { 3 | @extend .is-valid; 4 | } 5 | 6 | &.ng-invalid { 7 | @extend .is-invalid; 8 | @extend .text-danger; 9 | } 10 | } 11 | 12 | .feedback { 13 | &-error { 14 | @extend .small; 15 | @extend .mt-1; 16 | @extend .text-danger; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": [ 8 | "src/main.ts", 9 | "src/polyfills.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /frontend/tsconfig.base.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "downlevelIteration": true, 9 | "experimentalDecorators": true, 10 | "module": "ES2020", 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "ES2020", 14 | "typeRoots": [ 15 | "node_modules/@types" 16 | ], 17 | "lib": [ 18 | "ES2020", 19 | "dom", 20 | "dom.iterable" 21 | ] 22 | }, 23 | "angularCompilerOptions": { 24 | "fullTemplateTypeCheck": true, 25 | "strictInjectionParameters": true, 26 | "strictTemplates": true, 27 | "useDefineForClassFields": false 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* 2 | This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. 3 | It is not intended to be used to perform a compilation. 4 | 5 | To learn more about this file see: https://angular.io/config/solution-tsconfig. 6 | */ 7 | { 8 | "files": [], 9 | "references": [ 10 | { 11 | "path": "./tsconfig.app.json" 12 | }, 13 | { 14 | "path": "./tsconfig.spec.json" 15 | }, 16 | { 17 | "path": "./tsconfig.server.json" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /frontend/tsconfig.server.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.app.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/server", 5 | "target": "ES2020", 6 | "sourceMap": true, 7 | "types": [ 8 | "node" 9 | ] 10 | }, 11 | "files": [ 12 | "src/main.server.ts", 13 | "server.ts" 14 | ], 15 | "angularCompilerOptions": { 16 | "entryModule": "./src/app/app.server.module#AppServerModule" 17 | } 18 | } -------------------------------------------------------------------------------- /frontend/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "module": "CommonJs", 6 | "types": [ 7 | "jest" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /node_modules/.package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ordinals-mempool", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | -------------------------------------------------------------------------------- /production/bitcoin.crontab: -------------------------------------------------------------------------------- 1 | @reboot sleep 5 ; /usr/local/bin/bitcoind -testnet >/dev/null 2>&1 2 | @reboot sleep 5 ; /usr/local/bin/bitcoind -signet >/dev/null 2>&1 3 | @reboot sleep 10 ; screen -dmS mainnet /bitcoin/electrs/start mainnet 4 | @reboot sleep 10 ; screen -dmS testnet /bitcoin/electrs/start testnet 5 | @reboot sleep 10 ; screen -dmS testnet4 /bitcoin/electrs/start testnet4 6 | @reboot sleep 10 ; screen -dmS signet /bitcoin/electrs/start signet 7 | -------------------------------------------------------------------------------- /production/bitcoin.minfee.conf: -------------------------------------------------------------------------------- 1 | datadir=/minfee 2 | server=1 3 | txindex=0 4 | listen=1 5 | daemon=1 6 | prune=1337 7 | mempoolfullrbf=1 8 | rpcallowip=127.0.0.1 9 | rpcuser=__BITCOIN_RPC_USER__ 10 | rpcpassword=__BITCOIN_RPC_PASS__ 11 | #uacomment=@wiz 12 | 13 | [main] 14 | bind=127.0.0.1:8303 15 | rpcbind=127.0.0.1:8302 16 | rpcport=8302 17 | addnode=127.0.0.1:8333 18 | -------------------------------------------------------------------------------- /production/elements.crontab: -------------------------------------------------------------------------------- 1 | # start elements on reboot 2 | @reboot sleep 5 ; /usr/local/bin/elementsd -chain=liquidv1 >/dev/null 2>&1 3 | @reboot sleep 5 ; /usr/local/bin/elementsd -chain=liquidtestnet >/dev/null 2>&1 4 | 5 | # start electrs on reboot 6 | @reboot sleep 20 ; screen -dmS liquidv1 /elements/electrs/start liquid 7 | @reboot sleep 20 ; screen -dmS liquidtestnet /elements/electrs/start liquidtestnet 8 | 9 | # hourly asset update and electrs restart 10 | 6 * * * * cd $HOME/asset_registry_db && git pull --quiet origin master && cd $HOME/asset_registry_testnet_db && git pull --quiet origin master && killall electrs 11 | -------------------------------------------------------------------------------- /production/freebsd/sysconf.patch: -------------------------------------------------------------------------------- 1 | --- a/src/raw.rs 2020-10-22 05:59:43.747207000 +0000 2 | +++ b/src/raw2.rs 2020-10-22 06:00:04.016688000 +0000 3 | @@ -82,9 +82,6 @@ 4 | Sc2CharTerm = sc!(_SC_2_CHAR_TERM), 5 | Sc2CVersion = 96, // TODO(joshlf): Switch to a libc constant once it's added 6 | Sc2Upe = sc!(_SC_2_UPE), 7 | - ScXbs5Ilp32Off32 = sc!(_SC_XBS5_ILP32_OFF32), 8 | - ScXbs5Ilp32Offbig = sc!(_SC_XBS5_ILP32_OFFBIG), 9 | - ScXbs5LpbigOffbig = sc!(_SC_XBS5_LPBIG_OFFBIG), 10 | } 11 | 12 | /// Query the system's configuration. 13 | -------------------------------------------------------------------------------- /production/freebsd/syslog.d/bitcoin.conf: -------------------------------------------------------------------------------- 1 | local0.info /var/log/bitcoind.mainnet 2 | local1.info /var/log/bitcoind.testnet 3 | local2.info /var/log/elementsd.liquid 4 | -------------------------------------------------------------------------------- /production/linux/bitcoin-minfee.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Bitcoind-minfee 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/usr/local/bin/bitcoind -daemon -printtoconsole -pid=/minfee/bitcoind-minfee.pid 7 | ExecStop=/usr/local/bin/bitcoin-cli stop 8 | 9 | Type=forking 10 | PIDFile=/minfee/bitcoind.pid 11 | Restart=on-failure 12 | 13 | User=minfee 14 | Group=minfee 15 | 16 | PrivateTmp=true 17 | ProtectSystem=full 18 | NoNewPrivileges=true 19 | PrivateDevices=true 20 | 21 | [Install] 22 | WantedBy=multi-user.target 23 | -------------------------------------------------------------------------------- /production/linux/bitcoin-signet.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Bitcoind-signet 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/usr/local/bin/bitcoind -conf=bitcoin.conf -daemon -signet -printtoconsole -pid=/bitcoin/bitcoind-signet.pid 7 | ExecStop=/usr/local/bin/bitcoin-cli -signet stop 8 | 9 | Type=forking 10 | PIDFile=/bitcoin/bitcoind-signet.pid 11 | Restart=on-failure 12 | 13 | User=bitcoin 14 | Group=bitcoin 15 | 16 | PrivateTmp=true 17 | ProtectSystem=full 18 | NoNewPrivileges=true 19 | PrivateDevices=true 20 | 21 | [Install] 22 | WantedBy=multi-user.target 23 | -------------------------------------------------------------------------------- /production/linux/bitcoin-testnet.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Bitcoind-testnet 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/usr/local/bin/bitcoind -conf=bitcoin.conf -daemon -testnet -printtoconsole -pid=/bitcoin/bitcoind-testnet.pid 7 | ExecStop=/usr/local/bin/bitcoin-cli -testnet stop 8 | 9 | Type=forking 10 | PIDFile=/bitcoin/bitcoind-testnet.pid 11 | Restart=on-failure 12 | 13 | User=bitcoin 14 | Group=bitcoin 15 | 16 | PrivateTmp=true 17 | ProtectSystem=full 18 | NoNewPrivileges=true 19 | PrivateDevices=true 20 | 21 | [Install] 22 | WantedBy=multi-user.target 23 | -------------------------------------------------------------------------------- /production/linux/bitcoin.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Bitcoind 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/usr/local/bin/bitcoind -daemon -printtoconsole -pid=/bitcoin/bitcoind.pid 7 | ExecStop=/usr/local/bin/bitcoin-cli stop 8 | 9 | Type=forking 10 | PIDFile=/bitcoin/bitcoind.pid 11 | Restart=on-failure 12 | 13 | User=bitcoin 14 | Group=bitcoin 15 | 16 | PrivateTmp=true 17 | ProtectSystem=full 18 | NoNewPrivileges=true 19 | PrivateDevices=true 20 | 21 | [Install] 22 | WantedBy=multi-user.target 23 | -------------------------------------------------------------------------------- /production/linux/elements-liquid.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Elementsd-liquid 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -chain=liquidv1 -pid=/elements/elements-liquid.pid 7 | ExecStop=/usr/local/bin/elements-cli stop 8 | 9 | Type=forking 10 | PIDFile=/elements/elements-liquid.pid 11 | Restart=on-failure 12 | 13 | User=elements 14 | Group=elements 15 | 16 | PrivateTmp=true 17 | ProtectSystem=full 18 | NoNewPrivileges=true 19 | PrivateDevices=true 20 | 21 | [Install] 22 | WantedBy=multi-user.target 23 | -------------------------------------------------------------------------------- /production/linux/elements-liquidtestnet.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Elementsd-liquidtestnet 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -chain=liquidtestnet -pid=/elements/elements-liquidtestnet.pid 7 | ExecStop=/usr/local/bin/elements-cli stop 8 | 9 | Type=forking 10 | PIDFile=/elements/elements-liquidtestnet.pid 11 | Restart=on-failure 12 | 13 | User=elements 14 | Group=elements 15 | 16 | PrivateTmp=true 17 | ProtectSystem=full 18 | NoNewPrivileges=true 19 | PrivateDevices=true 20 | 21 | [Install] 22 | WantedBy=multi-user.target 23 | -------------------------------------------------------------------------------- /production/linux/rsyslog.conf: -------------------------------------------------------------------------------- 1 | local7.info /var/log/mempool 2 | local7.* /var/log/mempool.debug 3 | -------------------------------------------------------------------------------- /production/mempool-config.unfurl.json: -------------------------------------------------------------------------------- 1 | { 2 | "SERVER": { 3 | "HOST": "https://mempool.space", 4 | "HTTP_PORT": 8001 5 | }, 6 | "MEMPOOL": { 7 | "HTTP_HOST": "https://mempool.space", 8 | "HTTP_PORT": 443 9 | }, 10 | "PUPPETEER": { 11 | "CLUSTER_SIZE": 8 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /production/mempool-frontend-config.liquid.json: -------------------------------------------------------------------------------- 1 | { 2 | "BASE_MODULE": "liquid", 3 | "OFFICIAL_MEMPOOL_SPACE": true, 4 | "TESTNET_ENABLED": true, 5 | "TESTNET4_ENABLED": true, 6 | "LIQUID_ENABLED": true, 7 | "LIQUID_TESTNET_ENABLED": true, 8 | "BISQ_ENABLED": true, 9 | "BISQ_SEPARATE_BACKEND": true, 10 | "SIGNET_ENABLED": true, 11 | "MEMPOOL_WEBSITE_URL": "https://mempool.space", 12 | "LIQUID_WEBSITE_URL": "https://liquid.network", 13 | "BISQ_WEBSITE_URL": "https://bisq.markets", 14 | "ITEMS_PER_PAGE": 25, 15 | "MEMPOOL_BLOCKS_AMOUNT": 2, 16 | "KEEP_BLOCKS_AMOUNT": 16 17 | } 18 | -------------------------------------------------------------------------------- /production/mempool-frontend-config.mainnet.json: -------------------------------------------------------------------------------- 1 | { 2 | "OFFICIAL_MEMPOOL_SPACE": true, 3 | "TESTNET_ENABLED": true, 4 | "TESTNET4_ENABLED": true, 5 | "LIQUID_ENABLED": true, 6 | "LIQUID_TESTNET_ENABLED": true, 7 | "BISQ_ENABLED": true, 8 | "BISQ_SEPARATE_BACKEND": true, 9 | "SIGNET_ENABLED": true, 10 | "MEMPOOL_WEBSITE_URL": "https://mempool.space", 11 | "LIQUID_WEBSITE_URL": "https://liquid.network", 12 | "BISQ_WEBSITE_URL": "https://bisq.markets", 13 | "ITEMS_PER_PAGE": 25, 14 | "LIGHTNING": true, 15 | "ACCELERATOR": true, 16 | "PUBLIC_ACCELERATIONS": true, 17 | "AUDIT": true 18 | } 19 | -------------------------------------------------------------------------------- /production/mempool-frontend-config.onbtc.json: -------------------------------------------------------------------------------- 1 | { 2 | "OFFICIAL_MEMPOOL_SPACE": true, 3 | "TESTNET_ENABLED": true, 4 | "TESTNET4_ENABLED": true, 5 | "LIQUID_ENABLED": true, 6 | "LIQUID_TESTNET_ENABLED": true, 7 | "BISQ_ENABLED": true, 8 | "BISQ_SEPARATE_BACKEND": true, 9 | "SIGNET_ENABLED": true, 10 | "MEMPOOL_WEBSITE_URL": "https://mempool.space", 11 | "LIQUID_WEBSITE_URL": "https://liquid.network", 12 | "BISQ_WEBSITE_URL": "https://bisq.markets", 13 | "ITEMS_PER_PAGE": 25, 14 | "LIGHTNING": true, 15 | "ACCELERATOR": true, 16 | "PUBLIC_ACCELERATIONS": true, 17 | "AUDIT": true, 18 | "CUSTOMIZATION": "custom-sv-config.json" 19 | } 20 | -------------------------------------------------------------------------------- /production/mempool-frontend-config.ordpool.json: -------------------------------------------------------------------------------- 1 | { 2 | "MEMPOOL_WEBSITE_URL":"https://ordpool.space", 3 | "ITEMS_PER_PAGE":25, 4 | "BASE_MODULE":"ordpool" 5 | } -------------------------------------------------------------------------------- /production/mempool-kill-all: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | # kill actual node backends 4 | killall node 2>/dev/null 5 | 6 | # kill "while true" loops 7 | killall sh 2>/dev/null 8 | 9 | # kill unfurler chrome instances 10 | killall chrome 2>/dev/null 11 | 12 | # kill xorg 13 | killall xinit Xorg 2>/dev/null 14 | 15 | # kill dbus 16 | killall dbus-daemon 2>/dev/null 17 | 18 | # kill nginx cache warmer scripts 19 | for pid in `ps uaxww|grep warmer|grep zsh|awk '{print $2}'`;do 20 | kill $pid 21 | done 22 | 23 | # kill nginx cache heater scripts 24 | for pid in `ps uaxww|grep heater|grep zsh|awk '{print $2}'`;do 25 | kill $pid 26 | done 27 | 28 | # always exit successfully despite above errors 29 | exit 0 30 | -------------------------------------------------------------------------------- /production/mempool-logger: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | trap "" PIPE 3 | while read input;do 4 | if [ ! -z "${input}" ];then 5 | echo "\`\`\`${input}\`\`\`" | /usr/local/bin/keybase chat send --nonblock --channel "$2" "$1" 6 | fi 7 | done 8 | -------------------------------------------------------------------------------- /production/mempool-reset-all: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | rm $HOME/*/backend/mempool-config.json 3 | rm $HOME/*/frontend/mempool-frontend-config.json 4 | -------------------------------------------------------------------------------- /production/mempool-update-assets: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | set -e 3 | 4 | wget -O /mempool/public_html/mainnet/resources/assets.json https://raw.githubusercontent.com/blockstream/asset_registry_db/master/index.json 5 | wget -O /mempool/public_html/mainnet/resources/assets.minimal.json https://raw.githubusercontent.com/blockstream/asset_registry_db/master/index.minimal.json 6 | 7 | wget -O /mempool/public_html/mainnet/resources/assets.json https://raw.githubusercontent.com/blockstream/asset_registry_testnet_db/master/index.json 8 | wget -O /mempool/public_html/mainnet/resources/assets.minimal.json https://raw.githubusercontent.com/blockstream/asset_registry_testnet_db/master/index.minimal.json 9 | 10 | exit 0 11 | -------------------------------------------------------------------------------- /production/mempool.crontab: -------------------------------------------------------------------------------- 1 | # start on reboot 2 | @reboot sleep 90 ; $HOME/start 3 | 4 | # daily backup 5 | 37 13 * * * sleep 30 ; /mempool/mempool.space/backup >/dev/null 2>&1 & 6 | 7 | # hourly liquid asset update 8 | 6 * * * * cd $HOME/liquid/frontend && npm run sync-assets && rsync -av $HOME/liquid/frontend/dist/mempool/browser/resources/assets* $HOME/public_html/liquid/resources/ >/dev/null 2>&1 9 | 10 | -------------------------------------------------------------------------------- /production/minfee.crontab: -------------------------------------------------------------------------------- 1 | @reboot /usr/local/bin/bitcoind >/dev/null 2>&1 2 | -------------------------------------------------------------------------------- /production/newsyslog-mempool-backend.conf: -------------------------------------------------------------------------------- 1 | /var/log/mempool 644 10 * @T00 C 2 | /var/log/mempool.debug 644 10 * @T00 C 3 | -------------------------------------------------------------------------------- /production/newsyslog-mempool-nginx.conf: -------------------------------------------------------------------------------- 1 | /var/log/nginx/access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 2 | /var/log/nginx/error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 3 | /var/log/nginx/bisq-access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 4 | /var/log/nginx/bisq-error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 5 | /var/log/nginx/liquid-access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 6 | /var/log/nginx/liquid-error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 7 | /var/log/nginx/mempool-access.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 8 | /var/log/nginx/mempool-error.log www:www 644 10 * @T00 C /var/run/mempool.pid 30 9 | -------------------------------------------------------------------------------- /production/nginx-cache-heater: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | hostname=$(hostname) 3 | 4 | heat() 5 | { 6 | echo "$1" 7 | curl -i -s "$1" | head -1 8 | } 9 | 10 | heatURLs=( 11 | '/api/v1/fees/recommended' 12 | ) 13 | 14 | while true 15 | do 16 | echo "starting heat cache cycle..." 17 | 18 | for url in $heatURLs 19 | do 20 | heat "https://${hostname}${url}" 21 | done 22 | 23 | sleep 0.5 24 | done 25 | -------------------------------------------------------------------------------- /production/nginx/http-acl.conf: -------------------------------------------------------------------------------- 1 | # used for "internal" API restriction 2 | geo $remote_addr $mempool_external { 3 | 127.0.0.1 ''; 4 | ::1 ''; 5 | default 1; 6 | } 7 | -------------------------------------------------------------------------------- /production/nginx/location-api-v1-lightning.conf: -------------------------------------------------------------------------------- 1 | # route lightning API endpoints to lightning backend 2 | location /api/v1/lightning { 3 | try_files /dev/null @mempool-api-v1-lightning; 4 | } 5 | location @mempool-api-v1-lightning { 6 | proxy_pass $mempoolMainnetLightning; 7 | 8 | proxy_set_header Host $host; 9 | proxy_set_header X-Real-IP $remote_addr; 10 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 11 | proxy_set_header X-Forwarded-Proto $scheme; 12 | 13 | proxy_cache_background_update on; 14 | proxy_cache_use_stale updating; 15 | proxy_cache apiwarm; 16 | proxy_cache_valid 200 10s; 17 | proxy_redirect off; 18 | 19 | expires 10s; 20 | } 21 | -------------------------------------------------------------------------------- /production/nginx/location-signet-api-v1-lightning.conf: -------------------------------------------------------------------------------- 1 | # route lightning API endpoints to lightning backend 2 | location /signet/api/v1/lightning { 3 | rewrite ^/signet/(.*) /$1 break; 4 | try_files /dev/null @mempool-signet-api-v1-lightning; 5 | } 6 | location @mempool-signet-api-v1-lightning { 7 | proxy_pass $mempoolSignetLightning; 8 | 9 | proxy_set_header Host $host; 10 | proxy_set_header X-Real-IP $remote_addr; 11 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 | proxy_set_header X-Forwarded-Proto $scheme; 13 | 14 | proxy_cache_background_update off; 15 | proxy_cache_use_stale error; 16 | proxy_cache apiwarm; 17 | proxy_cache_valid 200 10s; 18 | proxy_redirect off; 19 | 20 | expires 10s; 21 | } 22 | -------------------------------------------------------------------------------- /production/nginx/location-testnet-api-v1-lightning.conf: -------------------------------------------------------------------------------- 1 | # route lightning API endpoints to lightning backend 2 | location /testnet/api/v1/lightning { 3 | rewrite ^/testnet/(.*) /$1 break; 4 | try_files /dev/null @mempool-testnet-api-v1-lightning; 5 | } 6 | location @mempool-testnet-api-v1-lightning { 7 | proxy_pass $mempoolTestnetLightning; 8 | 9 | proxy_set_header Host $host; 10 | proxy_set_header X-Real-IP $remote_addr; 11 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 | proxy_set_header X-Forwarded-Proto $scheme; 13 | 14 | proxy_cache_background_update off; 15 | proxy_cache_use_stale error; 16 | proxy_cache apiwarm; 17 | proxy_cache_valid 200 10s; 18 | proxy_redirect off; 19 | 20 | expires 10s; 21 | } 22 | -------------------------------------------------------------------------------- /production/nginx/server-esplora.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 127.0.0.1:4000; 3 | access_log /dev/null; 4 | location / { 5 | proxy_pass http://esplora-bitcoin-mainnet; 6 | } 7 | } 8 | server { 9 | listen 127.0.0.1:4001; 10 | access_log /dev/null; 11 | location / { 12 | proxy_pass http://esplora-liquid-mainnet; 13 | } 14 | } 15 | server { 16 | listen 127.0.0.1:4002; 17 | access_log /dev/null; 18 | location / { 19 | proxy_pass http://esplora-bitcoin-testnet; 20 | } 21 | } 22 | server { 23 | listen 127.0.0.1:4003; 24 | access_log /dev/null; 25 | location / { 26 | proxy_pass http://esplora-bitcoin-signet; 27 | } 28 | } 29 | server { 30 | listen 127.0.0.1:4004; 31 | access_log /dev/null; 32 | location / { 33 | proxy_pass http://esplora-liquid-testnet; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /production/nginx/server-liquid.conf: -------------------------------------------------------------------------------- 1 | include mempool/production/nginx/server-common.conf; 2 | include mempool/production/nginx/location-api-v1-services.conf; 3 | include mempool/production/nginx/location-api.conf; 4 | include mempool/production/nginx/location-liquid-api.conf; 5 | include mempool/production/nginx/location-liquidtestnet-api.conf; 6 | -------------------------------------------------------------------------------- /production/nginx/server-mempool.conf: -------------------------------------------------------------------------------- 1 | include mempool/production/nginx/server-common.conf; 2 | include mempool/production/nginx/location-redirects.conf; 3 | include mempool/production/nginx/location-api-v1-services.conf; 4 | include mempool/production/nginx/location-api-v1-lightning.conf; 5 | include mempool/production/nginx/location-api.conf; 6 | include mempool/production/nginx/location-testnet-api.conf; 7 | include mempool/production/nginx/location-testnet-api-v1-lightning.conf; 8 | include mempool/production/nginx/location-testnet4-api.conf; 9 | #include mempool/production/nginx/location-testnet4-api-v1-lightning.conf; 10 | include mempool/production/nginx/location-signet-api.conf; 11 | include mempool/production/nginx/location-signet-api-v1-lightning.conf; 12 | -------------------------------------------------------------------------------- /production/nginx/upstream-esplora.conf: -------------------------------------------------------------------------------- 1 | upstream esplora-bitcoin-mainnet { 2 | server unix:/bitcoin/socket/esplora-bitcoin-mainnet fail_timeout=10s max_fails=10 weight=99999; 3 | } 4 | upstream esplora-liquid-mainnet { 5 | server unix:/elements/socket/esplora-elements-liquid fail_timeout=10s max_fails=10 weight=99999; 6 | } 7 | upstream esplora-bitcoin-testnet { 8 | server unix:/bitcoin/socket/esplora-bitcoin-testnet fail_timeout=10s max_fails=10 weight=99999; 9 | } 10 | upstream esplora-bitcoin-testnet4 { 11 | server unix:/bitcoin/socket/esplora-bitcoin-testnet4 fail_timeout=10s max_fails=10 weight=99999; 12 | } 13 | upstream esplora-bitcoin-signet { 14 | server unix:/bitcoin/socket/esplora-bitcoin-signet fail_timeout=10s max_fails=10 weight=99999; 15 | } 16 | upstream esplora-liquid-testnet { 17 | server unix:/elements/socket/esplora-elements-liquidtestnet fail_timeout=10s max_fails=10 weight=99999; 18 | } 19 | -------------------------------------------------------------------------------- /production/sysctl.conf: -------------------------------------------------------------------------------- 1 | net.inet.tcp.fast_finwait2_recycle=1 2 | kern.ipc.soacceptqueue=1024 3 | -------------------------------------------------------------------------------- /production/syslog.conf: -------------------------------------------------------------------------------- 1 | local7.>=err |/usr/local/bin/sudo -u mempool /usr/local/bin/mempool-logger mempool.ops alerts 2 | local7.>=info |/usr/local/bin/sudo -u mempool /usr/local/bin/mempool-logger mempool.ops node100 3 | local7.>=info /var/log/mempool 4 | local7.* /var/log/mempool.debug 5 | -------------------------------------------------------------------------------- /production/torrc: -------------------------------------------------------------------------------- 1 | RunAsDaemon 1 2 | SOCKSPort 9050 3 | ControlPort 9051 4 | Log notice syslog 5 | 6 | DataDirectory __TOR_RESOURCES__ 7 | DataDirectoryGroupReadable 1 8 | 9 | CookieAuthentication 1 10 | CookieAuthFile __TOR_RESOURCES__/control_auth_cookie 11 | CookieAuthFileGroupReadable 1 12 | 13 | HiddenServiceDir __TOR_RESOURCES__/mempool 14 | HiddenServicePort 80 127.0.0.1:81 15 | HiddenServiceVersion 3 16 | -------------------------------------------------------------------------------- /production/unfurler-config.liquid.json: -------------------------------------------------------------------------------- 1 | { 2 | "SERVER": { 3 | "HOST": "https://liquid.fra.mempool.space", 4 | "HTTP_PORT": 8003 5 | }, 6 | "MEMPOOL": { 7 | "HTTP_HOST": "http://127.0.0.1", 8 | "HTTP_PORT": 83, 9 | "NETWORK": "liquid" 10 | }, 11 | "PUPPETEER": { 12 | "CLUSTER_SIZE": 8, 13 | "EXEC_PATH": "/usr/local/bin/chrome", 14 | "MAX_PAGE_AGE": 86400, 15 | "RENDER_TIMEOUT": 3000 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /production/unfurler-config.mainnet.json: -------------------------------------------------------------------------------- 1 | { 2 | "SERVER": { 3 | "HOST": "https://mempool.tk7.mempool.space", 4 | "HTTP_PORT": 8001 5 | }, 6 | "MEMPOOL": { 7 | "HTTP_HOST": "http://127.0.0.1", 8 | "HTTP_PORT": 81, 9 | "NETWORK": "bitcoin" 10 | }, 11 | "PUPPETEER": { 12 | "CLUSTER_SIZE": 8, 13 | "EXEC_PATH": "/usr/local/bin/chrome", 14 | "MAX_PAGE_AGE": 86400, 15 | "RENDER_TIMEOUT": 3000 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /production/unfurler-config.onbtc.json: -------------------------------------------------------------------------------- 1 | { 2 | "SERVER": { 3 | "HOST": "https://onbtc.tk7.mempool.space", 4 | "HTTP_PORT": 8004 5 | }, 6 | "MEMPOOL": { 7 | "HTTP_HOST": "http://127.0.0.1", 8 | "HTTP_PORT": 84, 9 | "NETWORK": "onbtc" 10 | }, 11 | "PUPPETEER": { 12 | "CLUSTER_SIZE": 8, 13 | "EXEC_PATH": "/usr/local/bin/chrome", 14 | "MAX_PAGE_AGE": 86400, 15 | "RENDER_TIMEOUT": 3000 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /rust/gbt/.gitignore: -------------------------------------------------------------------------------- 1 | package-lock.json 2 | index.js 3 | index.d.ts 4 | *.node 5 | **/node_modules 6 | **/target 7 | **/.DS_Store 8 | npm-debug.log* 9 | -------------------------------------------------------------------------------- /rust/gbt/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "gbt" 3 | version = "1.0.0" 4 | description = "An efficient re-implementation of the getBlockTemplate algorithm in Rust" 5 | authors = ["mononaut"] 6 | edition = "2021" 7 | publish = false 8 | 9 | [lib] 10 | crate-type = ["cdylib"] 11 | 12 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 13 | 14 | [dependencies] 15 | priority-queue = "2.0.2" 16 | bytes = "1.4.0" 17 | napi = { version = "2.0", features = ["napi8", "tokio_rt"] } 18 | napi-derive = "2.0" 19 | bytemuck = "1.13.1" 20 | tracing = "0.1.36" 21 | tracing-log = "0.2.0" 22 | tracing-subscriber = { version = "0.3.15", features = ["env-filter"]} 23 | 24 | [build-dependencies] 25 | napi-build = "2.0" 26 | 27 | [profile.release] 28 | lto = true 29 | codegen-units = 1 30 | -------------------------------------------------------------------------------- /rust/gbt/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | napi_build::setup(); 3 | } 4 | -------------------------------------------------------------------------------- /rust/gbt/rust-toolchain: -------------------------------------------------------------------------------- 1 | 1.63 2 | -------------------------------------------------------------------------------- /rust/gbt/src/thread_acceleration.rs: -------------------------------------------------------------------------------- 1 | use napi_derive::napi; 2 | 3 | #[derive(Debug)] 4 | #[napi(object)] 5 | pub struct ThreadAcceleration { 6 | pub uid: u32, 7 | pub delta: f64, // fee delta 8 | } 9 | -------------------------------------------------------------------------------- /rust/gbt/src/thread_transaction.rs: -------------------------------------------------------------------------------- 1 | use napi_derive::napi; 2 | 3 | #[derive(Debug)] 4 | #[napi(object)] 5 | pub struct ThreadTransaction { 6 | pub uid: u32, 7 | pub order: u32, 8 | pub fee: f64, 9 | pub weight: u32, 10 | pub sigops: u32, 11 | pub effective_fee_per_vsize: f64, 12 | pub inputs: Vec, 13 | } 14 | -------------------------------------------------------------------------------- /scripts/get_backend_hash.sh: -------------------------------------------------------------------------------- 1 | for LOCATION in fmt va1 fra tk7 2 | do 3 | for NODE in 201 202 203 204 205 206 4 | do 5 | echo $(curl -sk https://node$NODE.$LOCATION.mempool.space/api/v1/backend-info) 6 | done 7 | done -------------------------------------------------------------------------------- /scripts/get_block_tip_height.sh: -------------------------------------------------------------------------------- 1 | BASE_HEIGHT=$(curl -sk https://node202.tk7.mempool.space/api/v1/blocks/tip/height) 2 | IN_SYNC=true 3 | echo "Base height (node202.tk7): $BASE_HEIGHT" 4 | 5 | for LOCATION in fmt va1 fra tk7 6 | do 7 | for NODE in 201 202 203 204 205 206 8 | do 9 | NODE_HEIGHT=$(curl -sk https://node$NODE.$LOCATION.mempool.space/api/v1/blocks/tip/height) 10 | echo $(echo node$NODE.$LOCATION.mempool.space) - $NODE_HEIGHT 11 | if [ "$NODE_HEIGHT" -ne "$BASE_HEIGHT" ]; then 12 | COUNT=$((BASE_HEIGHT-NODE_HEIGHT)) 13 | echo $(echo node$NODE.$LOCATION.mempool.space) is not in sync. delta: $COUNT 14 | IN_SYNC=false 15 | fi 16 | done 17 | done 18 | 19 | if [ "$IN_SYNC" = false ]; then 20 | echo "One or more servers are out of sync. Check the logs." 21 | exit -1 22 | else 23 | echo "All servers are in sync." 24 | fi 25 | 26 | -------------------------------------------------------------------------------- /unfurler/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | 18 | -------------------------------------------------------------------------------- /unfurler/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /unfurler/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # production config and external assets 4 | config.json 5 | 6 | # compiled output 7 | /dist 8 | /tmp 9 | 10 | # dependencies 11 | /node_modules 12 | 13 | # IDEs and editors 14 | /.idea 15 | .project 16 | .classpath 17 | .c9/ 18 | *.launch 19 | .settings/ 20 | 21 | # IDE - VSCode 22 | .vscode/* 23 | !.vscode/settings.json 24 | !.vscode/tasks.json 25 | !.vscode/launch.json 26 | !.vscode/extensions.json 27 | 28 | # misc 29 | /.sass-cache 30 | /connect.lock 31 | /libpeerconnection.log 32 | npm-debug.log 33 | testem.log 34 | /typings 35 | 36 | #System Files 37 | .DS_Store 38 | Thumbs.db 39 | -------------------------------------------------------------------------------- /unfurler/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /unfurler/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "printWidth": 80, 4 | "tabWidth": 2, 5 | "trailingComma": "es5" 6 | } 7 | -------------------------------------------------------------------------------- /unfurler/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "types": ["node"], 4 | "module": "commonjs", 5 | "target": "esnext", 6 | "lib": ["es2019", "dom"], 7 | "strict": true, 8 | "noImplicitAny": false, 9 | "sourceMap": false, 10 | "outDir": "dist", 11 | "moduleResolution": "node", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "allowSyntheticDefaultImports": true, 16 | "esModuleInterop": true 17 | }, 18 | "include": [ 19 | "src/**/*.ts" 20 | ], 21 | "exclude": [ 22 | "dist/**" 23 | ] 24 | } --------------------------------------------------------------------------------