From ce8b11afa156debb8fcfd5ccf3c3bc163695a703 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 15 Mar 2025 11:57:24 +0700 Subject: [PATCH] update bitcoin core (#14) * Update Footer Date, Add Blog to Useful links(hamburger), fix blockstream Explorer logo UI bug (#434) Co-authored-by: Adebayo Oriyomi * Switch to cloud runners + add Retry (#436) * Nginx: Add client timeouts and add rate limiter to more endpoints * gitlab CI: switch to cloud --------- Co-authored-by: nitramiz * Fix/err in windows installtion (#439) * Fix/err windows * Update package.json * Update client/package.json combined commands Co-authored-by: Chase --------- Co-authored-by: Chase * Revert "Fix/err in windows installtion (#439)" This reverts commit 5a179c62df10c66017754518395a3a45914e9098. * allow nodes to add each other * CI: upgrade to latest versions for terraform/docker/etc. * addnodes: patch rogue $ * addnode: use backend service * addnode: testnet port fix * Add gitlab/ to .dockerignore * Rewrite CI Split .gitlab-ci.yaml into multiple files Convert reused job definitions into functions Start using BUILDKIT Start building on branches only, not tags * bitcoind configs: set maxmempool to 1000 MB * CI: Pull recently built image, then tag and push :latest Add compare_to: master to the build_base job * CI: Allow prod deploy jobs to use docker commands * CI: Decrease LIQT initial_delay_sec * TF: Add a CDN policy that stores entire query string in cache keys * TF: Change root/data disk types based on network * CI: Remove EU staging cluster from deploy jobs * Display BTC amounts with full decimal precision Signed-off-by: Nadav Ivgi * TF: Increase btc-mainnet root disk size * Nginx: Impose stricter rate limiting lower rate limit + allow separate region for mainnet * main: true up tf * main: ignore_changes needs to be a list * main: bump electrum-server to an e2-standard-2 * Update the Liquid assets registry pubkey Same key (A1DF83770F29548228170D63DBABBA3AD525ACA1), with the expiry date extended (2023-06-01 -> 2025-06-01). * Liquid: Make assets poller do a shallow clone * elements: v22.1.1 upgrade * Update Liquid conf Allow setting lower tx fees for relay and block creation * Set RPC port for Liquid Testnet * Update blockstream jade URL (#462) * build: update bitcoin core to v24.1, rebase savefeeestimate patch * deps: Update electrs PRs: 56 and 58 * CI: Allow setting a specific base image tag as CI var Default is latest * (nitram) contrib: Add blockmintxfee, minrelaytxfee to all Liquid flavors * TF: Add log rotate to explorer.service and reduce root disk size * TF: Set existing security policy for Bitcoin Mainnet * npm: update shrink * fix: typos in the documentation (#472) * fix typo 0001-add-support-to-save-fee-estimates-without-shutting-d.patch * fix typo runit_boot.sh * docs: Mention pre-built docker image in README (#465) Refs #459 * Disable Elements unblinding in the server-side rendering environment (#466) Attempting to access the URL hash fragment (`location.hash`) on the server-side was causing an error, because it is not available there. Unblinding should only be done on the client-side for privacy reasons anyway, so this feature can be disabled entirely on the server-side. * TF: Bump tor image * replaced Twitter with X (#482) Co-authored-by: Serhii Prykhozhyi * Update electrs to 49a71805a2 and rust to 1.75.0 (#483) * Set real IP from GLB * TF: Add truncate error log service/timer * update electrs to include economical fee estimation * TF: Disable GCLB CDN * liquid: addnode the seed bridges (#500) * migrating IP addresses * added robots.txt for disallowing crawling of the nojs version * update typography - replace fonts with open source fonts ChakraPetch-Bold and Inter-VariableFont_opsz - update css classes to use new fonts - update header copyright date - adjust spacing - added plus/minus icons * TF: Remove preemptible MIGs * Update electrs to 306f66acf2ab1 * prerender: Wait for the loading state to complete, fix 404 Prior to this fix, `render()` preemptively considered the app rendering to be final, before completing the transition out of the loading state entirely. This resulted in notFound pages not being identified as such, returning them with a 200 OK status code instead of a 404 Not Found. * prerender: Reply with the HTTP error status code returned from the API * Delete electrum-lb VM * terraform: migrated to different solution (#537) * fix docker service stop * longer bitcoin shutdown wait (5 minutes) * Docker: make available as ARM64 (#538) * CI: set up arm64 build * fee_estimates: clean up usage * deps: Bump Elements to 23.2.4 * misc: Update Testnet Asset Registry signing pubkey * liquid: add discount_vsize and discount_weight to tx display * add a new landing page for the explorer api * update icons and add a running line of logos on mobile * connect infinite scroll in a simpler way * add support email * update typography for mobile and content * add nunchuk logo * update hero, add new logo, update styling, update footer * add laser lines * add the page title and STATIC_ROOT to static file path * fix the overflowing style issue and update the generic landing term * add assets and styling for the light mode * increase the vibrancy/brightness of the coloured areas * remove Signet * add colored text to the pricing section in light mode * update text of the pricing section card * update copy * reduce right margin for subnav links * display 2 decimals for fee rate (up from 1) * update right margin for the subnav link --------- Signed-off-by: Nadav Ivgi Co-authored-by: Adebayo Oriyomi Co-authored-by: Adebayo Oriyomi Co-authored-by: Chase Co-authored-by: nitramiz Co-authored-by: Siddhesh Bhupendra Kuakde Co-authored-by: Chase Co-authored-by: Byron Hambly Co-authored-by: Nadav Ivgi Co-authored-by: Philippe McLean Co-authored-by: Lawrence Nahum Co-authored-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Co-authored-by: Serhii Prykhozhyi Co-authored-by: Serhii Prykhozhyi Co-authored-by: Riccardo Casatta Co-authored-by: Nicola Busanello --- .dockerignore | 1 + .gitlab-ci.yml | 529 +- Dockerfile | 4 +- Dockerfile.deps | 65 +- README.md | 2 + client/npm-shrinkwrap.json | 1326 +- client/src/app.js | 5 +- client/src/run-server.js | 6 +- client/src/util.js | 12 +- client/src/views/addr.js | 17 +- client/src/views/asset-list.js | 2 +- client/src/views/asset.js | 11 +- client/src/views/block.js | 21 +- client/src/views/blocks.js | 29 +- client/src/views/error.js | 2 +- client/src/views/footer.js | 6 +- client/src/views/index.js | 1 + client/src/views/lander.js | 212 + client/src/views/mempool.js | 4 +- client/src/views/nav-toggle.js | 29 +- client/src/views/navbar-menu.js | 2 +- client/src/views/sub-navbar.js | 3 +- client/src/views/transactions.js | 12 +- client/src/views/tx.js | 24 +- client/src/views/util.js | 9 +- ...ave-fee-estimates-without-shutting-d.patch | 6 +- contrib/asset_registry_pubkey.asc | 8 +- contrib/asset_registry_testnet_pubkey.asc | 11 +- contrib/bitcoin-mainnet-explorer.conf.in | 1 + contrib/bitcoin-regtest-explorer.conf.in | 1 + contrib/bitcoin-signet-explorer.conf.in | 1 + contrib/bitcoin-testnet-explorer.conf.in | 1 + contrib/liquid-mainnet-explorer.conf.in | 11 + contrib/liquid-mainnet-private-bridge.conf.in | 2 + contrib/liquid-mainnet-public-bridge.conf.in | 2 + contrib/liquid-regtest-explorer.conf.in | 2 + contrib/liquid-testnet-explorer.conf.in | 5 +- contrib/nginx-sync.conf.in | 21 +- contrib/nginx.conf.in | 34 +- contrib/runit_boot.sh | 24 +- contrib/runits/liquid-assets-poller.runit | 2 +- flavors/blockstream/config.env | 4 +- flavors/blockstream/extras.css | 44 +- .../www/img/icons/dark-logo-icon.svg | 5 + .../www/img/icons/explorer_dark_logo.svg | 141 +- .../www/img/icons/explorer_logo.svg | 141 +- .../www/img/icons/light-logo-icon.svg | 5 + flavors/blockstream/www/img/t1witter_blue.png | Bin 441 -> 0 bytes flavors/blockstream/www/img/x-white.svg | 3 + flavors/liquid-mainnet/extras.css | 1 + gitlab/build.yml | 44 + npm-shrinkwrap.json | 10853 +++++++++------- prerender-server/npm-shrinkwrap.json | 314 +- run.sh | 9 +- terraform/.terraform.lock.hcl | 57 - terraform/data.tf | 44 - terraform/kms.tf | 14 - terraform/main.tf | 159 +- .../modules/daemon/cloud-config/daemon.yml | 127 - terraform/modules/daemon/data.tf | 25 - terraform/modules/daemon/firewall.tf | 55 - terraform/modules/daemon/iam.tf | 14 - terraform/modules/daemon/main.tf | 110 - terraform/modules/daemon/network.tf | 85 - terraform/modules/daemon/outputs.tf | 11 - terraform/modules/daemon/preemptible.tf | 88 - terraform/modules/daemon/variables.tf | 92 - .../modules/electrum/cloud-init/electrum.yml | 116 - terraform/modules/electrum/data.tf | 13 - terraform/modules/electrum/firewall.tf | 17 - terraform/modules/electrum/iam.tf | 14 - terraform/modules/electrum/main.tf | 70 - terraform/modules/electrum/outputs.tf | 3 - terraform/modules/electrum/variables.tf | 48 - terraform/modules/prometheus/firewall.tf | 8 +- terraform/modules/prometheus/iam.tf | 8 +- terraform/modules/prometheus/main.tf | 18 +- terraform/modules/prometheus/outputs.tf | 2 +- terraform/modules/prometheus/variables.tf | 15 +- terraform/modules/tor/cloud-init/tor.yaml | 166 - terraform/modules/tor/data.tf | 27 - terraform/modules/tor/firewall.tf | 55 - terraform/modules/tor/iam.tf | 25 - terraform/modules/tor/main.tf | 62 - terraform/modules/tor/v2.pk | 1 - terraform/modules/tor/v3.pk | 1 - terraform/modules/tor/v3.pubk | 1 - terraform/modules/tor/variables.tf | 78 - terraform/network-electrs.tf | 143 - terraform/network-onion-electrs.tf | 69 - terraform/network-onion.tf | 91 - terraform/network.tf | 103 - terraform/outputs.tf | 31 - terraform/variables.tf | 156 +- www/font/ChakraPetch-Bold.ttf | Bin 0 -> 71436 bytes www/font/Inter-VariableFont_opsz,wght.ttf | Bin 0 -> 874708 bytes www/img/ellipse-2.svg | 12 + www/img/ellipse.svg | 12 + www/img/explorer-laser-lines.svg | 87 + www/img/hero-explorer-api.svg | 2222 ++++ www/img/icons/database.svg | 25 + www/img/icons/encryption.svg | 23 + www/img/icons/integrate.svg | 11 + www/img/icons/integration.svg | 27 + www/img/icons/issuance.svg | 24 + www/img/icons/lbtc.svg | 23 + www/img/icons/minus.png | Bin 122 -> 93 bytes www/img/icons/plus.png | Bin 190 -> 123 bytes www/img/icons/pricing1.svg | 5 + www/img/icons/pricing2.svg | 7 + www/img/icons/privacy.svg | 21 + www/img/icons/redundancy.svg | 21 + www/img/icons/rest-api.svg | 3 + www/img/icons/security-tokens.svg | 25 + www/img/logos/aqua-dark.svg | 14 + www/img/logos/aqua.svg | 14 + www/img/logos/bitcoin-dev-kit-dark.svg | 18 + www/img/logos/bitcoin-dev-kit.svg | 18 + www/img/logos/blockstream-green-dark.svg | 20 + www/img/logos/blockstream-green.svg | 20 + www/img/logos/bull-bitcoin.svg | 30 + www/img/logos/lwk-dark.svg | 18 + www/img/logos/lwk.svg | 18 + www/img/logos/nunchuk-dark.svg | 17 + www/img/logos/nunchuk.svg | 19 + www/img/logos/sideswap-dark.svg | 24 + www/img/logos/sideswap.svg | 24 + www/img/logos/sparrow-dark.png | Bin 0 -> 3788 bytes www/img/logos/sparrow.png | Bin 0 -> 4324 bytes www/img/rest-api-cta.svg | 463 + www/js/infinite-scroll.js | 73 + www/light-theme_style.css | 21 +- www/robots.txt | 2 + www/style.css | 973 +- 134 files changed, 12237 insertions(+), 8349 deletions(-) create mode 100644 client/src/views/lander.js create mode 100644 flavors/blockstream/www/img/icons/dark-logo-icon.svg create mode 100644 flavors/blockstream/www/img/icons/light-logo-icon.svg delete mode 100644 flavors/blockstream/www/img/t1witter_blue.png create mode 100644 flavors/blockstream/www/img/x-white.svg create mode 100644 gitlab/build.yml delete mode 100644 terraform/.terraform.lock.hcl delete mode 100644 terraform/kms.tf delete mode 100644 terraform/modules/daemon/cloud-config/daemon.yml delete mode 100644 terraform/modules/daemon/data.tf delete mode 100644 terraform/modules/daemon/firewall.tf delete mode 100644 terraform/modules/daemon/iam.tf delete mode 100644 terraform/modules/daemon/main.tf delete mode 100644 terraform/modules/daemon/network.tf delete mode 100644 terraform/modules/daemon/outputs.tf delete mode 100644 terraform/modules/daemon/preemptible.tf delete mode 100644 terraform/modules/daemon/variables.tf delete mode 100644 terraform/modules/electrum/cloud-init/electrum.yml delete mode 100644 terraform/modules/electrum/data.tf delete mode 100644 terraform/modules/electrum/firewall.tf delete mode 100644 terraform/modules/electrum/iam.tf delete mode 100644 terraform/modules/electrum/main.tf delete mode 100644 terraform/modules/electrum/outputs.tf delete mode 100644 terraform/modules/electrum/variables.tf delete mode 100644 terraform/modules/tor/cloud-init/tor.yaml delete mode 100644 terraform/modules/tor/data.tf delete mode 100644 terraform/modules/tor/firewall.tf delete mode 100644 terraform/modules/tor/iam.tf delete mode 100644 terraform/modules/tor/main.tf delete mode 100644 terraform/modules/tor/v2.pk delete mode 100644 terraform/modules/tor/v3.pk delete mode 100644 terraform/modules/tor/v3.pubk delete mode 100644 terraform/modules/tor/variables.tf delete mode 100644 terraform/network-electrs.tf delete mode 100644 terraform/network-onion-electrs.tf delete mode 100644 terraform/network-onion.tf delete mode 100644 terraform/network.tf create mode 100644 www/font/ChakraPetch-Bold.ttf create mode 100644 www/font/Inter-VariableFont_opsz,wght.ttf create mode 100644 www/img/ellipse-2.svg create mode 100644 www/img/ellipse.svg create mode 100644 www/img/explorer-laser-lines.svg create mode 100644 www/img/hero-explorer-api.svg create mode 100644 www/img/icons/database.svg create mode 100644 www/img/icons/encryption.svg create mode 100644 www/img/icons/integrate.svg create mode 100644 www/img/icons/integration.svg create mode 100644 www/img/icons/issuance.svg create mode 100644 www/img/icons/lbtc.svg create mode 100644 www/img/icons/pricing1.svg create mode 100644 www/img/icons/pricing2.svg create mode 100644 www/img/icons/privacy.svg create mode 100644 www/img/icons/redundancy.svg create mode 100644 www/img/icons/rest-api.svg create mode 100644 www/img/icons/security-tokens.svg create mode 100644 www/img/logos/aqua-dark.svg create mode 100644 www/img/logos/aqua.svg create mode 100644 www/img/logos/bitcoin-dev-kit-dark.svg create mode 100644 www/img/logos/bitcoin-dev-kit.svg create mode 100644 www/img/logos/blockstream-green-dark.svg create mode 100644 www/img/logos/blockstream-green.svg create mode 100644 www/img/logos/bull-bitcoin.svg create mode 100644 www/img/logos/lwk-dark.svg create mode 100644 www/img/logos/lwk.svg create mode 100644 www/img/logos/nunchuk-dark.svg create mode 100644 www/img/logos/nunchuk.svg create mode 100644 www/img/logos/sideswap-dark.svg create mode 100644 www/img/logos/sideswap.svg create mode 100644 www/img/logos/sparrow-dark.png create mode 100644 www/img/logos/sparrow.png create mode 100644 www/img/rest-api-cta.svg create mode 100644 www/js/infinite-scroll.js create mode 100644 www/robots.txt diff --git a/.dockerignore b/.dockerignore index 215942bf..8a5a20c6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -16,3 +16,4 @@ data_liquid_regtest www/libwally data_liquid_testnet data_bitcoin_signet +gitlab/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 230ee4de..b1c8875a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,501 +1,44 @@ variables: - CI_DISPOSABLE_ENVIRONMENT: "true" - DOCKER_DRIVER: overlay2 - DOCKER_HOST: tcp://localhost:2375 + DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" + DOCKER_BUILDKIT: 1 + CI_DISPOSABLE_ENVIRONMENT: "true" + BULLSEYE_IMAGE: debian:bullseye@sha256:4d6ab716de467aad58e91b1b720f0badd7478847ec7a18f66027d0f8a329a43c + IMAGE_BASE: blockstream/esplora-base + IMAGE: blockstream/esplora + DOCKERHUB_ESPLORA_URL: "https://hub.docker.com/v2/repositories/blockstream/esplora/tags/" -image: blockstream/gcloud-docker@sha256:b714bd30f6686816fd3dd68b0a7ccf2f422f6f4aab0b0a74b99eeec4e40cc05e -stages: - - build - - plan - - deploy - -before_script: - - TMPF=$(mktemp) || exit 1 - - echo $GCLOUD_KEY > $TMPF - - export GOOGLE_APPLICATION_CREDENTIALS=$TMPF - - gcloud auth activate-service-account --key-file=$TMPF - - gcloud auth list - - gcloud --version - -test_docker_build_image: - image: docker@sha256:16a1f4b3e64c5a8e1ac80987bc2b8907dbc1c79c1b13be0781f4d24a2072e698 - stage: build - tags: - - k8s-docker - services: - - docker:20.10.12-dind - before_script: - - echo "Disabling before script" - except: - - tags - - master - script: - - docker pull blockstream/esplora-base:latest - - docker pull blockstream/esplora:latest - - docker build - --network=host - --cache-from blockstream/esplora-base:latest - -f Dockerfile.deps - -t esplora-base . - - docker build - --network=host - --build-arg FOOT_HTML='' - --cache-from blockstream/esplora:latest - -t esplora . - - docker rmi esplora-base || true - - docker rmi esplora || true - -build_staging: - stage: build - tags: - - k8s-docker - services: - - docker:20.10.12-dind - only: - - /^staging_bitcoin_mainnet.*/ - - /^staging_bitcoin_testnet.*/ - - /^staging_liquid_mainnet.*/ - - /^staging_liquid_testnet.*/ - script: - - docker pull debian:bullseye || true - - docker pull blockstream/esplora-base:latest || true - - docker build --network=host --cache-from blockstream/esplora-base:latest -t blockstream/esplora-base:$CI_COMMIT_REF_SLUG -t blockstream/esplora-base:latest -f Dockerfile.deps . - - docker push blockstream/esplora-base:$CI_COMMIT_REF_SLUG - - esplora_base_sha=$(docker inspect --format='{{index .RepoDigests 0}}' blockstream/esplora-base:$CI_COMMIT_REF_SLUG) - - sed -i "s~blockstream/esplora-base:latest~${esplora_base_sha}~g" Dockerfile - - curl "https://hub.docker.com/v2/repositories/blockstream/esplora/tags/" | grep -q "$CI_COMMIT_SHA" || ( - docker pull blockstream/esplora:latest - && docker build - --network=host - --build-arg FOOT_HTML='' - --cache-from blockstream/esplora:latest - -t blockstream/esplora:$CI_COMMIT_SHA . - && docker push blockstream/esplora:$CI_COMMIT_SHA) - -build: - stage: build - tags: - - k8s-docker - services: - - docker:20.10.12-dind - only: - - /^bitcoin_mainnet.*/ - - /^bitcoin_testnet.*/ - - /^liquid_mainnet.*/ - - /^liquid_testnet.*/ - - master@greenaddress/esplora - script: - - docker pull debian:bullseye || true - - docker pull blockstream/esplora-base:latest || true - - docker build --network=host --cache-from blockstream/esplora-base:latest -t blockstream/esplora-base:$CI_COMMIT_REF_SLUG -t blockstream/esplora-base:latest -f Dockerfile.deps . - - docker push blockstream/esplora-base:latest - - esplora_base_sha=$(docker inspect --format='{{index .RepoDigests 0}}' blockstream/esplora-base:$CI_COMMIT_REF_SLUG) - - sed -i "s~blockstream/esplora-base:latest~${esplora_base_sha}~g" Dockerfile - - curl "https://hub.docker.com/v2/repositories/blockstream/esplora/tags/" | grep -q "$CI_COMMIT_SHA" || ( - docker pull blockstream/esplora:latest - && docker build - --network=host - --build-arg FOOT_HTML='' - --cache-from blockstream/esplora:latest - -t blockstream/esplora:latest . - && docker push blockstream/esplora:latest - && docker build - --network=host - --build-arg FOOT_HTML='' - --cache-from blockstream/esplora:latest - -t blockstream/esplora:$CI_COMMIT_SHA . - && docker push blockstream/esplora:$CI_COMMIT_SHA) - -plan: - except: - - /^bitcoin_mainnet.*/ - - /^bitcoin_testnet.*/ - - /^liquid_mainnet.*/ - - /^liquid_testnet.*/ - - master@greenaddress/esplora - only: - - branches@greenaddress/esplora - stage: plan - script: - - (echo -n "$V3_PK" > terraform/modules/tor/v3.pk) - - (echo -n "$V3_PUBK" > terraform/modules/tor/v3.pubk) - - (cd terraform && terraform init -input=false && - terraform workspace select main && - terraform init -input=false && - terraform plan - -var "prometheus_allowed_source_ip=$PROMETHEUS_ALLOWED_SOURCE_IP" - -var "hosts=$HOSTS" - -var "hosts_onion=$HOSTS_ONION" - -var "cluster_size=$NODE_CLUSTER_SIZE" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE" - -var "instance_type=$NODE_INSTANCE_TYPE" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "ssl_certs=$SSL_CERTS" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -input=false) - -plan_main: - stage: deploy - only: - - master@greenaddress/esplora - - /^main_v.*/ - script: - - (echo -n "$V3_PK" > terraform/modules/tor/v3.pk) - - (echo -n "$V3_PUBK" > terraform/modules/tor/v3.pubk) - - (cd terraform && terraform init -input=false && - terraform workspace select main && - terraform init -input=false && - terraform plan - -var "prometheus_allowed_source_ip=$PROMETHEUS_ALLOWED_SOURCE_IP" - -var "hosts=$HOSTS" - -var "hosts_onion=$HOSTS_ONION" - -var "cluster_size=$NODE_CLUSTER_SIZE" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE" - -var "instance_type=$NODE_INSTANCE_TYPE" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "ssl_certs=$SSL_CERTS" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -input=false) - -deploy_main: - when: manual - stage: deploy - only: - - master@greenaddress/esplora - - /^main_v.*/ - script: - - (echo -n "$V3_PK" > terraform/modules/tor/v3.pk) - - (echo -n "$V3_PUBK" > terraform/modules/tor/v3.pubk) - - (cd terraform && terraform init -input=false && - terraform workspace select main && - terraform init -input=false && - terraform apply - -var "prometheus_allowed_source_ip=$PROMETHEUS_ALLOWED_SOURCE_IP" - -var "hosts=$HOSTS" - -var "hosts_onion=$HOSTS_ONION" - -var "cluster_size=$NODE_CLUSTER_SIZE" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE" - -var "instance_type=$NODE_INSTANCE_TYPE" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "ssl_certs=$SSL_CERTS" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -input=false -auto-approve) - -plan_bitcoin_mainnet: - stage: deploy - only: - - /^bitcoin_mainnet.*/ - script: - - (cd terraform && terraform init -input=false && - terraform workspace select bitcoin-mainnet && - terraform init -input=false && - terraform plan - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_BTCM" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_BTCM" - -var "instance_type=$NODE_INSTANCE_TYPE_BTCM" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_BTCM" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=300" - -var "initial_delay_sec=1200" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/_sync" - -input=false) - -deploy_bitcoin_mainnet: - when: manual - stage: deploy - tags: - - k8s-docker - services: - - docker:20.10.12-dind - only: - - /^bitcoin_mainnet.*/ - script: - - docker pull blockstream/esplora:$CI_COMMIT_SHA - - docker tag blockstream/esplora:$CI_COMMIT_SHA blockstream/esplora:builder-bitcoin-mainnet - - docker push blockstream/esplora:builder-bitcoin-mainnet - - (cd terraform && terraform init -input=false && - terraform workspace select bitcoin-mainnet && - terraform init -input=false && - terraform apply - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_BTCM" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_BTCM" - -var "instance_type=$NODE_INSTANCE_TYPE_BTCM" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_BTCM" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=300" - -var "initial_delay_sec=1200" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/_sync" - -input=false -auto-approve) - -plan_bitcoin_testnet: - stage: deploy - only: - - /^bitcoin_testnet.*/ - script: - - (cd terraform && terraform init -input=false && - terraform workspace select bitcoin-testnet && - terraform init -input=false && - terraform plan - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_BTCT" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_BTCT" - -var "instance_type=$NODE_INSTANCE_TYPE_BTCT" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_BTCT" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=60" - -var "initial_delay_sec=600" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/testnet/_sync" - -input=false) - -deploy_bitcoin_testnet: - when: manual - stage: deploy - tags: - - k8s-docker - services: - - docker:20.10.12-dind - only: - - /^bitcoin_testnet.*/ - script: - - docker pull blockstream/esplora:$CI_COMMIT_SHA - - docker tag blockstream/esplora:$CI_COMMIT_SHA blockstream/esplora:builder-bitcoin-testnet - - docker push blockstream/esplora:builder-bitcoin-testnet - - (cd terraform && terraform init -input=false && - terraform workspace select bitcoin-testnet && - terraform init -input=false && - terraform apply - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_BTCT" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_BTCT" - -var "instance_type=$NODE_INSTANCE_TYPE_BTCT" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_BTCT" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=60" - -var "initial_delay_sec=600" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/testnet/_sync" - -input=false -auto-approve) - -plan_liquid_mainnet: - stage: deploy - only: - - /^liquid_mainnet.*/ - script: - - (cd terraform && terraform init -input=false && - terraform workspace select liquid-mainnet && - terraform init -input=false && - terraform plan - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_LQM" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_LQM" - -var "instance_type=$NODE_INSTANCE_TYPE_LQM" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_LQM" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=60" - -var "initial_delay_sec=900" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/liquid/_sync" - -input=false) - -deploy_liquid_mainnet: - when: manual - stage: deploy - tags: - - k8s-docker - services: - - docker:20.10.12-dind - only: - - /^liquid_mainnet.*/ - script: - - docker pull blockstream/esplora:$CI_COMMIT_SHA - - docker tag blockstream/esplora:$CI_COMMIT_SHA blockstream/esplora:builder-liquid-mainnet - - docker push blockstream/esplora:builder-liquid-mainnet - - (cd terraform && terraform init -input=false && - terraform workspace select liquid-mainnet && - terraform init -input=false && - terraform apply - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_LQM" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_LQM" - -var "instance_type=$NODE_INSTANCE_TYPE_LQM" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_LQM" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=60" - -var "initial_delay_sec=900" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/liquid/_sync" - -input=false -auto-approve) - -plan_liquid_testnet: - stage: deploy - only: - - /^liquid_testnet.*/ - script: - - (cd terraform && terraform init -input=false && - terraform workspace select liquid-testnet && - terraform init -input=false && - terraform plan - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_LQT" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_LQT" - -var "instance_type=$NODE_INSTANCE_TYPE_LQT" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_LQT" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=60" - -var "initial_delay_sec=900" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/liquidtestnet/_sync" - -input=false) - -deploy_liquid_testnet: - when: manual - stage: deploy - tags: - - k8s-docker +default: + image: docker:27 services: - - docker:20.10.12-dind - only: - - /^liquid_testnet.*/ - script: - - docker pull blockstream/esplora:$CI_COMMIT_SHA - - docker tag blockstream/esplora:$CI_COMMIT_SHA blockstream/esplora:builder-liquid-testnet - - docker push blockstream/esplora:builder-liquid-testnet - - (cd terraform && terraform init -input=false && - terraform workspace select liquid-testnet && - terraform init -input=false && - terraform apply - -var "docker_tag_explorer=blockstream/esplora:$CI_COMMIT_SHA" - -var "cluster_size=$NODE_CLUSTER_SIZE_LQT" - -var "preemptible_cluster_size=$NODE_PREEMPTIBLE_CLUSTER_SIZE_LQT" - -var "instance_type=$NODE_INSTANCE_TYPE_LQT" - -var "preemptible_instance_type=$NODE_PREEMPTIBLE_INSTANCE_TYPE_LQT" - -var "regions=$REGIONS" - -var "zones=$ZONES" - -var "min_ready_sec=60" - -var "initial_delay_sec=900" - -var "image_source_project=$IMAGE_SOURCE_PROJECT" - -var "mempooldat=$MEMPOOLDAT" - -var "fullurl=https://blockstream.info/liquidtestnet/_sync" - -input=false -auto-approve) - -deploy_staging_bitcoin_mainnet: - when: manual - stage: deploy - image: blockstream/kubectl:latest - tags: - - k8s - only: - - /^staging_bitcoin_mainnet.*/ - - master@greenaddress/esplora + - name: docker:27-dind + command: ["dockerd", "--host=tcp://0.0.0.0:2375"] + alias: "docker" before_script: - - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US version - - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU version - script: - - | - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_BITCOIN_MAINNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' - - | - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_BITCOIN_MAINNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' + - docker info + - docker buildx create + --driver=docker-container + --name=buildkit-builder + --use + --platform linux/amd64,linux/arm64 + tags: + - cloud + retry: + max: 2 + when: + - runner_system_failure + - unknown_failure + - stuck_or_timeout_failure -deploy_staging_bitcoin_testnet: - when: manual - stage: deploy - image: blockstream/kubectl:latest - tags: - - k8s - only: - - /^staging_bitcoin_testnet.*/ - - master@greenaddress/esplora - before_script: - - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US version - - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU version - script: - - | - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_BITCOIN_TESTNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' - - | - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_BITCOIN_TESTNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' +stages: + - build -deploy_staging_liquid_mainnet: - when: manual - stage: deploy - image: blockstream/kubectl:latest - tags: - - k8s - only: - - /^staging_liquid_mainnet.*/ - - master@greenaddress/esplora - before_script: - - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US version - - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU version - script: - - | - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_LIQUID_MAINNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' - - | - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_LIQUID_MAINNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' +include: + - "gitlab/**.yml" -deploy_staging_liquid_testnet: - when: manual - stage: deploy - image: blockstream/kubectl:latest - tags: - - k8s - only: - - /^staging_liquid_testnet.*/ - - master@greenaddress/esplora - before_script: - - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US version - - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU version - script: - - | - kubectl --server=$KUBE_SERVER_US --token=$KUBE_TOKEN_US -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_LIQUID_TESTNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' - - | - kubectl --server=$KUBE_SERVER_EU --token=$KUBE_TOKEN_EU -n $KUBE_NAMESPACE_STAGING \ - patch statefulset $KUBE_DEPLOYMENT_LIQUID_TESTNET \ - --patch="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/image\", \"value\":\"blockstream/esplora:$CI_COMMIT_SHA\"}]" \ - --type='json' +## disables MR-triggered pipelines and allows only branch-triggered pipelines +workflow: + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + when: never + - when: always diff --git a/Dockerfile b/Dockerfile index 76daab51..6f7b63a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM blockstream/esplora-base:latest AS build -FROM debian:bullseye@sha256:4d6ab716de467aad58e91b1b720f0badd7478847ec7a18f66027d0f8a329a43c +FROM debian:bookworm-slim COPY --from=build /srv/explorer /srv/explorer COPY --from=build /srv/wally_wasm /srv/wally_wasm @@ -20,9 +20,7 @@ WORKDIR /srv/explorer/source SHELL ["/bin/bash", "-c"] -# required to run some scripts as root (needed for docker) RUN source /root/.nvm/nvm.sh \ - && npm config set unsafe-perm true \ && npm install && (cd prerender-server && npm run dist) \ && DEST=/srv/explorer/static/bitcoin-mainnet \ npm run dist -- bitcoin-mainnet \ diff --git a/Dockerfile.deps b/Dockerfile.deps index d288a1d6..6695236d 100644 --- a/Dockerfile.deps +++ b/Dockerfile.deps @@ -1,6 +1,6 @@ # Build libwally wasm files. Used for client-side blinding verification on Elements-based chains -FROM greenaddress/wallycore@sha256:d63d222be12f6b2535e1548aa7f21cf649e2230d6c9e01bd518c23eb0bccd46f AS libwally-wasm +FROM blockstream/wallycore@sha256:62cc52bd3ad9176b55cb486482368f858a4debee248a15d2fada0a62eb074a05 AS libwally-wasm ARG NO_LIQUID ENV EXPORTED_FUNCTIONS="['_malloc', '_free', '_wally_init','_wally_asset_value_commitment','_wally_asset_generator_from_bytes']" ENV EXTRA_EXPORTED_RUNTIME_METHODS="['getValue', 'ccall']" @@ -12,7 +12,7 @@ RUN sh -c '[ -n "$NO_LIQUID" ] && mkdir -p /wally/wally_dist || ( \ && git submodule sync --recursive && git submodule update --init --recursive \ && ./tools/build_wasm.sh --enable-elements)' -FROM debian:bullseye@sha256:4d6ab716de467aad58e91b1b720f0badd7478847ec7a18f66027d0f8a329a43c +FROM debian:bookworm-slim SHELL ["/bin/bash", "-c"] ENV CORE_BUILD_DEPS="autoconf autotools-dev automake libtool pkg-config bsdmainutils build-essential" @@ -23,54 +23,49 @@ RUN mkdir -p /srv/explorer \ && apt-get -yqq install ${ESPLORA_BUILD_DEPS} tor ${CORE_BUILD_DEPS} -RUN git clone --quiet --depth 1 --single-branch --branch v0.39.0 https://github.com/nvm-sh/nvm.git /root/.nvm \ +RUN git clone --quiet --depth 1 --single-branch --branch v0.40.1 https://github.com/nvm-sh/nvm.git /root/.nvm \ && rm -rf /root/.nvm/.git \ && source /root/.nvm/nvm.sh \ - && nvm install v17.1.0 + && nvm install v18.20.4 -# Build core from sources until PR https://github.com/bitcoin/bitcoin/pull/23387 is merged -ENV CORE_PATCH=contrib/0001-add-support-to-save-fee-estimates-without-shutting-d.patch -ENV CORE_SRC=/root/bitcoin -COPY ${CORE_PATCH} /${CORE_PATCH} -RUN git clone --quiet --depth 1 --branch v24.0 --single-branch --recursive https://github.com/bitcoin/bitcoin.git ${CORE_SRC} \ - && (cd ${CORE_SRC} \ - && git checkout dd314fe0c2f64818d2789955a8ceef50d3d6597d \ - && git apply /${CORE_PATCH} \ - && (cd depends \ - && make HOST=x86_64-pc-linux-gnu NO_QT=1 -j $(nproc --all)) \ - && ./autogen.sh \ - && CONFIG_SITE=$PWD/depends/x86_64-pc-linux-gnu/share/config.site ./configure --prefix=/srv/explorer/bitcoin --disable-man --disable-zmq --disable-qt --disable-gui-tests --disable-bench \ - --enable-experimental-asm --without-utils --enable-util-cli --without-libs --with-daemon --disable-maintainer-mode \ - --disable-glibc-back-compat --disable-ccache --disable-dependency-tracking --disable-tests --with-gui=no \ - && make -j $(nproc --all) \ - && make install -j $(nproc --all) \ - && strip /srv/explorer/bitcoin/bin/* \ - && rm -fr ${CORE_SRC} /${CORE_PATCH}) +ARG TARGETARCH +ENV SHA256SUM_ELEMENTS_X86_64="6e0c747ec4ba4e54eb3426e7219354b5ea150b393a4e2b8a536cab64a5d9c7a8" +ENV SHA256SUM_ELEMENTS_ARM64="5c6f8219fd1baf4d4c2b05b6dd9ec71bb348754bd46aeb3faa7ba0ba69aff0e8" +ENV SHA256SUM_BITCOINCORE_X86_64="2a6974c5486f528793c79d42694b5987401e4a43c97f62b1383abf35bcee44a8" +ENV SHA256SUM_BITCOINCORE_ARM64="cb35e250ae9d0328aa90e7aad0b877ed692597420a1092e8ab1a5dd756209722" -#ENV SHA256SUM_BITCOINCORE=59ebd25dd82a51638b7a6bb914586201e67db67b919b2a1ff08925a7936d1b16 -#ENV VERSION_BITCOINCORE=22.0 -#RUN curl -sL -o bitcoin.tar.gz "https://bitcoincore.org/bin/bitcoin-core-${VERSION_BITCOINCORE}/bitcoin-${VERSION_BITCOINCORE}-x86_64-linux-gnu.tar.gz" \ -# && echo "${SHA256SUM_BITCOINCORE} bitcoin.tar.gz" | sha256sum --check \ -# && tar xzf bitcoin.tar.gz -C /srv/explorer \ -# && ln -s "/srv/explorer/bitcoin-${VERSION_BITCOINCORE}" /srv/explorer/bitcoin \ -# && rm bitcoin.tar.gz +ENV VERSION_BITCOINCORE=27.0 +RUN if [ "${TARGETARCH}" = "arm64" ]; then \ + curl -sL -o bitcoin.tar.gz "https://bitcoincore.org/bin/bitcoin-core-${VERSION_BITCOINCORE}/bitcoin-${VERSION_BITCOINCORE}-aarch64-linux-gnu.tar.gz"; \ + echo "${SHA256SUM_BITCOINCORE_ARM64} bitcoin.tar.gz" | sha256sum --check; \ + else \ + curl -sL -o bitcoin.tar.gz "https://bitcoincore.org/bin/bitcoin-core-${VERSION_BITCOINCORE}/bitcoin-${VERSION_BITCOINCORE}-x86_64-linux-gnu.tar.gz"; \ + echo "${SHA256SUM_BITCOINCORE_X86_64} bitcoin.tar.gz" | sha256sum --check; \ + fi \ + && tar xzf bitcoin.tar.gz -C /srv/explorer \ + && ln -s "/srv/explorer/bitcoin-${VERSION_BITCOINCORE}" /srv/explorer/bitcoin \ + && rm bitcoin.tar.gz -ENV SHA256SUM_ELEMENTS=0278017429236f2cc651bb746e8ae826b740811d73789d07d1682649f2414465 -ENV VERSION_ELEMENTS=22.0.2 -RUN curl -sL -o elements.tar.gz "https://github.com/ElementsProject/elements/releases/download/elements-${VERSION_ELEMENTS}/elements-${VERSION_ELEMENTS}-x86_64-linux-gnu.tar.gz" \ - && echo "${SHA256SUM_ELEMENTS} elements.tar.gz" | sha256sum --check \ +ENV VERSION_ELEMENTS=23.2.4 +RUN if [ "${TARGETARCH}" = "arm64" ]; then \ + curl -sL -o elements.tar.gz "https://github.com/ElementsProject/elements/releases/download/elements-${VERSION_ELEMENTS}/elements-${VERSION_ELEMENTS}-aarch64-linux-gnu.tar.gz"; \ + echo "${SHA256SUM_ELEMENTS_ARM64} elements.tar.gz" | sha256sum --check; \ + else \ + curl -sL -o elements.tar.gz "https://github.com/ElementsProject/elements/releases/download/elements-${VERSION_ELEMENTS}/elements-${VERSION_ELEMENTS}-x86_64-linux-gnu.tar.gz"; \ + echo "${SHA256SUM_ELEMENTS_X86_64} elements.tar.gz" | sha256sum --check; \ + fi \ && tar xzf elements.tar.gz -C /srv/explorer \ && ln -s "/srv/explorer/elements-${VERSION_ELEMENTS}" /srv/explorer/liquid \ && mv /srv/explorer/liquid/bin/{elementsd,liquidd} \ && mv /srv/explorer/liquid/bin/{elements-cli,liquid-cli} \ && rm elements.tar.gz -RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.65.0 +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.75.0 RUN source /root/.cargo/env \ && mkdir -p /srv/explorer/electrs{,_liquid} \ && git clone --no-checkout https://github.com/blockstream/electrs.git \ && (cd electrs \ - && git checkout a808b51d0d9301fa82390b985c57551966001f9b \ + && git checkout 306f66acf2ab10bcd99b8012e95a0de30b2cc012 \ && cp contrib/popular-scripts.txt /srv/explorer \ && cargo install --root /srv/explorer/electrs_bitcoin --locked --path . --features electrum-discovery \ && cargo install --root /srv/explorer/electrs_liquid --locked --path . --features electrum-discovery,liquid \ diff --git a/README.md b/README.md index f0721c77..9cb021b2 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,8 @@ be configured to the URL reachable by the server, typically `http://localhost:30 docker build -t esplora . ``` +Alternatively, you may use the pre-built [`blockstream/esplora` image](https://hub.docker.com/r/blockstream/esplora) from Docker Hub. + ## How to run the explorer for Bitcoin mainnet ``` diff --git a/client/npm-shrinkwrap.json b/client/npm-shrinkwrap.json index c530892f..9937fa03 100644 --- a/client/npm-shrinkwrap.json +++ b/client/npm-shrinkwrap.json @@ -1,168 +1,229 @@ { "name": "esplora-client", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/helper-annotate-as-pure": { + "packages": { + "": { + "name": "esplora-client", + "version": "0.1.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.12.11", + "@babel/polyfill": "^7.12.1", + "@cycle/dom": "^22.8.0", + "@cycle/history": "^7.4.0", + "@cycle/html": "^3.4.0", + "@cycle/http": "^15.4.0", + "@cycle/rxjs-run": "^10.5.0", + "@cycle/storage": "^5.1.2", + "babelify": "^10.0.0", + "basic-l10n": "^2.0.0", + "bootstrap": "^4.4.1", + "browserify-package-json": "^1.0.1", + "bs58check": "^2.1.2", + "bundle-collapser": "^1.4.0", + "debug": "^4.3.1", + "envify": "^4.1.0", + "fmtbtc": "0.0.3", + "in-browser-language": "^1.0.3", + "instascan": "github:shesek/instascan#packaged-lib", + "jquery": "^3.5.1", + "path-to-regexp": "^6.2.0", + "qrcode": "^1.4.4", + "rxjs": "^6.6.3", + "rxjs-compat": "^6.6.3", + "snabbdom-pragma": "^2.8.0", + "superagent": "^6.1.0", + "uglifyify": "^5.0.2" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { "version": "7.12.10", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", - "requires": { + "dependencies": { "@babel/types": "^7.12.10" } }, - "@babel/helper-builder-react-jsx": { + "node_modules/@babel/helper-builder-react-jsx": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/types": "^7.10.4" } }, - "@babel/helper-builder-react-jsx-experimental": { + "node_modules/@babel/helper-builder-react-jsx-experimental": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.11.tgz", "integrity": "sha512-4oGVOekPI8dh9JphkPXC68iIuP6qp/RPbaPmorRmEFbRAHZjSqxPjqHudn18GVDPgCuFM/KdFXc63C17Ygfa9w==", - "requires": { + "dependencies": { "@babel/helper-annotate-as-pure": "^7.12.10", "@babel/helper-module-imports": "^7.12.5", "@babel/types": "^7.12.11" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.12.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "requires": { + "dependencies": { "@babel/types": "^7.12.5" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, - "@babel/plugin-syntax-jsx": { + "node_modules/@babel/plugin-syntax-jsx": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-react-jsx": { + "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.11.tgz", "integrity": "sha512-5nWOw6mTylaFU72BdZfa0dP1HsGdY3IMExpxn8LBE8dNmkQjB+W+sR+JwIdtbzkPvVuFviT3zyNbSUkuVTVxbw==", - "requires": { + "dependencies": { "@babel/helper-builder-react-jsx": "^7.10.4", "@babel/helper-builder-react-jsx-experimental": "^7.12.11", "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-jsx": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/polyfill": { + "node_modules/@babel/polyfill": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.12.1.tgz", "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==", - "requires": { + "deprecated": "🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information.", + "dependencies": { "core-js": "^2.6.5", "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - } } }, - "@babel/types": { + "node_modules/@babel/polyfill/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/@babel/polyfill/node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "node_modules/@babel/types": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - } } }, - "@cycle/dom": { + "node_modules/@babel/types/node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/@cycle/dom": { "version": "22.8.0", "resolved": "https://registry.npmjs.org/@cycle/dom/-/dom-22.8.0.tgz", "integrity": "sha512-YnB4zUGOXVdPFXaVzYEUHXNqJlz1190Qfj1UpEBSiiJMPw+jskrNPrlhzqpE1MVjtpNlBJVoe+Vq73d2MnP3Bw==", - "requires": { + "dependencies": { "@cycle/run": "^5.2.0", "snabbdom": "^0.7.4", "snabbdom-selector": "^4.2.0", "xstream": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cyclejs" } }, - "@cycle/history": { + "node_modules/@cycle/history": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/@cycle/history/-/history-7.4.0.tgz", "integrity": "sha512-lNE9H0a1XXHR6fXP2gu0z7mQ8e0kxpA30ZQMALHFtuajVO0sN/vLlb9o/9+yQhcreN3qWQM6lImV6pXpFrQUgg==", - "requires": { + "dependencies": { "@cycle/run": "^5.2.0", "@types/history": "^4.7.2", "history": "4.7.x", "xstream": "*" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cyclejs" + } + }, + "node_modules/@cycle/history/node_modules/@cycle/run": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@cycle/run/-/run-5.4.0.tgz", + "integrity": "sha512-IAFwavuZGZP39XjxL7eQyQ9e6xZUMUjvlhFd3lZoyJPavHBbW8GPiCy5SJ3NCxM6trbgQQ8agu7sr72J83clBA==", "dependencies": { - "@cycle/run": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@cycle/run/-/run-5.4.0.tgz", - "integrity": "sha512-IAFwavuZGZP39XjxL7eQyQ9e6xZUMUjvlhFd3lZoyJPavHBbW8GPiCy5SJ3NCxM6trbgQQ8agu7sr72J83clBA==", - "requires": { - "quicktask": "1.1.0", - "xstream": "10.x || 11.x" - } - } + "quicktask": "1.1.0", + "xstream": "10.x || 11.x" + }, + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cyclejs" } }, - "@cycle/html": { + "node_modules/@cycle/html": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@cycle/html/-/html-3.4.0.tgz", "integrity": "sha512-wJRdkq3FwjDFpFQZzHNSCSNicBuXxCqRKNtt4i6UfUsXGxMsz8Sflh4hZ43rRTmS6eV2FE/kTyDA2k1IN9rAig==", - "requires": { + "dependencies": { "@cycle/dom": "^22.2.0", "@cycle/run": "^5.2.0", "snabbdom": "0.7.2", "snabbdom-to-html": "5.1.1", "xstream": "*" }, - "dependencies": { - "snabbdom": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-0.7.2.tgz", - "integrity": "sha512-rDY283fYUB/3z2tjXsRRccsbVJqmGLtP+iI1tfa1DDHo2xZ49cq1leq9JmYyvZQhESuYJRY/is6WYhP2UuiRVg==" - } + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cyclejs" } }, - "@cycle/http": { + "node_modules/@cycle/html/node_modules/snabbdom": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-0.7.2.tgz", + "integrity": "sha512-rDY283fYUB/3z2tjXsRRccsbVJqmGLtP+iI1tfa1DDHo2xZ49cq1leq9JmYyvZQhESuYJRY/is6WYhP2UuiRVg==" + }, + "node_modules/@cycle/http": { "version": "15.4.0", "resolved": "https://registry.npmjs.org/@cycle/http/-/http-15.4.0.tgz", "integrity": "sha512-cTx3d//qmqLCrwwuHNXOizF2+p0Spa9AGUWrkKf2/ykqgEclhGwAsjiOEYn2YHacBKxCBUNW7rJR2+C+a7Cipg==", - "requires": { + "dependencies": { "@cycle/run": "^5.2.0", "@types/superagent": "3.8.4", "most": "^1.7.3", @@ -170,409 +231,492 @@ "superagent": "^3.8.3", "xstream": "*" }, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cyclejs" + } + }, + "node_modules/@cycle/http/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - } - } + "ms": "^2.1.1" } }, - "@cycle/run": { + "node_modules/@cycle/http/node_modules/superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/@cycle/run": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@cycle/run/-/run-5.5.0.tgz", "integrity": "sha512-RZ7Zfai1zfxa0ZP2I4Pu72UgZrRyG3PnivFCe/yYfQBcFHSlUy1biwUTnPB4+k/SE6/cOMTiFqwqu/Y3M+fh1g==", - "requires": { + "dependencies": { "quicktask": "1.1.0", "xstream": "10.x || 11.x" + }, + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cyclejs" } }, - "@cycle/rxjs-run": { + "node_modules/@cycle/rxjs-run": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/@cycle/rxjs-run/-/rxjs-run-10.5.0.tgz", - "integrity": "sha512-SZ2jAHpwbO6L4ZKxoxOOKFo4LLJKjw94zbJ3B8G7t+IWmRg2bOknQikqlgVqdJeIQiGyKItKjVW4n07nAhYP0A==" + "integrity": "sha512-SZ2jAHpwbO6L4ZKxoxOOKFo4LLJKjw94zbJ3B8G7t+IWmRg2bOknQikqlgVqdJeIQiGyKItKjVW4n07nAhYP0A==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cyclejs" + }, + "peerDependencies": { + "@cycle/run": "^5.2.0", + "rxjs": "6.x", + "symbol-observable": "^1.2.0", + "xstream": "*" + } }, - "@cycle/storage": { + "node_modules/@cycle/storage": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@cycle/storage/-/storage-5.1.2.tgz", - "integrity": "sha512-Lz9LoHCa7wpGfTexbj5x2Xqa360lImmsPiLvci7z6ocEL8+qwx9IBSJlKp10N8BMoePQbOshmKfja5bntTGGng==" + "integrity": "sha512-Lz9LoHCa7wpGfTexbj5x2Xqa360lImmsPiLvci7z6ocEL8+qwx9IBSJlKp10N8BMoePQbOshmKfja5bntTGGng==", + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "@cycle/run": "*", + "xstream": "*" + } }, - "@most/multicast": { + "node_modules/@most/multicast": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@most/multicast/-/multicast-1.3.0.tgz", "integrity": "sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw==", - "requires": { + "dependencies": { "@most/prelude": "^1.4.0" + }, + "peerDependencies": { + "most": "^1.0.1" } }, - "@most/prelude": { + "node_modules/@most/prelude": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@most/prelude/-/prelude-1.8.0.tgz", "integrity": "sha512-t1CcURpZzfmBA6fEWwqmCqeNzWAj1w2WqEmCk/2yXMe/p8Ut000wFmVKMy8A1Rl9VVxZEZ5nBHd/pU0dR4bv/w==" }, - "@types/cookiejar": { + "node_modules/@types/cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" }, - "@types/history": { + "node_modules/@types/history": { "version": "4.7.3", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.3.tgz", "integrity": "sha512-cS5owqtwzLN5kY+l+KgKdRJ/Cee8tlmQoGQuIE9tWnSmS3JMKzmxo2HIAk2wODMifGwO20d62xZQLYz+RLfXmw==" }, - "@types/node": { + "node_modules/@types/node": { "version": "14.14.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" }, - "@types/superagent": { + "node_modules/@types/superagent": { "version": "3.8.4", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.4.tgz", "integrity": "sha512-Dnh0Iw6NO55z1beXvlsvUrfk4cd9eL2nuTmUk+rAhSVCk10PGGFbqCCTwbau9D0d2W3DITiXl4z8VCqppGkMPQ==", - "requires": { + "dependencies": { "@types/cookiejar": "*", "@types/node": "*" } }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "acorn": { + "node_modules/acorn": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-node": { + "node_modules/acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "requires": { + "dependencies": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" - }, - "dependencies": { - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - } } }, - "acorn-walk": { + "node_modules/acorn-node/node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/acorn-walk": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", + "engines": { + "node": ">=0.4.0" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "babel-runtime": { + "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { + "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, - "babelify": { + "node_modules/babelify": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", - "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==" + "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base-x": { + "node_modules/base-x": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==", - "requires": { + "dependencies": { "safe-buffer": "^5.0.1" } }, - "base64-js": { + "node_modules/base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, - "basic-l10n": { + "node_modules/basic-l10n": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/basic-l10n/-/basic-l10n-2.0.0.tgz", "integrity": "sha512-6JVIFNEj1cmuCZ5dTiDNAsLS4P68ynIPI7sg1q1h4etZU1ETJ2obhSY7OJyFn9KMbuNHMynh0r5r/v1I6w/YKw==" }, - "bootstrap": { + "node_modules/bootstrap": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", - "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.0" + } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "browser-pack": { + "node_modules/browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "requires": { - "JSONStream": "^1.0.3", + "dependencies": { "combine-source-map": "~0.8.0", "defined": "^1.0.0", + "JSONStream": "^1.0.3", "safe-buffer": "^5.1.1", "through2": "^2.0.0", "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" } }, - "browser-split": { + "node_modules/browser-split": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/browser-split/-/browser-split-0.0.1.tgz", "integrity": "sha1-ewl1dPjj6tYG+0Zk5krf3aKYGpM=" }, - "browser-unpack": { + "node_modules/browser-unpack": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/browser-unpack/-/browser-unpack-1.4.2.tgz", "integrity": "sha512-uHkiY4bmXjjBBWoKH1aRnEGTQxUUCCcVtoJfH9w1lmGGjETY4u93Zk+GRYkCE/SRMrdoMTINQ/1/manr/3aMVA==", - "requires": { + "dependencies": { "acorn-node": "^1.5.2", "concat-stream": "^1.5.0", "minimist": "^1.1.1" + }, + "bin": { + "browser-unpack": "bin/cmd.js" } }, - "browserify-package-json": { + "node_modules/browserify-package-json": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-package-json/-/browserify-package-json-1.0.1.tgz", "integrity": "sha1-mN3oqlxWH9bT/km7qhArdLOW/eo=" }, - "bs58": { + "node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "requires": { + "dependencies": { "base-x": "^3.0.2" } }, - "bs58check": { + "node_modules/bs58check": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { + "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", "safe-buffer": "^5.1.2" } }, - "buffer": { + "node_modules/buffer": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", - "requires": { + "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" } }, - "buffer-alloc": { + "node_modules/buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { + "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" } }, - "buffer-alloc-unsafe": { + "node_modules/buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, - "buffer-fill": { + "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "bundle-collapser": { + "node_modules/bundle-collapser": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/bundle-collapser/-/bundle-collapser-1.4.0.tgz", "integrity": "sha512-Gd3K3+3KI1Utuk+gwAvuOVOjT/2XLGL8tU6FwDKk04LlOZkYfT0pwQllsG1Dv8RRhgcjNxZSDmmSXb0AOkwSwg==", - "requires": { + "dependencies": { "browser-pack": "^6.0.2", "browser-unpack": "^1.1.0", "concat-stream": "^1.5.0", "falafel": "^2.1.0", "minimist": "^1.1.1", "through2": "^2.0.0" + }, + "bin": { + "bundle-collapser": "bin/cmd.js" } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } }, - "cipher-base": { + "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { + "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, - "cliui": { + "node_modules/cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "requires": { + "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" - }, + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "combine-source-map": { + "node_modules/combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "requires": { + "dependencies": { "convert-source-map": "~1.1.0", "inline-source-map": "~0.6.0", "lodash.memoize": "~3.0.3", "source-map": "~0.5.3" } }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "commander": { + "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, - "component-emitter": { + "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { + "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { + "engines": [ + "node >= 0.8" + ], + "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "1.1.3", "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" }, - "cookiejar": { + "node_modules/cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" }, - "core-js": { + "node_modules/core-js": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js." }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "create-hash": { + "node_modules/create-hash": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { + "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", @@ -580,175 +724,226 @@ "sha.js": "^2.4.0" } }, - "debug": { + "node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { + "dependencies": { "ms": "2.1.2" }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "decamelize": { + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } }, - "define-properties": { + "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { + "dependencies": { "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" } }, - "defined": { + "node_modules/defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } }, - "dijkstrajs": { + "node_modules/dijkstrajs": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.1.tgz", "integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs=" }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "envify": { + "node_modules/envify": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", - "requires": { + "dependencies": { "esprima": "^4.0.0", "through": "~2.3.4" + }, + "bin": { + "envify": "bin/envify" } }, - "es6-promise": { + "node_modules/es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "extend": { + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "falafel": { + "node_modules/falafel": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", - "requires": { + "dependencies": { "acorn": "^7.1.1", "foreach": "^2.0.5", "isarray": "^2.0.1", "object-keys": "^1.0.6" }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } + "engines": { + "node": ">=0.4.0" } }, - "fast-safe-stringify": { + "node_modules/falafel/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/fast-safe-stringify": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, - "find-up": { + "node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { + "dependencies": { "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "fmtbtc": { + "node_modules/fmtbtc": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/fmtbtc/-/fmtbtc-0.0.3.tgz", "integrity": "sha512-3awolswh6476ce5gIvzjw6OgT7ae2WD5NSinOC/de8gLeaDQPdYlW94Hb6nCoTXMUP6AFe3eh3IQiuT+dp4c8A==", - "requires": { + "dependencies": { "move-decimal-point": "0.0.4" } }, - "foreach": { + "node_modules/foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, - "form-data": { + "node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, - "formidable": { + "node_modules/formidable": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } }, - "fsm-as-promised": { + "node_modules/fsm-as-promised": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/fsm-as-promised/-/fsm-as-promised-0.14.5.tgz", "integrity": "sha512-4OoQtOd3MxdCi2/TKfKk8VpGabJJO3lI0cNmH3tkb0YeV9gYZZxbRzxM+6ISp0Jsg3EHrfZD47g+srN+Ek8udA==", - "requires": { + "dependencies": { "es6-promise": "^4.0.2", "lodash": "^4.16.2", "stampit": "^3.0.1", "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "globalthis": { + "node_modules/globalthis": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", - "requires": { + "dependencies": { "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "hash-base": { + "node_modules/hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { + "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" } }, - "history": { + "node_modules/history": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", - "requires": { + "dependencies": { "invariant": "^2.2.1", "loose-envify": "^1.2.0", "resolve-pathname": "^2.2.0", @@ -756,269 +951,341 @@ "warning": "^3.0.0" } }, - "ieee754": { + "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, - "in-browser-language": { + "node_modules/in-browser-language": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/in-browser-language/-/in-browser-language-1.0.3.tgz", "integrity": "sha512-kVKHZiWj+pDMLW/YaIP/r8OyaYVZZ4BZ/kD+fQrEp+FCoH/mprIIQhsEnUVkPuNEXCP5ZeWArOWz0KzDaLgICg==" }, - "inherits": { + "node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "inline-source-map": { + "node_modules/inline-source-map": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "requires": { + "dependencies": { "source-map": "~0.5.3" } }, - "instascan": { - "version": "github:shesek/instascan#443fcc7789e3009694608d2ef6cb8f0f612182f6", - "from": "github:shesek/instascan#packaged-lib", - "requires": { + "node_modules/instascan": { + "version": "2.0.0", + "resolved": "git+ssh://git@github.com/shesek/instascan.git#443fcc7789e3009694608d2ef6cb8f0f612182f6", + "integrity": "sha512-32aAw3wsJcOVWetXz9N0QXWIJS+D4dMMMYnF7LUTeoo37AbsZB8kDwxt9jyC74uQ7TGcaSehP+9F93S5xzYONA==", + "license": "MIT", + "dependencies": { "babel-runtime": "^6.26.0", "fsm-as-promised": "^0.14.5", "visibilityjs": "^1.2.4" } }, - "invariant": { + "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { + "dependencies": { "loose-envify": "^1.0.0" } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "jquery": { + "node_modules/jquery": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "jsonparse": { + "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "engines": [ + "node >= 0.2.0" + ] }, - "locate-path": { + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { + "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, - "lodash.escape": { + "node_modules/lodash.escape": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=" }, - "lodash.forown": { + "node_modules/lodash.forown": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=" }, - "lodash.kebabcase": { + "node_modules/lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" }, - "lodash.memoize": { + "node_modules/lodash.memoize": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" }, - "lodash.remove": { + "node_modules/lodash.remove": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.remove/-/lodash.remove-4.7.0.tgz", "integrity": "sha1-8x0x58OaBpDVB07A02JxYjNO5iY=" }, - "lodash.uniq": { + "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, - "loose-envify": { + "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { + "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { + "dependencies": { "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "md5.js": { + "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { + "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { + "dependencies": { "mime-db": "1.40.0" + }, + "engines": { + "node": ">= 0.6" } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "most": { + "node_modules/most": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/most/-/most-1.9.0.tgz", "integrity": "sha512-M7yHMcMGaclzEL6eg8Yh8PlAsaWfL/oSThF4+ZuWKM5CKXcbzmLh+qESwgZFzMKHJ+iVJwb28yFvDEOobI653w==", - "requires": { + "dependencies": { "@most/multicast": "^1.2.5", "@most/prelude": "^1.4.0", "globalthis": "^1.0.1", "symbol-observable": "^2.0.3" - }, - "dependencies": { - "symbol-observable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", - "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" - } } }, - "move-decimal-point": { + "node_modules/most/node_modules/symbol-observable": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", + "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/move-decimal-point": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/move-decimal-point/-/move-decimal-point-0.0.4.tgz", "integrity": "sha512-cZrpE/ykbwSmD0DnKAcKa49zaK5LaftD6DzpQDmjSMPRK6i4D4xvnVBCIuZXkpAqvon6DP9Oum2TcLZjclVB/Q==" }, - "ms": { + "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "object-assign": { + "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-locate": { + "node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { + "dependencies": { "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } }, - "parse-sel": { + "node_modules/parse-sel": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-sel/-/parse-sel-1.0.0.tgz", "integrity": "sha1-uTANK7lGoGwiyY4gjkeyCIaQy90=", - "requires": { + "dependencies": { "browser-split": "0.0.1" } }, - "path-exists": { + "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } }, - "path-to-regexp": { + "node_modules/path-to-regexp": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" }, - "pngjs": { + "node_modules/pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, - "qrcode": { + "node_modules/qrcode": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", - "requires": { + "dependencies": { "buffer": "^5.4.3", "buffer-alloc": "^1.2.0", "buffer-from": "^1.1.1", @@ -1027,29 +1294,39 @@ "pngjs": "^3.3.0", "yargs": "^13.2.4" }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=4" } }, - "qs": { + "node_modules/qrcode/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/qs": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "quicktask": { + "node_modules/quicktask": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quicktask/-/quicktask-1.1.0.tgz", "integrity": "sha512-b3w19IEXnt5auacLAbePVsqPyVQUwmuhJQrrWnVhm4pP8PAMg2U9vFHbAD9XYXXbMDjdLJs0x5NLqwTV8uFK4g==" }, - "readable-stream": { + "node_modules/readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { + "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", @@ -1059,101 +1336,119 @@ "util-deprecate": "~1.0.1" } }, - "regenerator-runtime": { + "node_modules/regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "resolve-pathname": { + "node_modules/resolve-pathname": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" }, - "ripemd160": { + "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { + "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, - "rxjs": { + "node_modules/rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { + "dependencies": { "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, - "rxjs-compat": { + "node_modules/rxjs-compat": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.6.3.tgz", "integrity": "sha512-y+wUqq7bS2dG+7rH2fNMoxsDiJ32RQzFxZQE/JdtpnmEZmwLQrb1tCiItyHxdXJHXjmHnnzFscn3b6PEmORGKw==" }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "semver": { + "node_modules/semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "requires": { + "dependencies": { "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "sha.js": { + "node_modules/sha.js": { "version": "2.4.11", "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { + "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "snabbdom": { + "node_modules/snabbdom": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-0.7.4.tgz", "integrity": "sha512-nnN+7uZ2NTIiu7EPMNwSDhmrYXqwlfCP/j72RdzvDPujXyvQxOW7Jl9yuLayzxMHDNWQR7FM6Pcn4wnDpKRe6Q==" }, - "snabbdom-pragma": { + "node_modules/snabbdom-pragma": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/snabbdom-pragma/-/snabbdom-pragma-2.8.0.tgz", "integrity": "sha512-ReCc8AiMksj8vWRfPQjvyji4DY6qUu3FiMfI0/mBJeRAfgOR/d5ijY+rpuMl4kee4w5fjj4pEasl2umaxOawpA==", - "requires": { + "dependencies": { "extend": "^3.0.0" } }, - "snabbdom-selector": { + "node_modules/snabbdom-selector": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/snabbdom-selector/-/snabbdom-selector-4.2.0.tgz", "integrity": "sha512-hNIg1xDMxssUeMC/4r3OGxXhm8pbyJ0KIG0pXrA3J5ZQK+FkPa+WA9DYw4ROMLq5/LrfurMNMvy3IMm+0CzcnA==", - "requires": { + "dependencies": { "tree-selector": "^2.1.0" + }, + "peerDependencies": { + "snabbdom": "*" } }, - "snabbdom-to-html": { + "node_modules/snabbdom-to-html": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/snabbdom-to-html/-/snabbdom-to-html-5.1.1.tgz", "integrity": "sha512-rz/Q8nh2RiY9echnpQdIQpGsvqPyjfEcFZ636tlggw59WlcsRrWfctYIVlGHZxUzcX025lw69oTCqceGdeXoGg==", - "requires": { + "dependencies": { "lodash.escape": "^4.0.1", "lodash.forown": "^4.4.0", "lodash.kebabcase": "^4.1.1", @@ -1163,70 +1458,82 @@ "parse-sel": "^1.0.0" } }, - "source-map": { + "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, - "stampit": { + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stampit": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/stampit/-/stampit-3.2.1.tgz", "integrity": "sha1-lTpBpJRYoLKG/7HjydbOcDblids=" }, - "string-width": { + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { + "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "engines": { + "node": ">=6" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" } }, - "superagent": { + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/superagent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "requires": { + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", "debug": "^4.1.1", @@ -1239,105 +1546,141 @@ "readable-stream": "^3.6.0", "semver": "^7.3.2" }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", "dependencies": { - "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" - }, - "mime": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", - "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==" - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "symbol-observable": { + "node_modules/superagent/node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/superagent/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "engines": { + "node": ">=0.10.0" + } }, - "terser": { + "node_modules/terser": { "version": "3.17.0", "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", - "requires": { + "dependencies": { "commander": "^2.19.0", "source-map": "~0.6.1", "source-map-support": "~0.5.10" }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "bin": { + "terser": "bin/uglifyjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" } }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "through2": { + "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { + "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } }, - "tree-selector": { + "node_modules/tree-selector": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tree-selector/-/tree-selector-2.1.1.tgz", "integrity": "sha512-NVFYU6YzyUHSMS7+qbhdHlBHG5P9IPjycQa+8MnIBDpq/UWEkMD+lAL/56x7Fty+mAq9SWgtg9D4flZfuOZdDg==" }, - "tslib": { + "node_modules/tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, - "typedarray": { + "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "uglifyify": { + "node_modules/uglifyify": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/uglifyify/-/uglifyify-5.0.2.tgz", "integrity": "sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==", - "requires": { + "dependencies": { "convert-source-map": "~1.1.0", "minimatch": "^3.0.2", "terser": "^3.7.5", @@ -1345,97 +1688,114 @@ "xtend": "^4.0.1" } }, - "umd": { + "node_modules/umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "bin": { + "umd": "bin/cli.js" + } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { + "node_modules/uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } }, - "value-equal": { + "node_modules/value-equal": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" }, - "visibilityjs": { + "node_modules/visibilityjs": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/visibilityjs/-/visibilityjs-1.2.8.tgz", "integrity": "sha512-Y+aL3OUX88b+/VSmkmC2ApuLbf0grzbNLpCfIDSw3BzTU6PqcPsdgIOaw8b+eZoy+DdQqnVN3y/Evow9vQq9Ig==" }, - "warning": { + "node_modules/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { + "dependencies": { "loose-envify": "^1.0.0" } }, - "which-module": { + "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { + "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "xstream": { + "node_modules/xstream": { "version": "11.7.0", "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.7.0.tgz", "integrity": "sha512-wO3TXiQd2/1UZNVsixDIcQgAN6TU4sGH7qIXvs1CRp1kgtkpU8YTfyKt/z/Z1psqcGnR0cJJxHaCnBxtktLx9w==", - "requires": { + "dependencies": { "symbol-observable": "1.2.0" } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, - "yallist": { + "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yargs": { + "node_modules/yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { + "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", @@ -1448,11 +1808,11 @@ "yargs-parser": "^13.1.1" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } diff --git a/client/src/app.js b/client/src/app.js index 207bfc83..9e6f3f28 100644 --- a/client/src/app.js +++ b/client/src/app.js @@ -31,6 +31,7 @@ export default function main({ DOM, HTTP, route, storage, scanner: scan$, search /// User actions , page$ = route() , goHome$ = route('/') + , goAPILanding$= route('/explorer-api') , goBlocks$ = route('/blocks/recent').map(loc => ({ start_height: loc.query.start != null ? +loc.query.start : null })) , goBlock$ = route('/block/:hash').map(loc => ({ hash: loc.params.hash, start_index: +loc.query.start || 0 })) , goHeight$ = route('/block-height/:height').map(loc => loc.params.height) @@ -58,7 +59,7 @@ export default function main({ DOM, HTTP, route, storage, scanner: scan$, search , sort_dir: loc.query.sort_dir != null ? loc.query.sort_dir : 'asc' , limit: +loc.query.limit || 50, })) - , blindingReq$ = !process.env.IS_ELEMENTS ? O.empty() + , blindingReq$ = !(process.env.IS_ELEMENTS && process.browser) ? O.empty() : page$.map(loc => loc.hash.startsWith('#blinded=') ? loc.hash.substr(9) : null) // End Elements only @@ -226,6 +227,7 @@ export default function main({ DOM, HTTP, route, storage, scanner: scan$, search // Currently visible view , view$ = O.merge(page$.mapTo(null) , goHome$.mapTo('dashBoard') + , goAPILanding$.mapTo('apiLanding') , goBlocks$.mapTo('recentBlocks') , goRecent$.mapTo('recentTxs') , block$.filter(notNully).mapTo('block') @@ -242,6 +244,7 @@ export default function main({ DOM, HTTP, route, storage, scanner: scan$, search // Page title , title$ = O.merge(page$.mapTo(null) + , goAPILanding$.withLatestFrom(t$, (_, t) => t`Explorer API`) , block$.filter(notNully).withLatestFrom(t$, (block, t) => t`Block #${block.height}: ${block.id}`) , tx$.filter(notNully).withLatestFrom(t$, (tx, t) => t`Transaction: ${tx.txid}`) , addr$.filter(notNully).withLatestFrom(goAddr$, t$, (_, goAddr, t) => t`Address: ${goAddr.display_addr}`) diff --git a/client/src/run-server.js b/client/src/run-server.js index dc4177af..c66ec25b 100644 --- a/client/src/run-server.js +++ b/client/src/run-server.js @@ -31,7 +31,9 @@ export default function render(pathname, args='', body, locals={}, cb) { cb(null, data || { html: lastHtml , title: lastState.title - , status: lastState.view == 'notFound' ? 404 : lastState.error ? 400 : 200 + , status: lastState.view == 'notFound' ? 404 + : lastState.view == 'error' ? lastState.error.status || 400 + : 200 }) } @@ -46,7 +48,7 @@ export default function render(pathname, args='', body, locals={}, cb) { lastState = S - if (S.loading || !S.isReady) { + if (S.view == 'loading' || S.loading > 0) { if (!seenLoading) { seenLoading = true clearTimeout(timeout) diff --git a/client/src/util.js b/client/src/util.js index 9ef9eadb..0f944a17 100644 --- a/client/src/util.js +++ b/client/src/util.js @@ -112,7 +112,7 @@ export const dropErrors = r$$ => r$$.switchMap(r$ => r$.catch(_ => O.empty())) export const extractErrors = r$$ => r$$.flatMap(r$ => r$.flatMap(_ => O.empty()).catch(err => O.of(err))) - .map(e => e.response && e.status != 502 ? parseError(e.response) : e) + .map(e => e.response ? responseError(e.response) : e) // Create a stream that ticks every `ms`, but only when the window is focused. // Returns an empty stream in the server-side pre-renderer environment. @@ -126,10 +126,12 @@ export const tickWhileFocused = ms => export const tickWhileViewing = (ms, view, view$) => tickWhileFocused(ms).withLatestFrom(view$).filter(([ _, shown_view ]) => shown_view == view) -const parseError = res => - (res.body && Object.keys(res.body).length) - ? res.body.message || res.body - : res.text +const responseError = res => ({ + status: res.status, + message: (res.body && Object.keys(res.body).length) + ? res.body.message || res.body + : res.text +}) export const dbg = (obj, label='stream', dbg=debug(label)) => Object.keys(obj).forEach(k => obj[k] && obj[k].subscribe( diff --git a/client/src/views/addr.js b/client/src/views/addr.js index 97d43b67..a8ea417f 100644 --- a/client/src/views/addr.js +++ b/client/src/views/addr.js @@ -43,9 +43,9 @@ export default ({ t, addr, addrQR, addrTxs, goAddr, openTx, spends, tipHeight, l
-

{t`Address`}

-
- {display_addr} +

{t`Address`}

+
+ {display_addr} { process.browser &&
} @@ -58,7 +58,7 @@ export default ({ t, addr, addrQR, addrTxs, goAddr, openTx, spends, tipHeight, l
-
+
{ is_confidential && [
{ t`Confidential` }
@@ -113,14 +113,14 @@ export default ({ t, addr, addrQR, addrTxs, goAddr, openTx, spends, tipHeight, l
-

{txsShownText(total_txs, est_prev_total_seen_count, shown_txs, t)}

+

{txsShownText(total_txs, est_prev_total_seen_count, shown_txs, t)}

{ addrTxs ? addrTxs.map(tx => txBox(tx, { openTx, tipHeight, t, spends, addr, ...S })) : loader() }
- { loading ?
{t`Load more`}
{loader("small")}
+ { loading ?
{t`Loading...`}
{loader("small")}
: pagingNav(addr, last_seen_txid, est_curr_chain_seen_count, prev_paging_txids, next_paging_txids, prev_paging_est_count, t) }
@@ -144,9 +144,8 @@ const pagingNav = (addr, last_seen_txid, est_curr_chain_seen_count, prev_paging_ process.browser ? last_seen_txid != null && -
- {t`Load more`} -
+
+ {t`Load more`}
: [ diff --git a/client/src/views/asset-list.js b/client/src/views/asset-list.js index 30216c8f..c8124bda 100644 --- a/client/src/views/asset-list.js +++ b/client/src/views/asset-list.js @@ -17,7 +17,7 @@ export default ({ assetList, goAssetList, loading, t, ...S }) => { { !assets ?
{loader()}
: !assets.length ?

{t`No registered assets`}

:
-
+
{t`Asset id`}
{asset.asset_id}
@@ -236,14 +236,14 @@ export default ({ t, asset, assetTxs, goAsset, openTx, spends, tipHeight, loadin
-

{(is_native_asset ? txsShownTextNative : txsShownTextIssued)(total_txs, est_prev_total_seen_count, shown_txs, t)}

+

{(is_native_asset ? txsShownTextNative : txsShownTextIssued)(total_txs, est_prev_total_seen_count, shown_txs, t)}

{ assetTxs ? assetTxs.map(tx => txBox(tx, { openTx, tipHeight, t, spends, ...S })) : loader()}
- { loading ?
{t`Load more`}
{loader("small")}
+ { loading ?
{t`Loading...`}
{loader("small")}
: pagingNav(asset, last_seen_txid, est_curr_chain_seen_count, prev_paging_txids, next_paging_txids, prev_paging_est_count, t) }
@@ -269,9 +269,8 @@ const pagingNav = (asset, last_seen_txid, est_curr_chain_seen_count, prev_paging process.browser ? last_seen_txid != null && -
- {t`Load more`} -
+
+ {t`Load more`}
: [ diff --git a/client/src/views/block.js b/client/src/views/block.js index cf685bc1..31c504c6 100644 --- a/client/src/views/block.js +++ b/client/src/views/block.js @@ -16,13 +16,13 @@ export default ({ t, block: b, blockStatus: status, blockTxs, openTx, spends, op
-

{t`Block ${b.height}`}

-
{b.id} +

{t`Block ${b.height}`}

+
{b.id} { process.browser &&
}
-
+
{ b.previousblockhash && @@ -50,7 +50,7 @@ export default ({ t, block: b, blockStatus: status, blockTxs, openTx, spends, op
{btnDetails(b.id, openBlock == b.id, page.query, t)} -
+
{t`Height`}
@@ -123,14 +123,14 @@ export default ({ t, block: b, blockStatus: status, blockTxs, openTx, spends, op
-

{txsShownText(b.tx_count, goBlock.start_index, blockTxs && blockTxs.length, t)}

+

{txsShownText(b.tx_count, goBlock.start_index, blockTxs && blockTxs.length, t)}

{ blockTxs ? blockTxs.map(tx => txBox( { ...tx, status: txsStatus }, { openTx, tipHeight, t, spends })) : loader() }
- { loading ?
{t`Load more`}
{loader("small")}
+ { loading ?
{t`Loading...`}
{loader("small")}
: pagingNav(b, { ...S, t }) }
@@ -147,9 +147,8 @@ const pagingNav = (block, { nextBlockTxs, prevBlockTxs, t }) => process.browser ? nextBlockTxs && -
- {t`Load more`} -
+
+ {t`Load more`}
: [ @@ -167,9 +166,9 @@ const pagingNav = (block, { nextBlockTxs, prevBlockTxs, t }) => const btnDetails = (blockhash, isOpen, query, t) => process.browser // dynamic button in browser env - ?
{btnDetailsContent(isOpen, t)}
+ ?
{btnDetailsContent(isOpen, t)}
// or a plain link in server-side rendered env - : {btnDetailsContent(isOpen, t)} + :
{btnDetailsContent(isOpen, t)} const btnDetailsContent = (isOpen, t) =>
diff --git a/client/src/views/blocks.js b/client/src/views/blocks.js index f7d29a76..f6f290cc 100644 --- a/client/src/views/blocks.js +++ b/client/src/views/blocks.js @@ -9,27 +9,27 @@ export const blks = (blocks, viewMore, loadMore, { t, loading, ...S }) => { !blocks ? loader() : !blocks.length ?

{t`No recent blocks`}

:
-

{t`Latest Blocks`}

+

{t`Latest Blocks`}

-
{t`Height`}
-
{process.browser ? t`Timestamp` : t`Timestamp (UTC)`}
-
{t`Transactions`}
-
{t`Size (KB)`}
-
{t`Weight (KWU)`}
+
{t`Height`}
+
{process.browser ? t`Timestamp` : t`Timestamp (UTC)`}
+
{t`Transactions`}
+
{t`Size (KB)`}
+
{t`Weight (KWU)`}
{ blocks && blocks.map(b => )} {blocks && viewMore ? - + {t`View more blocks`}
: ""} @@ -51,9 +51,8 @@ const pagingNav = ({ nextBlocks, prevBlocks, t }) => process.browser ? nextBlocks != null && -
- {t`Load more`} -
+
+ {t`Load more`}
: [ diff --git a/client/src/views/error.js b/client/src/views/error.js index 91e0d43d..b252ebcf 100644 --- a/client/src/views/error.js +++ b/client/src/views/error.js @@ -6,7 +6,7 @@ const formatError = err => ? 'We encountered an error. Please try again later.' : (err.status && err.status === 502) ? 'Esplora is currently unavailable, please try again later.' -: err.toString() +: (err.message || err.toString()) export const error = ({ t, error, ...S }) => layout(

{ t(formatError(error)) }

diff --git a/client/src/views/footer.js b/client/src/views/footer.js index a6c74789..06e43d04 100644 --- a/client/src/views/footer.js +++ b/client/src/views/footer.js @@ -13,7 +13,7 @@ export default ({ t, page }) => { !process.browser && Object.entries(page.query).map(([k, v]) => k != 'lang' && ) } - { Object.entries(t.langs).map(([ lang_id, lang_t ]) => ) } @@ -35,13 +35,13 @@ export default ({ t, page }) =>
- { process.env.ONION_V3 && Onion V3 } + { process.env.ONION_V3 && Onion V3 }
}
-
+
{ process.env.TERMS && Terms & } { process.env.PRIVACY && Privacy } diff --git a/client/src/views/index.js b/client/src/views/index.js index e0b54b52..4c674185 100644 --- a/client/src/views/index.js +++ b/client/src/views/index.js @@ -1,4 +1,5 @@ export { dashBoard } from './home' +export { default as apiLanding } from './lander' export { recentBlocks } from './blocks-all' export { recentTxs } from './transactions-all' export { default as block } from './block' diff --git a/client/src/views/lander.js b/client/src/views/lander.js new file mode 100644 index 00000000..be78e3a7 --- /dev/null +++ b/client/src/views/lander.js @@ -0,0 +1,212 @@ +import Snabbdom from 'snabbdom-pragma' +import layout from './layout' + +const staticRoot = process.env.STATIC_ROOT || '' + +const logoSources = { + dark: { + sideswap: `${staticRoot}img/logos/sideswap.svg`, + sparrow: `${staticRoot}img/logos/sparrow.png`, + blockstreamGreen: `${staticRoot}img/logos/blockstream-green.svg`, + lwk: `${staticRoot}img/logos/lwk.svg`, + aqua: `${staticRoot}img/logos/aqua.svg`, + bitcoinDevKit: `${staticRoot}img/logos/bitcoin-dev-kit.svg`, + nunchuk: `${staticRoot}img/logos/nunchuk.svg`, + }, + light: { + sideswap: `${staticRoot}img/logos/sideswap-dark.svg`, + sparrow: `${staticRoot}img/logos/sparrow-dark.png`, + blockstreamGreen: `${staticRoot}img/logos/blockstream-green-dark.svg`, + lwk: `${staticRoot}img/logos/lwk-dark.svg`, + aqua: `${staticRoot}img/logos/aqua-dark.svg`, + bitcoinDevKit: `${staticRoot}img/logos/bitcoin-dev-kit-dark.svg`, + nunchuk: `${staticRoot}img/logos/nunchuk-dark.svg`, + } +} + +const LandingPage = ({ t, theme, ...S }) => { + const logos = logoSources[theme || 'dark'] + return layout( +
+ +
+
+
+
+
+
+
+

Powering Bitcoin and Liquid Applications with Real-Time Blockchain Data

+

Built to simplify development and enhance performance for existing Bitcoin and Liquid applications, the Blockstream Explorer API offers faster address lookups, robust DoS protection, and seamless integration.

+ JOIN THE OPEN BETA +
+
+ Hero Image +
+
+
+
+ +
+
+
+
+ SideSwap Logo + Sparrow Bitcoin Wallet Logo + Blockstream Green Logo + LWK Logo + Aqua Logo + Bitcoin Dev Kit + Nunchuk +
+
+ +
+
+
+
+ SideSwap Logo + Sparrow Bitcoin Wallet Logo + Blockstream Green Logo + LWK Logo + Aqua Logo + Bitcoin Dev Kit + Nunchuk +
+
+
+
+
+
+
WHY EXPLORER API
+

High performance service - optimized for scaling and uptime

+

Extensive blockchain data indexing powers pre-populated, cache-ready results for fast and reliable access. The infrastructure is built to handle demanding workloads, ensuring high availability and scalability, even during peak usage.

+ +
+
+ icon +

Integrate & Scale

+

Effortless integration with a transparent pricing model eliminates upfront infrastructure costs. Developers can focus on building applications without the complexity of managing backend systems, saving both time and resources.

+
+
+ icon +

Operational Redundancy

+

Whether used as a primary solution or backup, the service eliminates costly infrastructure maintenance and disaster recovery planning. Its high reliability ensures uninterrupted access during outages or demand spikes.

+
+
+ icon +

Privacy & Security

+

With no persistent logging and full end-to-end encryption, the service ensures confidentiality and adherence to best practices. Robust security protocols reduce the need for self-managed security solutions.

+
+
+
+
+
FEATURES
+

Fast data access, scalable infrastructure, and 99.9% uptime

+
+
+ icon +

Powered by the open-source Esplora project, Blockstream Explorer can be self-hosted. Run your own instance to suit your specific needs while leveraging the same robust software that powers our Enterprise solution.

+
+
+ icon +

Access data across Bitcoin Mainnet, Testnet, and Liquid networks, offering a broad spectrum of blockchain data for diverse applications.

+
+
+ icon +

An HTTP REST API (with Electrs RPC coming soon) provides extended transaction details and seamless integration.

+
+
+ icon +

Partner with Blockstream for seamless integration, unmatched performance, and dedicated ongoing support.

+
+
+ icon +

Fully encrypted connections and secure access ensure data integrity, delivering reliable performance for mission-critical operations.

+
+
+ icon +

Advanced indexing and database storage reduce query times and remove the need to self-host expensive hardware like 2TB+ high-speed SSDs with extensive CPU resources.

+
+
+
+
+ +
+
+
+
+ icon +

HTTP REST API
for Bitcoin and Liquid

+

Get real-time access to network data with simple RESTful endpoints, delivering low-latency, high-availability insights into UTXOs, balances, mempool transactions, and fee estimates, with seamless transaction broadcasting.

+ EXPLORE DOCUMENTATION +
+
+ HTTP Rest API image +
+
+
+
+ +
+
+
OUR OFFER
+

Pricing

+
+
+ icon + FREE UP TO +

500k Requests/Month

+

Authenticated users benefit from 500K requests per month for free and higher daily limits providing more capacity than the free public Esplora endpoints. Authenticated users also benefit from dedicated onboarding & support, and a 99.9% SLA for enhanced reliability.

+
+
+ icon + ONLY PAY FOR WHAT YOU USE +
+
+
+ $ + 0.01 + /100 +
+
Next 15M Requests
+
+ +
+
+ $ + 0.01 + /200 +
+
Following 15M Requests
+
+ +
+
+ $ + 0.01 + /500 +
+
Beyond 30M Requests
+
+ +
+
+ $ + 4,000 +
+
Above 60M Requests Unlimited Usage
+
+
+

Contact Support now if you are looking for more tailored plans designed for high-volume and enterprise-grade applications.

+ JOIN THE OPEN BETA NOW +
+
+
+ +
+
+ , { t, activeTab: 'apiLanding', ...S }) +} + +export default LandingPage \ No newline at end of file diff --git a/client/src/views/mempool.js b/client/src/views/mempool.js index 6539d150..62a338b3 100644 --- a/client/src/views/mempool.js +++ b/client/src/views/mempool.js @@ -11,9 +11,9 @@ export default ({ t, mempool, feeEst, ...S }) => mempool && feeEst && layout(
-

{t`Mempool`}

+

{t`Mempool`}

-
+
{t`Total transactions`}
{mempool.count}
diff --git a/client/src/views/nav-toggle.js b/client/src/views/nav-toggle.js index 384d31c1..85b29159 100644 --- a/client/src/views/nav-toggle.js +++ b/client/src/views/nav-toggle.js @@ -21,15 +21,15 @@ export default (t, theme, page) => }
-

Wallets

+

Wallets

- jade logo + jade logo green logo - jade logo + jade logo green logo
-
+
-

Explorers

-
-

Other Products

-
diff --git a/client/src/views/navbar-menu.js b/client/src/views/navbar-menu.js index 4a3f8e28..e8ab2ec3 100644 --- a/client/src/views/navbar-menu.js +++ b/client/src/views/navbar-menu.js @@ -13,7 +13,7 @@ export default ({ t, theme, page }) =>