Merge branch 'master' into pp-remove-duplicate-blocks-before-insertion

pull/2777/head
Victor Baranov 5 years ago committed by GitHub
commit 3fbe951bef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 240
      .circleci/config.yml
  2. 3
      .dialyzer-ignore
  3. 58
      CHANGELOG.md
  4. 12
      PULL_REQUEST_TEMPLATE.md
  5. 43
      README.md
  6. 2
      apps/block_scout_web/README.md
  7. 4
      apps/block_scout_web/assets/.babelrc
  8. 2
      apps/block_scout_web/assets/css/_typography.scss
  9. 3
      apps/block_scout_web/assets/css/app.scss
  10. 51
      apps/block_scout_web/assets/css/components/_custom_tooltips_block_details.scss
  11. 137
      apps/block_scout_web/assets/css/components/_navbar.scss
  12. 1
      apps/block_scout_web/assets/css/components/_tooltip.scss
  13. 1
      apps/block_scout_web/assets/css/non-critical.scss
  14. 4
      apps/block_scout_web/assets/css/theme/_base_variables.scss
  15. 59
      apps/block_scout_web/assets/css/theme/_dai_variables.scss
  16. 41
      apps/block_scout_web/assets/css/theme/_dark-theme.scss
  17. 3
      apps/block_scout_web/assets/css/theme/_lukso_variables.scss
  18. 7
      apps/block_scout_web/assets/js/app.js
  19. 28
      apps/block_scout_web/assets/js/lib/async_listing_load.js
  20. 29
      apps/block_scout_web/assets/js/lib/awesomplete-util.js
  21. 2
      apps/block_scout_web/assets/js/lib/card_tabs.js
  22. 2
      apps/block_scout_web/assets/js/lib/clipboard_buttons.js
  23. 4
      apps/block_scout_web/assets/js/lib/coin_balance_history_chart.js
  24. 3
      apps/block_scout_web/assets/js/lib/currency.js
  25. 2
      apps/block_scout_web/assets/js/lib/indexing.js
  26. 13
      apps/block_scout_web/assets/js/lib/market_history_chart.js
  27. 2
      apps/block_scout_web/assets/js/lib/modals.js
  28. 18
      apps/block_scout_web/assets/js/lib/network_selector.js
  29. 4
      apps/block_scout_web/assets/js/lib/pretty_json.js
  30. 46
      apps/block_scout_web/assets/js/pages/address.js
  31. 2
      apps/block_scout_web/assets/js/pages/address/coin_balances.js
  32. 4
      apps/block_scout_web/assets/js/pages/address/internal_transactions.js
  33. 18
      apps/block_scout_web/assets/js/pages/address/logs.js
  34. 4
      apps/block_scout_web/assets/js/pages/address/transactions.js
  35. 2
      apps/block_scout_web/assets/js/pages/blocks.js
  36. 26
      apps/block_scout_web/assets/js/pages/chain.js
  37. 9
      apps/block_scout_web/assets/js/pages/dark-mode-switcher.js
  38. 37
      apps/block_scout_web/assets/js/pages/layout.js
  39. 4
      apps/block_scout_web/assets/js/pages/pending_transactions.js
  40. 87
      apps/block_scout_web/assets/js/pages/token_counters.js
  41. 2
      apps/block_scout_web/assets/js/pages/transaction.js
  42. 2
      apps/block_scout_web/assets/js/pages/transactions.js
  43. 12
      apps/block_scout_web/assets/js/pages/verification_form.js
  44. 6
      apps/block_scout_web/assets/js/socket.js
  45. 15281
      apps/block_scout_web/assets/package-lock.json
  46. 63
      apps/block_scout_web/assets/package.json
  47. BIN
      apps/block_scout_web/assets/static/android-chrome-192x192.png
  48. BIN
      apps/block_scout_web/assets/static/android-chrome-512x512.png
  49. BIN
      apps/block_scout_web/assets/static/favicon-16x16.png
  50. BIN
      apps/block_scout_web/assets/static/favicon-32x32.png
  51. 21
      apps/block_scout_web/assets/static/images/average_time.svg
  52. 4
      apps/block_scout_web/assets/static/images/block.svg
  53. 66
      apps/block_scout_web/assets/static/images/blockscout_logo.svg
  54. 24
      apps/block_scout_web/assets/static/images/callisto_logo.svg
  55. 5
      apps/block_scout_web/assets/static/images/classic_ethereum_logo.svg
  56. 2
      apps/block_scout_web/assets/static/images/classic_logo.svg
  57. 8
      apps/block_scout_web/assets/static/images/controller.svg
  58. 13
      apps/block_scout_web/assets/static/images/cube.svg
  59. 6
      apps/block_scout_web/assets/static/images/dai_logo.svg
  60. 18
      apps/block_scout_web/assets/static/images/ellaism_logo.svg
  61. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-block-not-found.png
  62. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-block-not-found@2x.png
  63. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-page-not-found.png
  64. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-page-not-found@2x.png
  65. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-tx-not-found.png
  66. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-tx-not-found@2x.png
  67. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-block-not-found.png
  68. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-block-not-found@2x.png
  69. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-page-not-found.png
  70. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-page-not-found@2x.png
  71. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-tx-not-found.png
  72. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-tx-not-found@2x.png
  73. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-block-not-found.png
  74. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-block-not-found@2x.png
  75. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-page-not-found.png
  76. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-page-not-found@2x.png
  77. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-tx-not-found.png
  78. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-tx-not-found@2x.png
  79. BIN
      apps/block_scout_web/assets/static/images/errors-img/koan-block-not-found@2x.png
  80. BIN
      apps/block_scout_web/assets/static/images/errors-img/kovan-block-not-found.png
  81. BIN
      apps/block_scout_web/assets/static/images/errors-img/kovan-block-not-found@2x.png
  82. BIN
      apps/block_scout_web/assets/static/images/errors-img/kovan-page-not-found.png
  83. BIN
      apps/block_scout_web/assets/static/images/errors-img/kovan-page-not-found@2x.png
  84. BIN
      apps/block_scout_web/assets/static/images/errors-img/kovan-tx-not-found.png
  85. BIN
      apps/block_scout_web/assets/static/images/errors-img/kovan-tx-not-found@2x.png
  86. BIN
      apps/block_scout_web/assets/static/images/errors-img/lukso-block-not-found.png
  87. BIN
      apps/block_scout_web/assets/static/images/errors-img/lukso-block-not-found@2x.png
  88. BIN
      apps/block_scout_web/assets/static/images/errors-img/lukso-page-not-found.png
  89. BIN
      apps/block_scout_web/assets/static/images/errors-img/lukso-page-not-found@2x.png
  90. BIN
      apps/block_scout_web/assets/static/images/errors-img/lukso-tx-not-found.png
  91. BIN
      apps/block_scout_web/assets/static/images/errors-img/lukso-tx-not-found@2x.png
  92. 27
      apps/block_scout_web/assets/static/images/errors-img/pic-404.svg
  93. BIN
      apps/block_scout_web/assets/static/images/errors-img/poa-block-not-found.png
  94. BIN
      apps/block_scout_web/assets/static/images/errors-img/poa-block-not-found@2x.png
  95. BIN
      apps/block_scout_web/assets/static/images/errors-img/poa-page-not-found.png
  96. BIN
      apps/block_scout_web/assets/static/images/errors-img/poa-page-not-found@2x.png
  97. BIN
      apps/block_scout_web/assets/static/images/errors-img/poa-tx-not-found.png
  98. BIN
      apps/block_scout_web/assets/static/images/errors-img/poa-tx-not-found@2x.png
  99. BIN
      apps/block_scout_web/assets/static/images/errors-img/rinkeby-block-not-found.png
  100. BIN
      apps/block_scout_web/assets/static/images/errors-img/rinkeby-block-not-found@2x.png
  101. Some files were not shown because too many files have changed in this diff Show More

@ -229,7 +229,7 @@ jobs:
eslint: eslint:
docker: docker:
# Ensure .tool-versions matches # Ensure .tool-versions matches
- image: circleci/node:9.10.1 - image: circleci/node:12.13.0-browsers-legacy
working_directory: ~/app working_directory: ~/app
@ -271,7 +271,7 @@ jobs:
jest: jest:
docker: docker:
# Ensure .tool-versions matches # Ensure .tool-versions matches
- image: circleci/node:9.10.1 - image: circleci/node:12.13.0-browsers-legacy
working_directory: ~/app working_directory: ~/app
@ -333,114 +333,114 @@ jobs:
name: Scan block_scout_web for vulnerabilities name: Scan block_scout_web for vulnerabilities
command: mix sobelow --config command: mix sobelow --config
working_directory: "apps/block_scout_web" working_directory: "apps/block_scout_web"
test_geth_http_websocket: # test_geth_http_websocket:
docker: # docker:
# Ensure .tool-versions matches # # Ensure .tool-versions matches
- image: circleci/elixir:1.9.1-node-browsers # - image: circleci/elixir:1.9.1-node-browsers
environment: # environment:
MIX_ENV: test # MIX_ENV: test
# match POSTGRES_PASSWORD for postgres image below # # match POSTGRES_PASSWORD for postgres image below
PGPASSWORD: postgres # PGPASSWORD: postgres
# match POSTGRES_USER for postgres image below # # match POSTGRES_USER for postgres image below
PGUSER: postgres # PGUSER: postgres
ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.HTTPWebSocket" # ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.HTTPWebSocket"
ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Geth" # ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Geth"
- image: circleci/postgres:10.3-alpine # - image: circleci/postgres:10.3-alpine
environment: # environment:
# Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database # # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database
POSTGRES_DB: explorer_test # POSTGRES_DB: explorer_test
# match PGPASSWORD for elixir image above # # match PGPASSWORD for elixir image above
POSTGRES_PASSWORD: postgres # POSTGRES_PASSWORD: postgres
# match PGUSER for elixir image above # # match PGUSER for elixir image above
POSTGRES_USER: postgres # POSTGRES_USER: postgres
working_directory: ~/app # working_directory: ~/app
steps: # steps:
- attach_workspace: # - attach_workspace:
at: . # at: .
- run: # - run:
command: ./bin/install_chrome_headless.sh # command: ./bin/install_chrome_headless.sh
no_output_timeout: 2400 # no_output_timeout: 2400
- run: mix local.hex --force # - run: mix local.hex --force
- run: mix local.rebar --force # - run: mix local.rebar --force
- run: # - run:
name: Wait for DB # name: Wait for DB
command: dockerize -wait tcp://localhost:5432 -timeout 1m # command: dockerize -wait tcp://localhost:5432 -timeout 1m
- run: # - run:
name: mix test --exclude no_geth # name: mix test --exclude no_geth
command: | # command: |
# Don't submit coverage report for forks, but let the build succeed # # Don't submit coverage report for forks, but let the build succeed
if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then # if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then
mix coveralls.html --exclude no_geth --parallel --umbrella # mix coveralls.html --exclude no_geth --parallel --umbrella
else # else
mix coveralls.circle --exclude no_geth --parallel --umbrella || # mix coveralls.circle --exclude no_geth --parallel --umbrella ||
# if mix failed, then coveralls_merge won't run, so signal done here and return original exit status # # if mix failed, then coveralls_merge won't run, so signal done here and return original exit status
(retval=$? && curl -k https://coveralls.io/webhook?repo_token=$COVERALLS_REPO_TOKEN -d "payload[build_num]=$CIRCLE_WORKFLOW_WORKSPACE_ID&payload[status]=done" && return $retval) # (retval=$? && curl -k https://coveralls.io/webhook?repo_token=$COVERALLS_REPO_TOKEN -d "payload[build_num]=$CIRCLE_WORKFLOW_WORKSPACE_ID&payload[status]=done" && return $retval)
fi # fi
- store_artifacts: # - store_artifacts:
path: cover/excoveralls.html # path: cover/excoveralls.html
- store_test_results: # - store_test_results:
path: _build/test/junit # path: _build/test/junit
test_geth_mox: # test_geth_mox:
docker: # docker:
# Ensure .tool-versions matches # # Ensure .tool-versions matches
- image: circleci/elixir:1.9.1-node-browsers # - image: circleci/elixir:1.9.1-node-browsers
environment: # environment:
MIX_ENV: test # MIX_ENV: test
# match POSTGRES_PASSWORD for postgres image below # # match POSTGRES_PASSWORD for postgres image below
PGPASSWORD: postgres # PGPASSWORD: postgres
# match POSTGRES_USER for postgres image below # # match POSTGRES_USER for postgres image below
PGUSER: postgres # PGUSER: postgres
ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.Mox" # ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.Mox"
ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox" # ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox"
- image: circleci/postgres:10.3-alpine # - image: circleci/postgres:10.3-alpine
environment: # environment:
# Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database # # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database
POSTGRES_DB: explorer_test # POSTGRES_DB: explorer_test
# match PGPASSWORD for elixir image above # # match PGPASSWORD for elixir image above
POSTGRES_PASSWORD: postgres # POSTGRES_PASSWORD: postgres
# match PGUSER for elixir image above # # match PGUSER for elixir image above
POSTGRES_USER: postgres # POSTGRES_USER: postgres
working_directory: ~/app # working_directory: ~/app
steps: # steps:
- attach_workspace: # - attach_workspace:
at: . # at: .
- run: # - run:
command: ./bin/install_chrome_headless.sh # command: ./bin/install_chrome_headless.sh
no_output_timeout: 2400 # no_output_timeout: 2400
- run: mix local.hex --force # - run: mix local.hex --force
- run: mix local.rebar --force # - run: mix local.rebar --force
- run: # - run:
name: Wait for DB # name: Wait for DB
command: dockerize -wait tcp://localhost:5432 -timeout 1m # command: dockerize -wait tcp://localhost:5432 -timeout 1m
- run: # - run:
name: mix test --exclude no_geth # name: mix test --exclude no_geth
command: | # command: |
# Don't submit coverage report for forks, but let the build succeed # # Don't submit coverage report for forks, but let the build succeed
if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then # if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then
mix coveralls.html --exclude no_geth --parallel --umbrella # mix coveralls.html --exclude no_geth --parallel --umbrella
else # else
mix coveralls.circle --exclude no_geth --parallel --umbrella || # mix coveralls.circle --exclude no_geth --parallel --umbrella ||
# if mix failed, then coveralls_merge won't run, so signal done here and return original exit status # # if mix failed, then coveralls_merge won't run, so signal done here and return original exit status
(retval=$? && curl -k https://coveralls.io/webhook?repo_token=$COVERALLS_REPO_TOKEN -d "payload[build_num]=$CIRCLE_WORKFLOW_WORKSPACE_ID&payload[status]=done" && return $retval) # (retval=$? && curl -k https://coveralls.io/webhook?repo_token=$COVERALLS_REPO_TOKEN -d "payload[build_num]=$CIRCLE_WORKFLOW_WORKSPACE_ID&payload[status]=done" && return $retval)
fi # fi
- store_artifacts: # - store_artifacts:
path: cover/excoveralls.html # path: cover/excoveralls.html
- store_test_results: # - store_test_results:
path: _build/test/junit # path: _build/test/junit
test_parity_http_websocket: test_parity_http_websocket:
docker: docker:
# Ensure .tool-versions matches # Ensure .tool-versions matches
@ -573,8 +573,8 @@ workflows:
requires: requires:
- test_parity_http_websocket - test_parity_http_websocket
- test_parity_mox - test_parity_mox
- test_geth_http_websocket # - test_geth_http_websocket
- test_geth_mox # - test_geth_mox
- credo: - credo:
requires: requires:
- build - build
@ -593,8 +593,8 @@ workflows:
- sobelow - sobelow
- test_parity_http_websocket - test_parity_http_websocket
- test_parity_mox - test_parity_mox
- test_geth_http_websocket # - test_geth_http_websocket
- test_geth_mox # - test_geth_mox
- dialyzer: - dialyzer:
requires: requires:
- build - build
@ -619,9 +619,9 @@ workflows:
- test_parity_mox: - test_parity_mox:
requires: requires:
- build - build
- test_geth_http_websocket: # - test_geth_http_websocket:
requires: # requires:
- build # - build
- test_geth_mox: # - test_geth_mox:
requires: # requires:
- build # - build

@ -12,4 +12,5 @@ apps/block_scout_web/lib/block_scout_web/views/layout_view.ex:175: The call 'Eli
apps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The pattern 'false' can never match the type 'true' apps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The pattern 'false' can never match the type 'true'
apps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The test 5 == 'infinity' can never evaluate to 'true' apps/explorer/lib/explorer/smart_contract/publisher_worker.ex:6: The test 5 == 'infinity' can never evaluate to 'true'
lib/block_scout_web/router.ex:1 lib/block_scout_web/router.ex:1
lib/phoenix/router.ex:324 lib/phoenix/router.ex:324
lib/block_scout_web/views/layout_view.ex:146

@ -1,6 +1,48 @@
## Current ## Current
### Features ### Features
- [#2862](https://github.com/poanetwork/blockscout/pull/2862) - Coin total supply from DB API endpoint
- [#2822](https://github.com/poanetwork/blockscout/pull/2822) - Estimated address count on the main page, if cache is empty
- [#2821](https://github.com/poanetwork/blockscout/pull/2821) - add autodetection of constructor arguments
- [#2825](https://github.com/poanetwork/blockscout/pull/2825) - separate token transfers and transactions
- [#2787](https://github.com/poanetwork/blockscout/pull/2787) - async fetching of address counters
- [#2791](https://github.com/poanetwork/blockscout/pull/2791) - add ipc client
- [#2449](https://github.com/poanetwork/blockscout/pull/2449) - add ability to send notification events through postgres notify
### Fixes
- [#2864](https://github.com/poanetwork/blockscout/pull/2864) - add token instance metadata type check
- [#2855](https://github.com/poanetwork/blockscout/pull/2855) - Fix favicons load
- [#2854](https://github.com/poanetwork/blockscout/pull/2854) - Fix all npm vulnerabilities
- [#2851](https://github.com/poanetwork/blockscout/pull/2851) - Fix paths for front assets
- [#2843](https://github.com/poanetwork/blockscout/pull/2843) - fix realtime fetcher small skips feature
- [#2841](https://github.com/poanetwork/blockscout/pull/2841) - LUKSO dashboard height fix
- [#2837](https://github.com/poanetwork/blockscout/pull/2837) - fix txlist ordering issue
- [#2830](https://github.com/poanetwork/blockscout/pull/2830) - Fix wrong color of contract icon on xDai chain
- [#2829](https://github.com/poanetwork/blockscout/pull/2829) - Fix for stuck gas limit label and value
- [#2828](https://github.com/poanetwork/blockscout/pull/2828) - Fix for script that clears compilation/launching assets
- [#2800](https://github.com/poanetwork/blockscout/pull/2800) - return not found for not verified contract for token read_contract
- [#2806](https://github.com/poanetwork/blockscout/pull/2806) - Fix blocks fetching on the main page
- [#2803](https://github.com/poanetwork/blockscout/pull/2803) - Fix block validator custom tooltip
### Chore
- [#2859](https://github.com/poanetwork/blockscout/pull/2859) - Add eth_blockNumber API endpoint to eth_rpc section
- [#2846](https://github.com/poanetwork/blockscout/pull/2846) - Remove networks images preload
- [#2845](https://github.com/poanetwork/blockscout/pull/2845) - Set outline none for nav dropdown item in mobile view (fix for Safari)
- [#2844](https://github.com/poanetwork/blockscout/pull/2844) - Extend external reward types up to 20
- [#2827](https://github.com/poanetwork/blockscout/pull/2827) - Node js 12.13.0 (latest LTS release) support
- [#2818](https://github.com/poanetwork/blockscout/pull/2818) - allow hiding marketcap percentage
- [#2817](https://github.com/poanetwork/blockscout/pull/2817) - move docker integration documentation to blockscout docs
- [#2808](https://github.com/poanetwork/blockscout/pull/2808) - Add tooltip for tx input
- [#2807](https://github.com/poanetwork/blockscout/pull/2807) - 422 page
- [#2805](https://github.com/poanetwork/blockscout/pull/2805) - Update supported chains default option
- [#2801](https://github.com/poanetwork/blockscout/pull/2801) - remove unused clause in address_to_unique_tokens query
## 2.1.0-beta
### Features
- [#2776](https://github.com/poanetwork/blockscout/pull/2776) - fetch token counters async
- [#2772](https://github.com/poanetwork/blockscout/pull/2772) - add token instance images to the token inventory tab - [#2772](https://github.com/poanetwork/blockscout/pull/2772) - add token instance images to the token inventory tab
- [#2733](https://github.com/poanetwork/blockscout/pull/2733) - Add cache for first page of uncles - [#2733](https://github.com/poanetwork/blockscout/pull/2733) - Add cache for first page of uncles
- [#2735](https://github.com/poanetwork/blockscout/pull/2735) - Add pending transactions cache - [#2735](https://github.com/poanetwork/blockscout/pull/2735) - Add pending transactions cache
@ -18,12 +60,18 @@
- [#2470](https://github.com/poanetwork/blockscout/pull/2470) - Allow Realtime Fetcher to wait for small skips - [#2470](https://github.com/poanetwork/blockscout/pull/2470) - Allow Realtime Fetcher to wait for small skips
### Fixes ### Fixes
- [#2793](https://github.com/poanetwork/blockscout/pull/2793) - Hide "We are indexing this chain right now. Some of the counts may be inaccurate" banner if no txs in blockchain
- [#2779](https://github.com/poanetwork/blockscout/pull/2779) - fix fetching `latin1` encoded data
- [#2799](https://github.com/poanetwork/blockscout/pull/2799) - fix catchup fetcher for empty node and db
- [#2783](https://github.com/poanetwork/blockscout/pull/2783) - Fix stuck value and ticker on the token page
- [#2781](https://github.com/poanetwork/blockscout/pull/2781) - optimize txlist json rpc
- [#2777](https://github.com/poanetwork/blockscout/pull/2777) - Remove duplicate blocks from changes_list before import - [#2777](https://github.com/poanetwork/blockscout/pull/2777) - Remove duplicate blocks from changes_list before import
- [#2755](https://github.com/poanetwork/blockscout/pull/2755) - various token instance fetcher fixes
- [#2770](https://github.com/poanetwork/blockscout/pull/2770) - do not re-fetch token instances without uris - [#2770](https://github.com/poanetwork/blockscout/pull/2770) - do not re-fetch token instances without uris
- [#2769](https://github.com/poanetwork/blockscout/pull/2769) - optimize token token transfers query
- [#2761](https://github.com/poanetwork/blockscout/pull/2761) - add indexes for token instances fetching queries - [#2761](https://github.com/poanetwork/blockscout/pull/2761) - add indexes for token instances fetching queries
- [#2767](https://github.com/poanetwork/blockscout/pull/2767) - fix websocket subscriptions with token instances - [#2767](https://github.com/poanetwork/blockscout/pull/2767) - fix websocket subscriptions with token instances
- [#2765](https://github.com/poanetwork/blockscout/pull/2765) - fixed width issue for cards in mobile view for Transaction Details page - [#2765](https://github.com/poanetwork/blockscout/pull/2765) - fixed width issue for cards in mobile view for Transaction Details page
- [#2755](https://github.com/poanetwork/blockscout/pull/2755) - various token instance fetcher fixes
- [#2753](https://github.com/poanetwork/blockscout/pull/2753) - fix nft token instance images - [#2753](https://github.com/poanetwork/blockscout/pull/2753) - fix nft token instance images
- [#2750](https://github.com/poanetwork/blockscout/pull/2750) - fixed contract buttons color for NFT token instance on each theme - [#2750](https://github.com/poanetwork/blockscout/pull/2750) - fixed contract buttons color for NFT token instance on each theme
- [#2746](https://github.com/poanetwork/blockscout/pull/2746) - fixed wrong alignment in logs decoded view - [#2746](https://github.com/poanetwork/blockscout/pull/2746) - fixed wrong alignment in logs decoded view
@ -51,10 +99,18 @@ fixed menu hovers in dark mode desktop view
- [#2738](https://github.com/poanetwork/blockscout/pull/2738) - do not fail block `internal_transactions_indexed_at` field update - [#2738](https://github.com/poanetwork/blockscout/pull/2738) - do not fail block `internal_transactions_indexed_at` field update
### Chore ### Chore
- [#2797](https://github.com/poanetwork/blockscout/pull/2797) - Return old style menu
- [#2796](https://github.com/poanetwork/blockscout/pull/2796) - Optimize all images with ImageOptim
- [#2794](https://github.com/poanetwork/blockscout/pull/2786) - update hosted versions in readme
- [#2789](https://github.com/poanetwork/blockscout/pull/2786) - remove projects table in readme, link to docs version
- [#2786](https://github.com/poanetwork/blockscout/pull/2786) - updated docs links, removed docs folder
- [#2752](https://github.com/poanetwork/blockscout/pull/2752) - allow enabling internal transactions for simple token transfers txs
- [#2749](https://github.com/poanetwork/blockscout/pull/2749) - fix opt 22.1 support - [#2749](https://github.com/poanetwork/blockscout/pull/2749) - fix opt 22.1 support
- [#2744](https://github.com/poanetwork/blockscout/pull/2744) - Disable Geth tests in CI
- [#2724](https://github.com/poanetwork/blockscout/pull/2724) - fix ci by commenting a line in hackney library - [#2724](https://github.com/poanetwork/blockscout/pull/2724) - fix ci by commenting a line in hackney library
- [#2708](https://github.com/poanetwork/blockscout/pull/2708) - add log index to logs view - [#2708](https://github.com/poanetwork/blockscout/pull/2708) - add log index to logs view
- [#2723](https://github.com/poanetwork/blockscout/pull/2723) - get rid of ex_json_schema warnings - [#2723](https://github.com/poanetwork/blockscout/pull/2723) - get rid of ex_json_schema warnings
- [#2740](https://github.com/poanetwork/blockscout/pull/2740) - add verify contract rpc doc
## 2.0.4-beta ## 2.0.4-beta

@ -2,7 +2,7 @@
## Motivation ## Motivation
*Why should we merge these changes. If using GitHub keywords to close [issues](https://github.com/poanetwork/blockscout/issues), this is optional as the motivation can be read on the issue page.* *Why we should merge these changes. If using GitHub keywords to close [issues](https://github.com/poanetwork/blockscout/issues), this is optional as the motivation can be read on the issue page.*
## Changelog ## Changelog
@ -19,7 +19,7 @@
*If you have any Incompatible Changes in the above Changelog, outline how users of prior versions can upgrade once this PR lands or when reviewers are testing locally. A common upgrading step is "Database reset and re-index required".* *If you have any Incompatible Changes in the above Changelog, outline how users of prior versions can upgrade once this PR lands or when reviewers are testing locally. A common upgrading step is "Database reset and re-index required".*
## Checklist for your PR ## Checklist for your Pull Request (PR)
<!-- <!--
Ideally a PR has all of the checkmarks set. Ideally a PR has all of the checkmarks set.
@ -28,12 +28,12 @@
checkmark indicating that you are sure it is dealt with (be that by irrelevance). checkmark indicating that you are sure it is dealt with (be that by irrelevance).
If you don't set a checkmark (e. g. don't add a test for new functionality), If you don't set a checkmark (e. g. don't add a test for new functionality),
you must be able to justify that. please justify why.
--> -->
- [ ] I added an entry to `CHANGELOG.md` with this PR - [ ] I added an entry to `CHANGELOG.md` with this PR
- [ ] If I added new functionality, I added tests covering it. - [ ] If I added new functionality, I added tests covering it.
- [ ] If I fixed a bug, I added a regression test to prevent the bug from silently reappearing again. - [ ] If I fixed a bug, I added a regression test to prevent the bug from silently reappearing again.
- [ ] I checked whether I should update the docs and did so if necessary - [ ] I checked whether I should update the docs and did so by submitting a PR to https://github.com/blockscout/docs
- [ ] If I added/changed/removed ENV var, I should update the list of env vars in https://github.com/poanetwork/blockscout/blob/master/docs/env-variables.md to reflect changes in the table here https://poanetwork.github.io/blockscout/#/env-variables?id=blockscout-env-variables. I've set `master` in the `Version` column. - [ ] If I added/changed/removed ENV var, I submitted a PR to https://github.com/blockscout/docs to update the list of env vars at https://github.com/blockscout/docs/blob/master/for-developers/information-and-settings/env-variables.md and I updated the version to `master` in the Version column. Changes will be reflected in this table: https://docs.blockscout.com/for-developers/information-and-settings/env-variables.
- [ ] If I add new indices into DB, I checked, that they don't redundant with PGHero or other tools - [ ] If I add new indices into DB, I checked, that they are not redundant with PGHero or other tools

@ -1,6 +1,6 @@
<p align="center"> <p align="center">
<a href="https://blockscout.com"> <a href="https://blockscout.com">
<img width="200" src="https://blockscout.com/eth/mainnet/android-chrome-192x192.png" \> <img width="200" src="https://blockscout.com/poa/core/android-chrome-192x192.png" \>
</a> </a>
</p> </p>
@ -12,9 +12,9 @@
</div> </div>
BlockScout provides a comprehensive, easy-to-use interface for users to view, confirm, and inspect transactions on **all EVM** (Ethereum Virtual Machine) blockchains. This includes the Ethereum main and test networks as well as **Ethereum forks and sidechains**. BlockScout provides a comprehensive, easy-to-use interface for users to view, confirm, and inspect transactions on EVM (Ethereum Virtual Machine) blockchains. This includes the POA Network, xDai Chain, Ethereum Classic and other **Ethereum testnets, private networks and sidechains**.
See our [project documentation](https://poanetwork.github.io/blockscout) for detailed information and setup instructions. See our [project documentation](https://docs.blockscout.com/) for detailed information and setup instructions.
Visit the [POA BlockScout forum](https://forum.poa.network/c/blockscout) for FAQs, troubleshooting, and other BlockScout related items. You can also post and answer questions here. Visit the [POA BlockScout forum](https://forum.poa.network/c/blockscout) for FAQs, troubleshooting, and other BlockScout related items. You can also post and answer questions here.
@ -22,39 +22,26 @@ You can also access the dev chatroom on our [Gitter Channel](https://gitter.im/p
## About BlockScout ## About BlockScout
BlockScout is an Elixir application that allows users to search transactions, view accounts and balances, and verify smart contracts on the entire Ethereum network including all forks and sidechains. BlockScout is an Elixir application that allows users to search transactions, view accounts and balances, and verify smart contracts on the Ethereum network including all forks and sidechains.
Currently available full-featured block explorers (Etherscan, Etherchain, Blockchair) are closed systems which are not independently verifiable. As Ethereum sidechains continue to proliferate in both private and public settings, transparent, open-source tools are needed to analyze and validate transactions. Currently available full-featured block explorers (Etherscan, Etherchain, Blockchair) are closed systems which are not independently verifiable. As Ethereum sidechains continue to proliferate in both private and public settings, transparent, open-source tools are needed to analyze and validate transactions.
## Supported Projects ## Supported Projects
| **Hosted Mainnets** | **Hosted Testnets** | **Additional Chains using BlockScout** | **Additional Chains using BlockScout** | BlockScout supports a number of projects. Hosted instances include POA Network, xDai Chain, Ethereum Classic, Sokol & Kovan testnets, and other EVM chains.
|--------------------------------------------------------|-------------------------------------------------------|------------------------------------------------------|----------------------------------------------------------------|
| [Callisto](https://blockscout.com/callisto/mainnet) | [Goerli Testnet](https://blockscout.com/eth/goerli) | [ARTIS](https://explorer.sigma1.artis.network) | [Celo Testnet](https://alfajores-blockscout.celo-testnet.org/) | - [List of hosted mainnets, testnets, and additional chains using BlockScout](https://docs.blockscout.com/for-projects/supported-projects)
| [Ethereum Classic](https://blockscout.com/etc/mainnet) | [Kovan Testnet](https://blockscout.com/eth/kovan) | [Ether-1](https://blocks.ether1.wattpool.net/) | [Matic Testnet](https://explorer.testnet2.matic.network/) | - [Hosted instance versions](https://docs.blockscout.com/about/use-cases/hosted-blockscout)
| [Ethereum Mainnet](https://blockscout.com/eth/mainnet) | [LUKSO L14 Testnet](https://blockscout.com/lukso/l14) | [Kotti Testnet](https://kottiexplorer.ethernode.io/) | [Mordor Testnet](https://mordorexplorer.ethernode.io/) |
| [POA Core Network](https://blockscout.com/poa/core)| [POA Sokol Testnet](https://blockscout.com/poa/sokol) | [Fuse Network](https://explorer.fuse.io/) | [Athereum Testnet](http://athexplorer.ava.network/) |
| [RSK](https://blockscout.com/rsk/mainnet) | [Rinkeby Testnet](https://blockscout.com/eth/rinkeby) | [Oasis Labs](https://blockexplorer.oasiscloud.io/) | |
| [xDai Chain](https://blockscout.com/poa/dai) | [Ropsten Testnet](https://blockscout.com/eth/ropsten) | [Petrichor](https://explorer.petrachor.com/) | |
| | | [PIRL](http://pirl.es/) | |
| | | [SafeChain](https://explorer.safechain.io) | |
| | | [SpringChain](https://explorer.springrole.com/) | |
| | | [Tenda](https://tenda.network) | |
| | | [Loom](http://plasma-blockexplorer.dappchains.com/) | |
| | | [GoJoy Chain](https://gojoychain.com/) | |
| | | [Xerom](https://blocks.xerom.org/) | |
Current BlockScout versions for hosted projects are available [on the forum](https://forum.poa.network/t/deployed-instances-on-blockscout-com/1938).
## Getting Started ## Getting Started
See the [project documentation](https://poanetwork.github.io/blockscout) for instructions: See the [project documentation](https://docs.blockscout.com/) for instructions:
- [Requirements](https://poanetwork.github.io/blockscout/#/requirements) - [Requirements](https://docs.blockscout.com/for-developers/information-and-settings/requirements)
- [Ansible deployment](https://poanetwork.github.io/blockscout/#/ansible-deployment) - [Ansible deployment](https://docs.blockscout.com/for-developers/ansible-deployment)
- [Manual deployment](https://poanetwork.github.io/blockscout/#/manual-deployment) - [Manual deployment](https://docs.blockscout.com/for-developers/manual-deployment)
- [ENV variables](https://poanetwork.github.io/blockscout/#/env-variables) - [ENV variables](https://docs.blockscout.com/for-developers/information-and-settings/env-variables)
- [Configuration options](https://poanetwork.github.io/blockscout/#/dev-env) - [Configuration options](https://docs.blockscout.com/for-developers/configuration-options)
## Acknowledgements ## Acknowledgements

@ -21,7 +21,7 @@ This is a tool for inspecting and analyzing the POA Network blockchain from a we
To get BlockScout Web interface up and running locally: To get BlockScout Web interface up and running locally:
* Setup `../explorer` * Setup `../explorer`
* Set up some default configuration with: `$ cp config/dev.secret.exs.example config/dev.secret.esx` * Set up some default configuration with: `$ cp config/dev.secret.exs.example config/dev.secret.exs`
* Install Node.js dependencies with `$ cd assets && npm install && cd ..` * Install Node.js dependencies with `$ cd assets && npm install && cd ..`
* Start Phoenix with `$ mix phx.server` (This can be run from this directory or the project root: the project root is recommended.) * Start Phoenix with `$ mix phx.server` (This can be run from this directory or the project root: the project root is recommended.)

@ -1,5 +1,3 @@
{ {
presets: [ "presets": ["@babel/preset-env"]
'env'
]
} }

@ -3,7 +3,7 @@ $blue: #4b89fb !default;
$success: #34c0ad !default; $success: #34c0ad !default;
body { body {
font-family: $font-family-sans-serif; font-family: $font-family;
font-size: 12px; font-size: 12px;
} }

@ -16,6 +16,7 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
// Bootstrap Core CSS // Bootstrap Core CSS
@import "node_modules/bootstrap/scss/functions"; @import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins"; @import "node_modules/bootstrap/scss/mixins";
@import "theme/variables"; @import "theme/variables";
@ -60,7 +61,6 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
// Custom SCSS // Custom SCSS
@import "layout"; @import "layout";
@import "typography"; @import "typography";
@import "images-preload";
@import "code"; @import "code";
@import "helpers"; @import "helpers";
@import "elements"; @import "elements";
@ -110,7 +110,6 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
@import "components/log-search"; @import "components/log-search";
@import "components/radio"; @import "components/radio";
@import "components/modal_variables"; @import "components/modal_variables";
@import "components/network-selector";
@import "components/new_smart_contract"; @import "components/new_smart_contract";
@import "components/radio_big"; @import "components/radio_big";
@import "components/btn_no_border"; @import "components/btn_no_border";

@ -1,4 +1,5 @@
/* Custom Tooltips for Block Details Page */ /* Custom Tooltips for Block Details Page */
$tooltip-background-color: $btn-line-color !default;
.tooltipCustom { .tooltipCustom {
position: relative; position: relative;
@ -8,23 +9,20 @@
.tooltipCustom .tooltiptextTopMiner { .tooltipCustom .tooltiptextTopMiner {
visibility: hidden; visibility: hidden;
position: absolute; position: absolute;
width: 50%; width: 100%;
background-color: white; background-color: white;
color: black; color: $tooltip-background-color;
text-align: center; text-align: center;
border-radius: 6px; border-radius: 6px;
left: 25%; left: 0%;
bottom: 100%; bottom: 100%;
padding: 15px 0px; padding: 15px;
display: inline-block; display: inline-block;
z-index: 1; z-index: 1;
font-family: Nunito; font-family: Nunito;
margin-bottom: 15px; margin-bottom: 15px;
opacity: 0; opacity: 0;
transition: opacity 0.5s; transition: opacity 0.5s;
@include media-breakpoint-down(lg) {
left: 60%;
}
} }
.tooltipCustom .tooltiptextTopMiner::after { .tooltipCustom .tooltiptextTopMiner::after {
@ -43,44 +41,5 @@
opacity: 1; opacity: 1;
} }
.tooltipCustom .tooltiptextTopR {
visibility: hidden;
position: absolute;
width: 50%;
background-color: $primary;
color: white;
text-align: center;
border-radius: 6px;
left: 52%;
bottom: 120%;
padding: 15px 10px;
font-family: Nunito;
display: inline-block;
z-index: 1;
margin-bottom: 15px;
opacity: 0;
transition: opacity 0.5s;
@include media-breakpoint-down(lg) {
bottom: 100%;
padding: 9px 10px;
}
}
.tooltipCustom .tooltiptextTopR::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: $primary transparent transparent transparent;
}
.tooltipCustom:hover .tooltiptextTopR {
visibility: visible;
opacity: 1;
}
/* Custom Tooltips for Block Details Page end*/ /* Custom Tooltips for Block Details Page end*/

@ -25,6 +25,7 @@ $navbar-logo-width: auto !default;
.navbar-nav { .navbar-nav {
.nav-link { .nav-link {
outline: none;
align-items: center; align-items: center;
color: $header-links-color; color: $header-links-color;
display: flex; display: flex;
@ -259,139 +260,3 @@ $navbar-logo-width: auto !default;
transition: none !important; transition: none !important;
} }
} }
.nav-link-new {
margin-left: auto;
font-size: 14px;
color: #333333;
@include media-breakpoint-up(lg) {
display: none;
}
}
.new-button {
margin-right: -7px !important;
padding-right: 0px;
height: 20px!important;
border-left: 1px solid #a3a9b5!important;
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px;
background: transparent;
border: none;
cursor: pointer;
outline: none !important;
box-shadow: none !important;
transition: .2s ease-in;
@include media-breakpoint-up(lg) {
display: none!important;
}
}
@media (max-width: 992px) {
.navbar.navbar-primary .navbar-nav .nav-link .nav-link-icon {
display: none;
}
.navbar-nav .nav-item .dropdown-toggle::after {
display: none;
}
.navbar.navbar-primary .navbar-nav .nav-link {
font-size: 28px;
color: #333333;
padding: 0.7rem 1.4rem;
font-weight: 600;
}
.navbar .dropdown-menu {
box-shadow: none;
}
.navbar .dropdown-menu .dark-mode-changer {
display: none;
}
.nav-item .dropdown {
padding: 0px 15%;
font-weight: 600;
}
.last-child {
display: none!important;
}
.search-form {
width: 100%!important;
}
.awesomplete {
height: 50px;
}
.navbar.navbar-primary .input-group-append {
left: 15px !important;
}
.navbar.navbar-primary .form-control {
padding-right: 30px;
padding-left: 13.5%;
}
.dropdown-item {
padding: 10px 1.6rem !important;
color: rgba(51, 51, 51, 0.7)!important;
}
.navbar.navbar-primary .navbar-nav .nav-link:hover,
.navbar.navbar-primary .navbar-nav .nav-link.activeLink,
.navbar.navbar-primary .navbar-nav .nav-link:focus {
background-image: linear-gradient(to right, #f5f6fa, rgba(245, 246, 250, 0));
width: 100%;
}
.navbar.navbar-primary .navbar-nav .nav-link:hover:before {
content: "|";
height: 50px;
width: 50%;
opacity: 1;
background: none;
left: 24%;
top: 14%;
color: $primary;
}
.navbar {
padding: 0.5rem 0rem!important;
}
.navbar-brand {
margin-right: 0px!important;
margin-left: 1rem;
}
.dropdown-item.active,
.dropdown-item:hover,
.dropdown-item:focus {
background-image: linear-gradient(to right, #f5f6fa, rgba(245, 246, 250, 0));
width: 100%;
background-color: white!important;
}
.dropdown-item:hover:before {
content: "|";
height: 50px;
width: 50%;
opacity: 1;
background: none;
right: 17%;
color: $primary;
position: relative;
}
.dark-mode-changer svg path {
fill: #a3a9b5!important;
}
.dropdown-toggle::after {
margin-left: 0.51em!important;
color: #a3a9b5;
}
#toggleImage2 {
display: none;
outline: none;
padding-left: 5px;
padding-right: 5px;
}
#toggleImage1 {
width: 27px!important;
}
.dark-mode-changer {
display: none!important;
}
}

@ -10,6 +10,7 @@ $tooltip-color: #fff !default;
border-radius: 5px; border-radius: 5px;
color: $tooltip-color; color: $tooltip-color;
padding: 15px; padding: 15px;
font-size: 12px;
} }
.arrow::before { .arrow::before {

@ -1,5 +1,6 @@
// Bootstrap Core CSS // Bootstrap Core CSS
@import "node_modules/bootstrap/scss/functions"; @import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins"; @import "node_modules/bootstrap/scss/mixins";
@import "theme/variables-non-critical"; @import "theme/variables-non-critical";

@ -255,11 +255,11 @@ $transition-cont: all 0.4s ease-in-out !default;
// Font, line-height, and color for body text, headings, and more. // Font, line-height, and color for body text, headings, and more.
// stylelint-disable value-keyword-case // stylelint-disable value-keyword-case
$font-family-sans-serif: Nunito, "Helvetica Neue", Arial, sans-serif, $font-family: Nunito, "Helvetica Neue", Arial, sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default; "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, $font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace !default; "Liberation Mono", "Courier New", monospace !default;
$font-family-base: $font-family-sans-serif !default; $font-family-base: $font-family !default;
// stylelint-enable value-keyword-case // stylelint-enable value-keyword-case
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` $font-size-base: 1rem !default; // Assumes the browser default, typically `16px`

@ -1,23 +1,23 @@
// general // general
$primary: #233174; $primary: #17314f;
$secondary: #15f9bb; $secondary: #15bba6;
$tertiary: #5a77ff; $tertiary: #93d7ff;
$additional-font: #fff; $additional-font: #fff;
// footer // footer
$footer-background-color:#202d6a; $footer-background-color: $primary;
$footer-title-color: #fff; $footer-title-color: #fff;
$footer-text-color: #b5c2ff; $footer-text-color: #96bde8;
$footer-item-disc-color: $secondary; $footer-item-disc-color: $secondary;
.footer-logo { filter: brightness(0) invert(1); } .footer-logo { filter: brightness(0) invert(1); }
.footer-social-icon { color: $secondary!important; }
// dashboard // dashboard
$dashboard-line-color-price: $tertiary; // price left border $dashboard-line-color-price: $tertiary; // price left border
$dashboard-line-color-market: $secondary; $dashboard-line-color-market: $secondary;
$dashboard-banner-chart-legend-label-color: $footer-text-color; $dashboard-banner-chart-legend-label-color: $footer-text-color;
$dashboard-stats-item-label-color: #b4c1ff; $dashboard-stats-item-label-color: $footer-text-color;
$dashboard-banner-chart-legend-value-color: #fff; // chart labels $dashboard-banner-chart-legend-value-color: #fff; // chart labels
$dashboard-stats-item-value-color: #fff; // stat values $dashboard-stats-item-value-color: #fff; // stat values
@ -25,11 +25,9 @@ $dashboard-stats-item-border-color: $secondary; // stat border
$dashboard-banner-gradient-start: $primary; // gradient begin $dashboard-banner-gradient-start: $primary; // gradient begin
$dashboard-banner-gradient-end: #1e2a63; $dashboard-banner-gradient-end: lighten($primary, 5); // gradient end
// gradient end
$dashboard-banner-network-plain-container-background-color: #273781 $dashboard-banner-network-plain-container-background-color: #20446e; // stats bg
; // stats bg
// navigation // navigation
@ -37,20 +35,21 @@ $dashboard-banner-network-plain-container-background-color: #273781
// buttons // buttons
$btn-line-bg: #fff; // button bg $btn-line-bg: #fff; // button bg
$btn-line-color: $primary; // button border and font color && hover bg color $btn-line-color: $secondary; // button border and font color && hover bg color
$btn-copy-color: $primary; // btn copy $btn-copy-color: $secondary; // btn copy
$btn-qr-color: $primary; // btn qr-code $btn-qr-color: $secondary; // btn qr-code
$btn-address-card-icon-color: $secondary; // btn address color $btn-address-card-icon-color: $secondary; // btn address color
$btn-contract-color: $secondary;
//links & tile //links & tile
$tile-body-a-color: $tertiary; $tile-body-a-color: $secondary;
$tile-type-block-color: $primary; $tile-type-block-color: $secondary;
$tile-type-progress-bar-color: $primary; $tile-type-progress-bar-color: $secondary;
a.tile-title { color: $primary !important; } a.tile-title { color: $secondary !important; }
// card // card
$card-background-1: $primary; $card-background-1: $secondary;
$card-tab-active: $primary; $card-tab-active: $secondary;
.layout-container { .layout-container {
.dashboard-banner-container { .dashboard-banner-container {
@ -68,20 +67,6 @@ $badge-neutral-background-color: rgba(#20446e, .1);
$api-text-monospace-color: #20446e; $api-text-monospace-color: #20446e;
// Dark theme // Dark theme
$dark-primary: #233174; $dark-primary: #15bba6;
$dark-secondary:#15f9bb; $dark-secondary: #93d7ff;
$dark-tertiary: #5a77ff; $dark-primary-alternate: #15bba6;
.dark-theme-applied .tile .tile-body a, .dark-theme-applied .tile span[data-address-hash] {
color: $dark-tertiary!important;
}
.dark-theme-applied .btn-line {
background-color: transparent!important;
border-color: $dark-tertiary!important;
color: $dark-tertiary!important;
}
.dark-theme-applied .btn-line:hover {
color: $additional-font!important;
}

@ -786,43 +786,16 @@ $labels-dark: #8a8dba; // header nav, labels
} }
.dark-theme-applied .dropdown-item { .dark-theme-applied .dropdown-item {
background-color: $dark-light!important;
color: #fff!important; color: #fff!important;
} }
.dark-theme-applied .dropdown-item.active, .dark-theme-applied .dropdown-item:hover, .dark-theme-applied .dropdown-item:focus { .dark-theme-applied .dropdown-item.active:not(.header), .dark-theme-applied .dropdown-item:not(.header):hover, .dark-theme-applied .dropdown-item:not(.header):focus {
background-image: none; background-image: none;
width: 100%; width: 100%;
background-color: #3f426c!important; background-color: #3f426c !important;
} }
@media (max-width: 991.98px) {
.dark-theme-applied .navbar.navbar-primary .navbar-nav .nav-link:hover, .dark-theme-applied .dropdown-item.active.header, .dark-theme-applied .dropdown-item.header:hover, .dark-theme-applied .dropdown-item.header:focus {
.dark-theme-applied .navbar.navbar-primary .navbar-nav .nav-link.activeLink, background-color: $dark-light !important;
.dark-theme-applied .navbar.navbar-primary .navbar-nav .nav-link:focus { }
background-image: none;
width: 100%;
background-color: #35335d!important;
color: white;
border: none;
}
.dark-theme-applied .dropdown-item:hover:before {
content: "|";
height: 50px;
width: 50%;
opacity: 1;
background: none;
right: 17%;
color: $dark-primary;
position: relative;
}
.dark-theme-applied .navbar.navbar-primary .navbar-nav .nav-link:hover:before
{
content: "|";
height: 50px;
width: 50%;
opacity: 1;
background: none;
left: 24%;
top: 14%;
color: $dark-primary;
}
}

@ -56,6 +56,9 @@ $dashboard-banner-network-stats-static-image: "/images/lukso_dashboard_image.png
$dashboard-banner-network-plain-container-height: 150px; $dashboard-banner-network-plain-container-height: 150px;
.layout-container { .layout-container {
.dashboard-banner-container {
height: auto !important;
}
.dashboard-banner-container::after { .dashboard-banner-container::after {
display: none; display: none;
} }

@ -20,9 +20,6 @@ import 'bootstrap'
import './locale' import './locale'
// support of preload in Firefox
import '../node_modules/fg-loadcss/dist/cssrelpreload.min'
import './pages/address' import './pages/address'
import './pages/address/coin_balances' import './pages/address/coin_balances'
import './pages/address/transactions' import './pages/address/transactions'
@ -34,10 +31,9 @@ import './pages/chain'
import './pages/pending_transactions' import './pages/pending_transactions'
import './pages/transaction' import './pages/transaction'
import './pages/transactions' import './pages/transactions'
import './pages/favorites'
import './pages/network-search'
import './pages/layout' import './pages/layout'
import './pages/verification_form' import './pages/verification_form'
import './pages/token_counters'
import './pages/dark-mode-switcher' import './pages/dark-mode-switcher'
import './pages/admin/tasks.js' import './pages/admin/tasks.js'
@ -64,4 +60,3 @@ import './lib/modals'
import './lib/try_api' import './lib/try_api'
import './lib/try_eth_api' import './lib/try_eth_api'
import './lib/card_tabs' import './lib/card_tabs'
import './lib/network_selector'

@ -271,7 +271,7 @@ export function createAsyncLoadStore (reducer, initialState, itemKey) {
}) })
} }
connectElements({store, elements}) connectElements({ store, elements })
firstPageLoad(store) firstPageLoad(store)
return store return store
} }
@ -280,20 +280,20 @@ function firstPageLoad (store) {
const $element = $('[data-async-listing]') const $element = $('[data-async-listing]')
function loadItemsNext () { function loadItemsNext () {
const path = store.getState().nextPagePath const path = store.getState().nextPagePath
store.dispatch({type: 'START_REQUEST'}) store.dispatch({ type: 'START_REQUEST' })
$.getJSON(path, {type: 'JSON'}) $.getJSON(path, { type: 'JSON' })
.done(response => store.dispatch(Object.assign({type: 'ITEMS_FETCHED'}, humps.camelizeKeys(response)))) .done(response => store.dispatch(Object.assign({ type: 'ITEMS_FETCHED' }, humps.camelizeKeys(response))))
.fail(() => store.dispatch({type: 'REQUEST_ERROR'})) .fail(() => store.dispatch({ type: 'REQUEST_ERROR' }))
.always(() => store.dispatch({type: 'FINISH_REQUEST'})) .always(() => store.dispatch({ type: 'FINISH_REQUEST' }))
} }
function loadItemsPrev () { function loadItemsPrev () {
const path = store.getState().prevPagePath const path = store.getState().prevPagePath
store.dispatch({type: 'START_REQUEST'}) store.dispatch({ type: 'START_REQUEST' })
$.getJSON(path, {type: 'JSON'}) $.getJSON(path, { type: 'JSON' })
.done(response => store.dispatch(Object.assign({type: 'ITEMS_FETCHED'}, humps.camelizeKeys(response)))) .done(response => store.dispatch(Object.assign({ type: 'ITEMS_FETCHED' }, humps.camelizeKeys(response))))
.fail(() => store.dispatch({type: 'REQUEST_ERROR'})) .fail(() => store.dispatch({ type: 'REQUEST_ERROR' }))
.always(() => store.dispatch({type: 'FINISH_REQUEST'})) .always(() => store.dispatch({ type: 'FINISH_REQUEST' }))
} }
loadItemsNext() loadItemsNext()
@ -305,14 +305,14 @@ function firstPageLoad (store) {
$element.on('click', '[data-next-page-button]', (event) => { $element.on('click', '[data-next-page-button]', (event) => {
event.preventDefault() event.preventDefault()
loadItemsNext() loadItemsNext()
store.dispatch({type: 'NAVIGATE_TO_OLDER'}) store.dispatch({ type: 'NAVIGATE_TO_OLDER' })
event.stopImmediatePropagation() event.stopImmediatePropagation()
}) })
$element.on('click', '[data-prev-page-button]', (event) => { $element.on('click', '[data-prev-page-button]', (event) => {
event.preventDefault() event.preventDefault()
loadItemsPrev() loadItemsPrev()
store.dispatch({type: 'NAVIGATE_TO_NEWER'}) store.dispatch({ type: 'NAVIGATE_TO_NEWER' })
event.stopImmediatePropagation() event.stopImmediatePropagation()
}) })
} }
@ -320,6 +320,6 @@ function firstPageLoad (store) {
const $element = $('[data-async-load]') const $element = $('[data-async-load]')
if ($element.length) { if ($element.length) {
const store = createStore(asyncReducer) const store = createStore(asyncReducer)
connectElements({store, elements}) connectElements({ store, elements })
firstPageLoad(store) firstPageLoad(store)
} }

@ -38,13 +38,13 @@ window.AwesompleteUtil = (function () {
var lv = Array.isArray(data) var lv = Array.isArray(data)
? { label: data[0], value: data[1] } ? { label: data[0], value: data[1] }
: typeof data === 'object' && 'label' in data && 'value' in data ? data : { label: data, value: data } : typeof data === 'object' && 'label' in data && 'value' in data ? data : { label: data, value: data }
return {label: lv.label || lv.value, value: lv.value} return { label: lv.label || lv.value, value: lv.value }
} }
// Helper to send events with detail property. // Helper to send events with detail property.
function _fire (target, name, detail) { function _fire (target, name, detail) {
// $.fire uses deprecated methods but other methods don't work in IE11. // $.fire uses deprecated methods but other methods don't work in IE11.
return $.fire(target, name, {detail: detail}) return $.fire(target, name, { detail: detail })
} }
// Look if there is an exact match or a mismatch, set awe-found, awe-not-found css class and send match events. // Look if there is an exact match or a mismatch, set awe-found, awe-not-found css class and send match events.
@ -74,7 +74,7 @@ window.AwesompleteUtil = (function () {
} }
} }
// Don't want to change the real input field, emulate a fake one. // Don't want to change the real input field, emulate a fake one.
fake = {input: {value: ''}} fake = { input: { value: '' } }
// Determine how this suggestion would look like if it is replaced in the input field, // Determine how this suggestion would look like if it is replaced in the input field,
// it is an exact match if somebody types exactly that. // it is an exact match if somebody types exactly that.
// Use the fake input here. fake.input.value will contain the result of the replace function. // Use the fake input here. fake.input.value will contain the result of the replace function.
@ -222,7 +222,7 @@ window.AwesompleteUtil = (function () {
awe.utilprops.url, awe.utilprops.url,
awe.utilprops.urlEnd, awe.utilprops.urlEnd,
awe.utilprops.loadall ? '' : val, awe.utilprops.loadall ? '' : val,
_onLoad.bind({awe: awe, xhr: xhr, queryVal: val}), _onLoad.bind({ awe: awe, xhr: xhr, queryVal: val }),
xhr xhr
) )
} else { } else {
@ -401,15 +401,15 @@ window.AwesompleteUtil = (function () {
// for arrays at top and subtop level // for arrays at top and subtop level
if (level < 2 && prop) { if (level < 2 && prop) {
// if a 'value' is specified and found a mathing property, create extra 'value' property. // if a 'value' is specified and found a mathing property, create extra 'value' property.
if (value && (prop + '.').lastIndexOf(value + '.', 0) === 0) { result['value'] = result[prop] } if (value && (prop + '.').lastIndexOf(value + '.', 0) === 0) { result.value = result[prop] }
// if a 'label' is specified and found a mathing property, create extra 'label' property. // if a 'label' is specified and found a mathing property, create extra 'label' property.
if (label && (prop + '.').lastIndexOf(label + '.', 0) === 0) { result['label'] = result[prop] } if (label && (prop + '.').lastIndexOf(label + '.', 0) === 0) { result.label = result[prop] }
} }
if (level === 0) { if (level === 0) {
// Make sure that both value and label properties exist, even if they are nil. // Make sure that both value and label properties exist, even if they are nil.
// This is handy with limit 0 or 1 when the result doesn't have to contain an array. // This is handy with limit 0 or 1 when the result doesn't have to contain an array.
if (value && !('value' in result)) { result['value'] = null } if (value && !('value' in result)) { result.value = null }
if (label && !('label' in result)) { result['label'] = null } if (label && !('label' in result)) { result.label = null }
} }
return result return result
} }
@ -506,17 +506,18 @@ window.AwesompleteUtil = (function () {
var boundOnKeydown = _onKeydown.bind(awe) var boundOnKeydown = _onKeydown.bind(awe)
var boundOnInput = _onInput.bind(awe) var boundOnInput = _onInput.bind(awe)
var boundSelect = _select.bind(awe) var boundSelect = _select.bind(awe)
var boundDetach = _detach.bind({awe: awe, var boundDetach = _detach.bind({
awe: awe,
boundMatch: boundMatch, boundMatch: boundMatch,
boundOnInput: boundOnInput, boundOnInput: boundOnInput,
boundOnKeydown: boundOnKeydown, boundOnKeydown: boundOnKeydown,
boundSelect: boundSelect boundSelect: boundSelect
}) })
var events = { var events = {
'keydown': boundOnKeydown, keydown: boundOnKeydown,
'input': boundOnInput input: boundOnInput
} }
events['blur'] = events[_AWE_CLOSE] = events[_AWE_LOAD] = boundMatch events.blur = events[_AWE_CLOSE] = events[_AWE_LOAD] = boundMatch
events[_AWE_SELECT] = boundSelect events[_AWE_SELECT] = boundSelect
$.bind(elem, events) $.bind(elem, events)
@ -552,7 +553,7 @@ window.AwesompleteUtil = (function () {
// Create function to copy a field from the selected autocomplete item to another DOM element. // Create function to copy a field from the selected autocomplete item to another DOM element.
// dataField can be null. // dataField can be null.
createCopyFun: function (sourceId, dataField, targetId) { createCopyFun: function (sourceId, dataField, targetId) {
return _copyFun.bind({sourceId: sourceId, dataField: dataField, targetId: $(targetId) || targetId}) return _copyFun.bind({ sourceId: sourceId, dataField: dataField, targetId: $(targetId) || targetId })
}, },
// attach copy function to event listeners. prepop is optional and by default true. // attach copy function to event listeners. prepop is optional and by default true.
@ -585,7 +586,7 @@ window.AwesompleteUtil = (function () {
// Create function for combobox button (btnId) to toggle dropdown list. // Create function for combobox button (btnId) to toggle dropdown list.
createClickFun: function (btnId, awe) { createClickFun: function (btnId, awe) {
return _clickFun.bind({btnId: btnId, awe: awe}) return _clickFun.bind({ btnId: btnId, awe: awe })
}, },
// Attach click function for combobox to click event. // Attach click function for combobox to click event.

@ -17,7 +17,7 @@ $(function () {
const siblings = $(this).siblings() const siblings = $(this).siblings()
if (siblings.is(':hidden')) { if (siblings.is(':hidden')) {
siblings.css({ 'display': 'flex' }) siblings.css({ display: 'flex' })
} else { } else {
siblings.hide() siblings.hide()
} }

@ -3,7 +3,7 @@ import $ from 'jquery'
const clipboard = new ClipboardJS('[data-clipboard-text]') const clipboard = new ClipboardJS('[data-clipboard-text]')
clipboard.on('success', ({trigger}) => { clipboard.on('success', ({ trigger }) => {
const copyButton = $(trigger) const copyButton = $(trigger)
copyButton.tooltip('dispose') copyButton.tooltip('dispose')

@ -8,7 +8,7 @@ export function createCoinBalanceHistoryChart (el) {
const $chartError = $('[data-chart-error-message]') const $chartError = $('[data-chart-error-message]')
const dataPath = el.dataset.coin_balance_history_data_path const dataPath = el.dataset.coin_balance_history_data_path
$.getJSON(dataPath, {type: 'JSON'}) $.getJSON(dataPath, { type: 'JSON' })
.done(data => { .done(data => {
$chartContainer.show() $chartContainer.show()
@ -53,7 +53,7 @@ export function createCoinBalanceHistoryChart (el) {
}, },
scaleLabel: { scaleLabel: {
display: true, display: true,
labelString: window.localized['Ether'] labelString: window.localized.Ether
} }
}] }]
} }

@ -45,6 +45,7 @@ export function formatAllUsdValues (root) {
formatAllUsdValues() formatAllUsdValues()
function tryUpdateCalculatedUsdValues (el, usdExchangeRate = el.dataset.usdExchangeRate) { function tryUpdateCalculatedUsdValues (el, usdExchangeRate = el.dataset.usdExchangeRate) {
// eslint-disable-next-line no-prototype-builtins
if (!el.dataset.hasOwnProperty('weiValue')) return if (!el.dataset.hasOwnProperty('weiValue')) return
const ether = weiToEther(el.dataset.weiValue) const ether = weiToEther(el.dataset.weiValue)
const usd = etherToUSD(ether, usdExchangeRate) const usd = etherToUSD(ether, usdExchangeRate)
@ -63,6 +64,6 @@ export function updateAllCalculatedUsdValues (usdExchangeRate) {
} }
updateAllCalculatedUsdValues() updateAllCalculatedUsdValues()
export const exchangeRateChannel = socket.channel(`exchange_rate:new_rate`) export const exchangeRateChannel = socket.channel('exchange_rate:new_rate')
exchangeRateChannel.join() exchangeRateChannel.join()
exchangeRateChannel.on('new_rate', (msg) => updateAllCalculatedUsdValues(humps.camelizeKeys(msg).exchangeRate.usdValue)) exchangeRateChannel.on('new_rate', (msg) => updateAllCalculatedUsdValues(humps.camelizeKeys(msg).exchangeRate.usdValue))

@ -20,6 +20,6 @@ export function updateIndexStatus (msg = {}) {
} }
updateIndexStatus() updateIndexStatus()
const indexingChannel = socket.channel(`blocks:indexing`) const indexingChannel = socket.channel('blocks:indexing')
indexingChannel.join() indexingChannel.join()
indexingChannel.on('index_status', (msg) => updateIndexStatus(humps.camelizeKeys(msg))) indexingChannel.on('index_status', (msg) => updateIndexStatus(humps.camelizeKeys(msg)))

@ -61,7 +61,7 @@ const config = {
mode: 'index', mode: 'index',
intersect: false, intersect: false,
callbacks: { callbacks: {
label: ({datasetIndex, yLabel}, {datasets}) => { label: ({ datasetIndex, yLabel }, { datasets }) => {
const label = datasets[datasetIndex].label const label = datasets[datasetIndex].label
if (datasets[datasetIndex].yAxisID === 'price') { if (datasets[datasetIndex].yAxisID === 'price') {
return `${label}: ${formatUsdValue(yLabel)}` return `${label}: ${formatUsdValue(yLabel)}`
@ -77,14 +77,14 @@ const config = {
} }
function getPriceData (marketHistoryData) { function getPriceData (marketHistoryData) {
return marketHistoryData.map(({ date, closingPrice }) => ({x: date, y: closingPrice})) return marketHistoryData.map(({ date, closingPrice }) => ({ x: date, y: closingPrice }))
} }
function getMarketCapData (marketHistoryData, availableSupply) { function getMarketCapData (marketHistoryData, availableSupply) {
if (availableSupply !== null && typeof availableSupply === 'object') { if (availableSupply !== null && typeof availableSupply === 'object') {
return marketHistoryData.map(({ date, closingPrice }) => ({x: date, y: closingPrice * availableSupply[date]})) return marketHistoryData.map(({ date, closingPrice }) => ({ x: date, y: closingPrice * availableSupply[date] }))
} else { } else {
return marketHistoryData.map(({ date, closingPrice }) => ({x: date, y: closingPrice * availableSupply})) return marketHistoryData.map(({ date, closingPrice }) => ({ x: date, y: closingPrice * availableSupply }))
} }
} }
@ -102,7 +102,7 @@ if (localStorage.getItem('current-color-mode') === 'dark') {
class MarketHistoryChart { class MarketHistoryChart {
constructor (el, availableSupply, marketHistoryData) { constructor (el, availableSupply, marketHistoryData) {
this.price = { this.price = {
label: window.localized['Price'], label: window.localized.Price,
yAxisID: 'price', yAxisID: 'price',
data: getPriceData(marketHistoryData), data: getPriceData(marketHistoryData),
fill: false, fill: false,
@ -125,6 +125,7 @@ class MarketHistoryChart {
config.data.datasets = [this.price, this.marketCap] config.data.datasets = [this.price, this.marketCap]
this.chart = new Chart(el, config) this.chart = new Chart(el, config)
} }
update (availableSupply, marketHistoryData) { update (availableSupply, marketHistoryData) {
this.price.data = getPriceData(marketHistoryData) this.price.data = getPriceData(marketHistoryData)
if (this.availableSupply !== null && typeof this.availableSupply === 'object') { if (this.availableSupply !== null && typeof this.availableSupply === 'object') {
@ -147,7 +148,7 @@ export function createMarketHistoryChart (el) {
const $chartError = $('[data-chart-error-message]') const $chartError = $('[data-chart-error-message]')
const chart = new MarketHistoryChart(el, 0, []) const chart = new MarketHistoryChart(el, 0, [])
$.getJSON(dataPath, {type: 'JSON'}) $.getJSON(dataPath, { type: 'JSON' })
.done(data => { .done(data => {
const availableSupply = JSON.parse(data.supply_data) const availableSupply = JSON.parse(data.supply_data)
const marketHistoryData = humps.camelizeKeys(JSON.parse(data.history_data)) const marketHistoryData = humps.camelizeKeys(JSON.parse(data.history_data))

@ -52,7 +52,7 @@ $(function () {
const progressBackground = total - progress const progressBackground = total - progress
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
let myChart = new Chart(stakeProgress, { const myChart = new Chart(stakeProgress, {
type: 'doughnut', type: 'doughnut',
data: { data: {
datasets: [{ datasets: [{

@ -36,7 +36,7 @@ $(function () {
window.location = $(this).attr('network-selector-item-url') window.location = $(this).attr('network-selector-item-url')
}) })
let setNetworkTab = (currentTab) => { const setNetworkTab = (currentTab) => {
if (currentTab.hasClass('active')) return if (currentTab.hasClass('active')) return
networkSelectorTab.removeClass('active') networkSelectorTab.removeClass('active')
@ -45,31 +45,31 @@ $(function () {
$(`[network-selector-tab="${currentTab.attr('network-selector-tab-filter')}"]`).addClass('active') $(`[network-selector-tab="${currentTab.attr('network-selector-tab-filter')}"]`).addClass('active')
} }
let openNetworkSelector = () => { const openNetworkSelector = () => {
mainBody.addClass('network-selector-visible') mainBody.addClass('network-selector-visible')
networkSelectorOverlay.fadeIn(FADE_IN_DELAY) networkSelectorOverlay.fadeIn(FADE_IN_DELAY)
setNetworkSelectorVisiblePosition() setNetworkSelectorVisiblePosition()
} }
let closeNetworkSelector = () => { const closeNetworkSelector = () => {
mainBody.removeClass('network-selector-visible') mainBody.removeClass('network-selector-visible')
networkSelectorOverlay.fadeOut(FADE_IN_DELAY) networkSelectorOverlay.fadeOut(FADE_IN_DELAY)
setNetworkSelectorHiddenPosition() setNetworkSelectorHiddenPosition()
} }
let getNetworkSelectorWidth = () => { const getNetworkSelectorWidth = () => {
return parseInt(networkSelector.css('width')) || parseInt(networkSelector.css('max-width')) return parseInt(networkSelector.css('width')) || parseInt(networkSelector.css('max-width'))
} }
let setNetworkSelectorHiddenPosition = () => { const setNetworkSelectorHiddenPosition = () => {
return networkSelector.css({ 'right': `-${getNetworkSelectorWidth()}px` }) return networkSelector.css({ right: `-${getNetworkSelectorWidth()}px` })
} }
let setNetworkSelectorVisiblePosition = () => { const setNetworkSelectorVisiblePosition = () => {
return networkSelector.css({ 'right': '0' }) return networkSelector.css({ right: '0' })
} }
let init = () => { const init = () => {
setNetworkSelectorHiddenPosition() setNetworkSelectorHiddenPosition()
} }

@ -1,8 +1,8 @@
import $ from 'jquery' import $ from 'jquery'
function prettyPrint (element) { function prettyPrint (element) {
let jsonString = element.dataset.json const jsonString = element.dataset.json
let pretty = JSON.stringify(JSON.parse(jsonString), undefined, 2) const pretty = JSON.stringify(JSON.parse(jsonString), undefined, 2)
element.innerHTML = pretty element.innerHTML = pretty
} }

@ -18,7 +18,8 @@ export const initialState = {
balanceCard: null, balanceCard: null,
fetchedCoinBalanceBlockNumber: null, fetchedCoinBalanceBlockNumber: null,
transactionCount: null, transactionCount: null,
validationCount: null validationCount: null,
countersFetched: false
} }
export function reducer (state = initialState, action) { export function reducer (state = initialState, action) {
@ -34,6 +35,13 @@ export function reducer (state = initialState, action) {
channelDisconnected: true channelDisconnected: true
}) })
} }
case 'COUNTERS_FETCHED': {
return Object.assign({}, state, {
transactionCount: action.transactionCount,
validationCount: action.validationCount,
countersFetched: true
})
}
case 'RECEIVED_NEW_BLOCK': { case 'RECEIVED_NEW_BLOCK': {
if (state.channelDisconnected) return state if (state.channelDisconnected) return state
@ -81,13 +89,20 @@ const elements = {
return { transactionCount: numeral($el.text()).value() } return { transactionCount: numeral($el.text()).value() }
}, },
render ($el, state, oldState) { render ($el, state, oldState) {
if (oldState.transactionCount === state.transactionCount) return if (state.countersFetched && state.transactionCount) {
$el.empty().append(numeral(state.transactionCount).format()) if (oldState.transactionCount === state.transactionCount) return
$el.empty().append('>= ' + numeral(state.transactionCount).format() + ' Transactions')
$el.show()
$el.parent('.address-detail-item').removeAttr('style')
} else {
$el.hide()
$el.parent('.address-detail-item').css('display', 'none')
}
} }
}, },
'[data-selector="fetched-coin-balance-block-number"]': { '[data-selector="fetched-coin-balance-block-number"]': {
load ($el) { load ($el) {
return {fetchedCoinBalanceBlockNumber: numeral($el.text()).value()} return { fetchedCoinBalanceBlockNumber: numeral($el.text()).value() }
}, },
render ($el, state, oldState) { render ($el, state, oldState) {
if (oldState.fetchedCoinBalanceBlockNumber === state.fetchedCoinBalanceBlockNumber) return if (oldState.fetchedCoinBalanceBlockNumber === state.fetchedCoinBalanceBlockNumber) return
@ -99,12 +114,29 @@ const elements = {
return { validationCount: numeral($el.text()).value() } return { validationCount: numeral($el.text()).value() }
}, },
render ($el, state, oldState) { render ($el, state, oldState) {
if (oldState.validationCount === state.validationCount) return if (state.countersFetched && state.validationCount) {
$el.empty().append(numeral(state.validationCount).format()) if (oldState.validationCount === state.validationCount) return
$el.empty().append(numeral(state.validationCount).format() + ' Blocks Validated')
$el.show()
} else {
$el.hide()
}
} }
} }
} }
function loadCounters (store) {
const $element = $('[data-async-counters]')
const path = $element.data().asyncCounters
function fetchCounters () {
$.getJSON(path)
.done(response => store.dispatch(Object.assign({ type: 'COUNTERS_FETCHED' }, humps.camelizeKeys(response))))
}
fetchCounters()
}
const $addressDetailsPage = $('[data-page="address-details"]') const $addressDetailsPage = $('[data-page="address-details"]')
if ($addressDetailsPage.length) { if ($addressDetailsPage.length) {
const store = createStore(reducer) const store = createStore(reducer)
@ -149,4 +181,6 @@ if ($addressDetailsPage.length) {
type: 'RECEIVED_UPDATED_BALANCE', type: 'RECEIVED_UPDATED_BALANCE',
msg: humps.camelizeKeys(msg) msg: humps.camelizeKeys(msg)
})) }))
loadCounters(store)
} }

@ -47,7 +47,7 @@ if ($('[data-page="coin-balance-history"]').length) {
const store = createAsyncLoadStore(reducer, initialState, 'dataset.blockNumber') const store = createAsyncLoadStore(reducer, initialState, 'dataset.blockNumber')
const addressHash = $('[data-page="address-details"]')[0].dataset.pageAddressHash const addressHash = $('[data-page="address-details"]')[0].dataset.pageAddressHash
store.dispatch({type: 'PAGE_LOAD', addressHash}) store.dispatch({ type: 'PAGE_LOAD', addressHash })
connectElements({ store, elements }) connectElements({ store, elements })
const addressChannel = socket.channel(`addresses:${addressHash}`, {}) const addressChannel = socket.channel(`addresses:${addressHash}`, {})

@ -34,7 +34,7 @@ export function reducer (state, action) {
if (state.channelDisconnected || state.beyondPageOne) return state if (state.channelDisconnected || state.beyondPageOne) return state
const incomingInternalTransactions = action.msgs const incomingInternalTransactions = action.msgs
.filter(({toAddressHash, fromAddressHash}) => ( .filter(({ toAddressHash, fromAddressHash }) => (
!state.filter || !state.filter ||
(state.filter === 'to' && toAddressHash === state.addressHash) || (state.filter === 'to' && toAddressHash === state.addressHash) ||
(state.filter === 'from' && fromAddressHash === state.addressHash) (state.filter === 'from' && fromAddressHash === state.addressHash)
@ -81,7 +81,7 @@ if ($('[data-page="address-internal-transactions"]').length) {
const store = createAsyncLoadStore(reducer, initialState, 'dataset.key') const store = createAsyncLoadStore(reducer, initialState, 'dataset.key')
const addressHash = $('[data-page="address-details"]')[0].dataset.pageAddressHash const addressHash = $('[data-page="address-details"]')[0].dataset.pageAddressHash
store.dispatch({type: 'PAGE_LOAD', addressHash}) store.dispatch({ type: 'PAGE_LOAD', addressHash })
connectElements({ store, elements }) connectElements({ store, elements })
const addressChannel = socket.channel(`addresses:${addressHash}`, {}) const addressChannel = socket.channel(`addresses:${addressHash}`, {})

@ -16,7 +16,7 @@ export function reducer (state, action) {
return Object.assign({}, state, omit(action, 'type')) return Object.assign({}, state, omit(action, 'type'))
} }
case 'START_SEARCH': { case 'START_SEARCH': {
return Object.assign({}, state, {pagesStack: [], isSearch: true}) return Object.assign({}, state, { pagesStack: [], isSearch: true })
} }
default: default:
return state return state
@ -63,19 +63,21 @@ if ($('[data-page="address-logs"]').length) {
store.dispatch({ store.dispatch({
type: 'PAGE_LOAD', type: 'PAGE_LOAD',
addressHash: addressHash}) addressHash: addressHash
})
$element.on('click', '[data-search-button]', (event) => { $element.on('click', '[data-search-button]', (event) => {
store.dispatch({ store.dispatch({
type: 'START_SEARCH', type: 'START_SEARCH',
addressHash: addressHash}) addressHash: addressHash
})
var topic = $('[data-search-field]').val() var topic = $('[data-search-field]').val()
var path = '/search_logs?topic=' + topic + '&address_id=' + store.getState().addressHash var path = '/search_logs?topic=' + topic + '&address_id=' + store.getState().addressHash
store.dispatch({type: 'START_REQUEST'}) store.dispatch({ type: 'START_REQUEST' })
$.getJSON(path, {type: 'JSON'}) $.getJSON(path, { type: 'JSON' })
.done(response => store.dispatch(Object.assign({type: 'ITEMS_FETCHED'}, humps.camelizeKeys(response)))) .done(response => store.dispatch(Object.assign({ type: 'ITEMS_FETCHED' }, humps.camelizeKeys(response))))
.fail(() => store.dispatch({type: 'REQUEST_ERROR'})) .fail(() => store.dispatch({ type: 'REQUEST_ERROR' }))
.always(() => store.dispatch({type: 'FINISH_REQUEST'})) .always(() => store.dispatch({ type: 'FINISH_REQUEST' }))
}) })
$element.on('click', '[data-cancel-search-button]', (event) => { $element.on('click', '[data-cancel-search-button]', (event) => {

@ -32,12 +32,12 @@ export function reducer (state, action) {
return state return state
} }
return Object.assign({}, state, { items: [ action.msg.transactionHtml, ...state.items ] }) return Object.assign({}, state, { items: [action.msg.transactionHtml, ...state.items] })
} }
case 'RECEIVED_NEW_REWARD': { case 'RECEIVED_NEW_REWARD': {
if (state.channelDisconnected) return state if (state.channelDisconnected) return state
return Object.assign({}, state, { items: [ action.msg.rewardHtml, ...state.items ] }) return Object.assign({}, state, { items: [action.msg.rewardHtml, ...state.items] })
} }
default: default:
return state return state

@ -91,7 +91,7 @@ if ($blockListPage.length || $uncleListPage.length || $reorgListPage.length) {
) )
connectElements({ store, elements }) connectElements({ store, elements })
const blocksChannel = socket.channel(`blocks:new_block`, {}) const blocksChannel = socket.channel('blocks:new_block', {})
blocksChannel.join() blocksChannel.join()
blocksChannel.onError(() => store.dispatch({ blocksChannel.onError(() => store.dispatch({
type: 'CHANNEL_DISCONNECTED' type: 'CHANNEL_DISCONNECTED'

@ -68,10 +68,10 @@ function baseReducer (state = initialState, action) {
return Object.assign({}, state, { blocksLoading: false }) return Object.assign({}, state, { blocksLoading: false })
} }
case 'BLOCKS_FETCHED': { case 'BLOCKS_FETCHED': {
return Object.assign({}, state, { blocks: [...action.msg.blocks] }) return Object.assign({}, state, { blocks: [...action.msg.blocks], blocksLoading: false })
} }
case 'BLOCKS_REQUEST_ERROR': { case 'BLOCKS_REQUEST_ERROR': {
return Object.assign({}, state, { blocksError: true }) return Object.assign({}, state, { blocksError: true, blocksLoading: false })
} }
case 'RECEIVED_NEW_EXCHANGE_RATE': { case 'RECEIVED_NEW_EXCHANGE_RATE': {
return Object.assign({}, state, { return Object.assign({}, state, {
@ -264,21 +264,21 @@ if ($chainDetailsPage.length) {
msg: humps.camelizeKeys(msg) msg: humps.camelizeKeys(msg)
})) }))
const addressesChannel = socket.channel(`addresses:new_address`) const addressesChannel = socket.channel('addresses:new_address')
addressesChannel.join() addressesChannel.join()
addressesChannel.on('count', msg => store.dispatch({ addressesChannel.on('count', msg => store.dispatch({
type: 'RECEIVED_NEW_ADDRESS_COUNT', type: 'RECEIVED_NEW_ADDRESS_COUNT',
msg: humps.camelizeKeys(msg) msg: humps.camelizeKeys(msg)
})) }))
const blocksChannel = socket.channel(`blocks:new_block`) const blocksChannel = socket.channel('blocks:new_block')
blocksChannel.join() blocksChannel.join()
blocksChannel.on('new_block', msg => store.dispatch({ blocksChannel.on('new_block', msg => store.dispatch({
type: 'RECEIVED_NEW_BLOCK', type: 'RECEIVED_NEW_BLOCK',
msg: humps.camelizeKeys(msg) msg: humps.camelizeKeys(msg)
})) }))
const transactionsChannel = socket.channel(`transactions:new_transaction`) const transactionsChannel = socket.channel('transactions:new_transaction')
transactionsChannel.join() transactionsChannel.join()
transactionsChannel.on('transaction', batchChannel((msgs) => store.dispatch({ transactionsChannel.on('transaction', batchChannel((msgs) => store.dispatch({
type: 'RECEIVED_NEW_TRANSACTION_BATCH', type: 'RECEIVED_NEW_TRANSACTION_BATCH',
@ -288,11 +288,11 @@ if ($chainDetailsPage.length) {
function loadTransactions (store) { function loadTransactions (store) {
const path = store.getState().transactionsPath const path = store.getState().transactionsPath
store.dispatch({type: 'START_TRANSACTIONS_FETCH'}) store.dispatch({ type: 'START_TRANSACTIONS_FETCH' })
$.getJSON(path) $.getJSON(path)
.done(response => store.dispatch({type: 'TRANSACTIONS_FETCHED', msg: humps.camelizeKeys(response)})) .done(response => store.dispatch({ type: 'TRANSACTIONS_FETCHED', msg: humps.camelizeKeys(response) }))
.fail(() => store.dispatch({type: 'TRANSACTIONS_FETCH_ERROR'})) .fail(() => store.dispatch({ type: 'TRANSACTIONS_FETCH_ERROR' }))
.always(() => store.dispatch({type: 'FINISH_TRANSACTIONS_FETCH'})) .always(() => store.dispatch({ type: 'FINISH_TRANSACTIONS_FETCH' }))
} }
function bindTransactionErrorMessage (store) { function bindTransactionErrorMessage (store) {
@ -325,14 +325,14 @@ export function placeHolderBlock (blockNumber) {
function loadBlocks (store) { function loadBlocks (store) {
const url = store.getState().blocksPath const url = store.getState().blocksPath
store.dispatch({type: 'START_BLOCKS_FETCH'}) store.dispatch({ type: 'START_BLOCKS_FETCH' })
$.getJSON(url) $.getJSON(url)
.done(response => { .done(response => {
store.dispatch({type: 'BLOCKS_FETCHED', msg: humps.camelizeKeys(response)}) store.dispatch({ type: 'BLOCKS_FETCHED', msg: humps.camelizeKeys(response) })
}) })
.fail(() => store.dispatch({type: 'BLOCKS_REQUEST_ERROR'})) .fail(() => store.dispatch({ type: 'BLOCKS_REQUEST_ERROR' }))
.always(() => store.dispatch({type: 'BLOCKS_FINISH_REQUEST'})) .always(() => store.dispatch({ type: 'BLOCKS_FINISH_REQUEST' }))
} }
function bindBlockErrorMessage (store) { function bindBlockErrorMessage (store) {

@ -9,12 +9,3 @@ $('.dark-mode-changer').click(function () {
// reload each theme switch // reload each theme switch
document.location.reload(true) document.location.reload(true)
}) })
$('.new-button').click(function () {
if (localStorage.getItem('current-color-mode') === 'dark') {
localStorage.setItem('current-color-mode', 'light')
} else {
localStorage.setItem('current-color-mode', 'dark')
}
// reload each theme switch
document.location.reload(true)
})

@ -7,40 +7,3 @@ $(document).click(function (event) {
$('.navbar-toggler').click() $('.navbar-toggler').click()
} }
}) })
$(document).ready(function () {
if (matchMedia) {
var mq = window.matchMedia('(max-width: 900px)')
mq.addListener(WidthChange)
WidthChange(mq)
}
function WidthChange (mq) {
if (mq.matches) {
$('#checkIfSmall').removeClass('dropdown-menu')
$('.dropdown-item').removeClass('active')
$('#checkIfSmall1').removeClass('dropdown-menu')
$('#checkIfSmall2').removeClass('dropdown-menu')
} else {
$('#checkIfSmall').addClass('dropdown-menu')
$('#checkIfSmall1').addClass('dropdown-menu')
$('#checkIfSmall2').addClass('dropdown-menu')
}
}
})
var div1 = document.getElementById('toggleImage1')
var div2 = document.getElementById('toggleImage2')
function switchVisible () {
if (!div1) return
if (getComputedStyle(div1).display === 'inline-block') {
div1.style.display = 'none'
div2.style.display = 'block'
} else {
div1.style.display = 'inline-block'
div2.style.display = 'none'
}
}
document
.getElementById('toggleButton')
.addEventListener('click', switchVisible)

@ -102,7 +102,7 @@ if ($transactionPendingListPage.length) {
const store = createAsyncLoadStore(reducer, initialState, 'dataset.identifierHash') const store = createAsyncLoadStore(reducer, initialState, 'dataset.identifierHash')
connectElements({ store, elements }) connectElements({ store, elements })
const transactionsChannel = socket.channel(`transactions:new_transaction`) const transactionsChannel = socket.channel('transactions:new_transaction')
transactionsChannel.join() transactionsChannel.join()
transactionsChannel.onError(() => store.dispatch({ transactionsChannel.onError(() => store.dispatch({
type: 'CHANNEL_DISCONNECTED' type: 'CHANNEL_DISCONNECTED'
@ -118,7 +118,7 @@ if ($transactionPendingListPage.length) {
}), 1000) }), 1000)
}) })
const pendingTransactionsChannel = socket.channel(`transactions:new_pending_transaction`) const pendingTransactionsChannel = socket.channel('transactions:new_pending_transaction')
pendingTransactionsChannel.join() pendingTransactionsChannel.join()
pendingTransactionsChannel.onError(() => store.dispatch({ pendingTransactionsChannel.onError(() => store.dispatch({
type: 'CHANNEL_DISCONNECTED' type: 'CHANNEL_DISCONNECTED'

@ -0,0 +1,87 @@
import $ from 'jquery'
import omit from 'lodash/omit'
import humps from 'humps'
import { createStore, connectElements } from '../lib/redux_helpers.js'
export const initialState = {
channelDisconnected: false,
transferCount: null,
tokenHolderCount: null
}
export function reducer (state = initialState, action) {
switch (action.type) {
case 'PAGE_LOAD':
case 'ELEMENTS_LOAD': {
return Object.assign({}, state, omit(action, 'type'))
}
case 'CHANNEL_DISCONNECTED': {
if (state.beyondPageOne) return state
return Object.assign({}, state, {
channelDisconnected: true
})
}
case 'COUNTERS_FETCHED': {
return Object.assign({}, state, {
transferCount: action.transferCount,
tokenHolderCount: action.tokenHolderCount
})
}
default:
return state
}
}
const elements = {
'[data-page="counters"]': {
render ($el, state) {
if (state.counters) {
return $el
}
return $el
}
},
'[token-transfer-count]': {
render ($el, state) {
if (state.transferCount) {
$el.text(state.transferCount + ' Transfers')
return $el.show()
} else {
return $el.hide()
}
}
},
'[token-holder-count]': {
render ($el, state) {
if (state.tokenHolderCount) {
$el.text(state.tokenHolderCount + ' Addresses')
return $el.show()
} else {
return $el.hide()
}
}
}
}
function loadCounters (store) {
const $element = $('[data-async-counters]')
const path = $element.data() && $element.data().asyncCounters
function fetchCounters () {
store.dispatch({ type: 'START_REQUEST' })
$.getJSON(path)
.done(response => store.dispatch(Object.assign({ type: 'COUNTERS_FETCHED' }, humps.camelizeKeys(response))))
.fail(() => store.dispatch({ type: 'REQUEST_ERROR' }))
.always(() => store.dispatch({ type: 'FINISH_REQUEST' }))
}
fetchCounters()
}
const $tokenPage = $('[token-page]')
if ($tokenPage.length) {
const store = createStore(reducer)
connectElements({ store, elements })
loadCounters(store)
}

@ -47,7 +47,7 @@ if ($transactionDetailsPage.length) {
const store = createStore(reducer) const store = createStore(reducer)
connectElements({ store, elements }) connectElements({ store, elements })
const blocksChannel = socket.channel(`blocks:new_block`, {}) const blocksChannel = socket.channel('blocks:new_block', {})
blocksChannel.join() blocksChannel.join()
blocksChannel.on('new_block', (msg) => store.dispatch({ blocksChannel.on('new_block', (msg) => store.dispatch({
type: 'RECEIVED_NEW_BLOCK', type: 'RECEIVED_NEW_BLOCK',

@ -85,7 +85,7 @@ if ($transactionListPage.length) {
connectElements({ store, elements }) connectElements({ store, elements })
const transactionsChannel = socket.channel(`transactions:new_transaction`) const transactionsChannel = socket.channel('transactions:new_transaction')
transactionsChannel.join() transactionsChannel.join()
transactionsChannel.onError(() => store.dispatch({ transactionsChannel.onError(() => store.dispatch({
type: 'CHANNEL_DISCONNECTED' type: 'CHANNEL_DISCONNECTED'

@ -67,7 +67,7 @@ const elements = {
}) })
$('.js-btn-add-contract-library').on('click', function () { $('.js-btn-add-contract-library').on('click', function () {
let nextContractLibrary = $('.js-contract-library-form-group.active').next('.js-contract-library-form-group') const nextContractLibrary = $('.js-contract-library-form-group.active').next('.js-contract-library-form-group')
if (nextContractLibrary) { if (nextContractLibrary) {
nextContractLibrary.addClass('active') nextContractLibrary.addClass('active')
@ -121,6 +121,14 @@ if ($contractVerificationPage.length) {
$(this).hide() $(this).hide()
}) })
$('.autodetectfalse').on('click', function () {
if ($(this).prop('checked')) { $('.constructor-arguments').show() }
})
$('.autodetecttrue').on('click', function () {
if ($(this).prop('checked')) { $('.constructor-arguments').hide() }
})
$('.js-smart-contract-form-reset').on('click', function () { $('.js-smart-contract-form-reset').on('click', function () {
$('.js-contract-library-form-group').removeClass('active') $('.js-contract-library-form-group').removeClass('active')
$('.js-contract-library-form-group').first().addClass('active') $('.js-contract-library-form-group').first().addClass('active')
@ -130,7 +138,7 @@ if ($contractVerificationPage.length) {
}) })
$('.js-btn-add-contract-library').on('click', function () { $('.js-btn-add-contract-library').on('click', function () {
let nextContractLibrary = $('.js-contract-library-form-group.active').next('.js-contract-library-form-group') const nextContractLibrary = $('.js-contract-library-form-group.active').next('.js-contract-library-form-group')
if (nextContractLibrary) { if (nextContractLibrary) {
nextContractLibrary.addClass('active') nextContractLibrary.addClass('active')

@ -1,7 +1,7 @@
import {Socket} from 'phoenix' import { Socket } from 'phoenix'
import {locale} from './locale' import { locale } from './locale'
const socket = new Socket('/socket', {params: {locale: locale}}) const socket = new Socket('/socket', { params: { locale: locale } })
socket.connect() socket.connect()
export default socket export default socket

File diff suppressed because it is too large Load Diff

@ -21,52 +21,51 @@
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^5.1.0-4", "@fortawesome/fontawesome-free": "^5.1.0-4",
"awesomplete": "1.1.2", "awesomplete": "1.1.2",
"bignumber.js": "^7.2.1", "bignumber.js": "^9.0.0",
"bootstrap": "^4.1.3", "bootstrap": "^4.3.1",
"chart.js": "^2.7.2", "chart.js": "^2.9.2",
"clipboard": "^2.0.1", "clipboard": "^2.0.4",
"fg-loadcss": "^2.1.0", "highlight.js": "^9.16.2",
"highlight.js": "^9.13.1", "highlightjs-solidity": "^1.0.8",
"highlightjs-solidity": "^1.0.6",
"humps": "^2.0.1", "humps": "^2.0.1",
"jquery": "^3.4.0", "jquery": "^3.4.0",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"moment": "^2.22.1", "moment": "^2.24.0",
"nanomorph": "^5.1.3", "nanomorph": "^5.4.0",
"numeral": "^2.0.6", "numeral": "^2.0.6",
"path-parser": "^4.1.1", "path-parser": "^4.2.0",
"phoenix": "file:../../../deps/phoenix", "phoenix": "file:../../../deps/phoenix",
"phoenix_html": "file:../../../deps/phoenix_html", "phoenix_html": "file:../../../deps/phoenix_html",
"popper.js": "^1.14.3", "popper.js": "^1.14.7",
"reduce-reducers": "^0.4.3", "reduce-reducers": "^0.4.3",
"redux": "^4.0.0", "redux": "^4.0.0",
"urijs": "^1.19.1" "urijs": "^1.19.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/polyfill": "^7.0.0-beta.46", "@babel/core": "^7.7.2",
"@babel/polyfill": "^7.7.0",
"@babel/preset-env": "^7.7.1",
"autoprefixer": "^8.4.1", "autoprefixer": "^8.4.1",
"babel-core": "^6.26.3", "babel-loader": "^8.0.6",
"babel-loader": "^7.1.4", "copy-webpack-plugin": "^5.0.5",
"babel-preset-env": "^1.6.1",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^3.1.0", "css-loader": "^3.1.0",
"eslint": "^4.15.0", "eslint": "^6.6.0",
"eslint-config-standard": "^11.0.0-beta.0", "eslint-config-standard": "^14.1.0",
"eslint-plugin-import": "^2.8.0", "eslint-plugin-import": "^2.18.2",
"eslint-plugin-node": "^5.2.1", "eslint-plugin-node": "^10.0.0",
"eslint-plugin-promise": "^3.6.0", "eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^3.0.1", "eslint-plugin-standard": "^4.0.1",
"file-loader": "^1.1.11", "file-loader": "^4.2.0",
"jest": "^23.2.0", "jest": "^24.9.0",
"mini-css-extract-plugin": "^0.8.0", "mini-css-extract-plugin": "^0.8.0",
"node-sass": "^4.9.3", "node-sass": "^4.12.0",
"optimize-css-assets-webpack-plugin": "^5.0.3", "optimize-css-assets-webpack-plugin": "^5.0.3",
"postcss-loader": "^2.1.4", "postcss-loader": "^3.0.0",
"sass-loader": "^7.1.0", "sass-loader": "^8.0.0",
"style-loader": "^0.21.0", "style-loader": "^1.0.0",
"terser-webpack-plugin": "^1.3.0", "terser-webpack-plugin": "^2.2.1",
"webpack": "^4.6.0", "webpack": "^4.41.2",
"webpack-cli": "^3.0.8" "webpack-cli": "^3.3.10"
}, },
"jest": { "jest": {
"moduleNameMapper": { "moduleNameMapper": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

@ -1,20 +1 @@
<?xml version="1.0" encoding="utf-8"?> <svg enable-background="new 0 0 68 68" viewBox="0 0 68 68" xmlns="http://www.w3.org/2000/svg"><g fill="#bac4cb" stroke="#bac4cb" stroke-miterlimit="10"><path d="m33.9 66c-17.8 0-32.1-14.4-32.1-32.1s14.3-32.1 32.1-32.1 32.1 14.3 32.1 32.1-14.4 32.1-32.1 32.1zm0-62.4c-16.7 0-30.3 13.6-30.3 30.3s13.5 30.2 30.2 30.2 30.2-13.5 30.2-30.2-13.4-30.3-30.1-30.3z" stroke-width="3.3377"/><path d="m54.8 22.9-3.3 1.9c-.5.3-1 .1-1.3-.4-.3-.4-.1-1 .3-1.3l3.3-1.9c.5-.3 1-.1 1.3.4.3.4.2 1-.3 1.3zm-10.2-5.7c-.3.5-.8.6-1.3.4-.5-.3-.6-.8-.4-1.3l1.9-3.3c.3-.5.8-.6 1.3-.3.4.3.6.8.3 1.3zm-10.8 42.8c-6.2 0-11.3-5.1-11.3-11.3 0-5.8 4.3-10.5 9.9-11.2v-15.6c0-.8.6-1.4 1.4-1.4s1.4.6 1.4 1.4v15.6c5.6.7 9.9 5.4 9.9 11.2 0 6.2-5.1 11.3-11.3 11.3zm0-19.8c-4.8 0-8.7 3.9-8.7 8.7s3.9 8.7 8.7 8.7 8.7-3.9 8.7-8.7-3.9-8.7-8.7-8.7zm.1 6.4c-1.3 0-2.4 1-2.4 2.3s1 2.4 2.3 2.4h.1c1.3 0 2.3-1.1 2.3-2.4 0-1.2-1.1-2.2-2.3-2.3zm0-31.6c-.5 0-.9-.4-.9-.9v-3.8c0-.5.4-.9.9-.9s.9.4.9.9v3.7c0 .6-.4 1-.9 1zm-9.5 2.5c-.5.3-1 .1-1.3-.3l-1.9-3.3c-.3-.5-.1-1 .4-1.3.4-.3 1-.1 1.3.3l1.9 3.3c.2.5.1 1-.4 1.3zm-8.2 7.3-3.3-1.9c-.5-.3-.6-.8-.3-1.3.3-.4.8-.6 1.3-.3l3.3 1.9c.5.3.6.8.4 1.3-.3.4-.9.5-1.4.3z" stroke-width="1.6287"/></g></svg>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 68 68" style="enable-background:new 0 0 68 68;" xml:space="preserve">
<style type="text/css">
.st0{fill:#BAC4CB;stroke:#BAC4CB;stroke-width:3.3377;stroke-miterlimit:10;}
.st1{fill:#BAC4CB;stroke:#BAC4CB;stroke-width:1.6287;stroke-miterlimit:10;}
</style>
<path class="st0" d="M33.9,66C16.1,66,1.8,51.6,1.8,33.9S16.1,1.8,33.9,1.8S66,16.1,66,33.9S51.6,66,33.9,66z M33.9,3.6
C17.2,3.6,3.6,17.2,3.6,33.9s13.5,30.2,30.2,30.2s30.2-13.5,30.2-30.2S50.6,3.6,33.9,3.6z"/>
<path class="st1" d="M54.8,22.9l-3.3,1.9c-0.5,0.3-1,0.1-1.3-0.4c-0.3-0.4-0.1-1,0.3-1.3l3.3-1.9c0.5-0.3,1-0.1,1.3,0.4
C55.4,22,55.3,22.6,54.8,22.9z M44.6,17.2c-0.3,0.5-0.8,0.6-1.3,0.4c-0.5-0.3-0.6-0.8-0.4-1.3c0,0,0,0,0,0l1.9-3.3
c0.3-0.5,0.8-0.6,1.3-0.3c0.4,0.3,0.6,0.8,0.3,1.3L44.6,17.2z M33.8,60c-6.2,0-11.3-5.1-11.3-11.3c0-5.8,4.3-10.5,9.9-11.2V21.9
c0-0.8,0.6-1.4,1.4-1.4c0.8,0,1.4,0.6,1.4,1.4v15.6c5.6,0.7,9.9,5.4,9.9,11.2C45.1,54.9,40,60,33.8,60z M33.8,40.2
c-4.8,0-8.7,3.9-8.7,8.7s3.9,8.7,8.7,8.7s8.7-3.9,8.7-8.7S38.6,40.2,33.8,40.2z M33.9,46.6c-1.3,0-2.4,1-2.4,2.3
c0,1.3,1,2.4,2.3,2.4c0,0,0.1,0,0.1,0c1.3,0,2.3-1.1,2.3-2.4C36.2,47.7,35.1,46.7,33.9,46.6z M33.9,15c-0.5,0-0.9-0.4-0.9-0.9v-3.8
c0-0.5,0.4-0.9,0.9-0.9s0.9,0.4,0.9,0.9V14C34.8,14.6,34.4,15,33.9,15z M24.4,17.5c-0.5,0.3-1,0.1-1.3-0.3c0,0,0,0,0,0l-1.9-3.3
c-0.3-0.5-0.1-1,0.4-1.3c0.4-0.3,1-0.1,1.3,0.3l1.9,3.3C25,16.7,24.9,17.2,24.4,17.5z M16.2,24.8l-3.3-1.9c-0.5-0.3-0.6-0.8-0.3-1.3
c0.3-0.4,0.8-0.6,1.3-0.3l3.3,1.9c0.5,0.3,0.6,0.8,0.4,1.3C17.3,24.9,16.7,25,16.2,24.8C16.2,24.8,16.2,24.8,16.2,24.8z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -1,3 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="24"> <svg height="24" width="22" xmlns="http://www.w3.org/2000/svg"><path d="m21.998 17.936c0 .006-.004.011-.004.017.009.185-.013.374-.105.547a.892.892 0 0 1 -.816.485c-.019.002-.036.011-.055.011l-9.467 4.887a1.11 1.11 0 0 1 -.519.111.113.113 0 0 1 -.032.006c-.011 0-.021-.006-.032-.006-.052 0-.104-.009-.156-.014-.018-.004-.038-.001-.056-.005a.984.984 0 0 1 -.308-.092l-9.425-4.888c-.008 0-.015.005-.023.005-.03 0-.055-.013-.084-.015a.895.895 0 0 1 -.805-.485 1.038 1.038 0 0 1 -.105-.547c-.002-.01-.006-.019-.006-.03v-.046c.001-.031-.005-.061 0-.092v-11.597c-.005-.031.001-.061 0-.092v-.019l.002-.013c0-.043.004-.086.01-.128a.788.788 0 0 1 .114-.459.98.98 0 0 1 .407-.336.928.928 0 0 1 .18-.079c.038-.01.074-.017.112-.024.053-.01.103-.03.157-.034l9.466-4.887c.156-.081.323-.103.49-.105.022-.001.04-.012.062-.012s.04.011.062.012c.167.002.334.024.489.104l9.537 4.902c.179.021.343.09.483.199a.613.613 0 0 1 .058.042c.042.037.08.073.116.116.042.044.095.078.129.131.072.111.098.23.109.349a.826.826 0 0 1 .017.305v11.652c.005.031-.001.062 0 .093v.018zm-19.998-1.777 1.633-1.025c.44-.276 1.002-.112 1.256.366s.103 1.09-.337 1.366l-1.565.983 7.013 3.637v-8.645l-1.633 1.025c-.44.276-1.002.112-1.256-.366s-.103-1.09.337-1.366l1.573-.988-7.021-3.624zm10-13.667v1.508a1 1 0 0 1 -2 0v-1.497l-6.774 3.497 6.774 3.497v-1.497a1 1 0 0 1 2 0v1.508l6.825-3.508zm8 5.05-7.017 3.606 1.569.986c.44.276.591.888.337 1.366s-.816.642-1.256.366l-1.633-1.025v8.656l7.037-3.633-1.589-.998c-.44-.276-.591-.888-.337-1.366s.816-.642 1.256-.366l1.633 1.025z" fill="#bac4cb" fill-rule="evenodd"/></svg>
<path fill="#BAC4CB" fill-rule="evenodd" d="M21.998 17.936c0 .006-.004.011-.004.017.009.185-.013.374-.105.547a.892.892 0 0 1-.816.485c-.019.002-.036.011-.055.011l-9.467 4.887a1.11 1.11 0 0 1-.519.111A.113.113 0 0 1 11 24c-.011 0-.021-.006-.032-.006-.052 0-.104-.009-.156-.014-.018-.004-.038-.001-.056-.005a.984.984 0 0 1-.308-.092l-9.425-4.888c-.008 0-.015.005-.023.005-.03 0-.055-.013-.084-.015a.895.895 0 0 1-.805-.485 1.038 1.038 0 0 1-.105-.547c-.002-.01-.006-.019-.006-.03v-.046c.001-.031-.005-.061 0-.092V6.188c-.005-.031.001-.061 0-.092v-.019l.002-.013c0-.043.004-.086.01-.128a.788.788 0 0 1 .114-.459.98.98 0 0 1 .407-.336.928.928 0 0 1 .18-.079c.038-.01.074-.017.112-.024.053-.01.103-.03.157-.034L10.448.117c.156-.081.323-.103.49-.105C10.96.011 10.978 0 11 0s.04.011.062.012c.167.002.334.024.489.104l9.537 4.902c.179.021.343.09.483.199a.613.613 0 0 1 .058.042c.042.037.08.073.116.116.042.044.095.078.129.131.072.111.098.23.109.349A.826.826 0 0 1 22 6.16v11.652c.005.031-.001.062 0 .093v.018l-.002.013zM2 16.159l1.633-1.025c.44-.276 1.002-.112 1.256.366s.103 1.09-.337 1.366l-1.565.983L10 21.486v-8.645l-1.633 1.025c-.44.276-1.002.112-1.256-.366s-.103-1.09.337-1.366l1.573-.988L2 7.522v8.637zM12 2.492V4a1 1 0 0 1-2 0V2.503L3.226 6 10 9.497V8a1 1 0 0 1 2 0v1.508L18.825 6 12 2.492zm8 5.05l-7.017 3.606 1.569.986c.44.276.591.888.337 1.366-.254.478-.816.642-1.256.366L12 12.841v8.656l7.037-3.633-1.589-.998c-.44-.276-.591-.888-.337-1.366.254-.478.816-.642 1.256-.366L20 16.159V7.542z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

@ -1,23 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="174" height="60" viewBox="0 0 174 60"> <svg height="60" viewBox="0 0 174 60" width="174" xmlns="http://www.w3.org/2000/svg"><g fill="#fff"><path d="m.87 4v22.18a1.35 1.35 0 0 0 1.35 1.37h9.91a1.37 1.37 0 0 0 1.16-2l-1.29-2.36a2 2 0 0 0 -2.75-.75l-.14.08a2 2 0 0 1 -2.72-.74 2.06 2.06 0 0 1 -.16-1.65l2.06-6.28a2 2 0 0 1 2.31-1.36l6.4 1.31a2 2 0 0 1 1.33 1 2 2 0 0 1 -.73 2.77l-.14.08a2.07 2.07 0 0 0 -.74 2.8l1.28 2.2a1.34 1.34 0 0 0 2.32 0l5-8.66a1.37 1.37 0 0 0 -.49-1.86l-18.93-11.07a3.36 3.36 0 0 0 -5.03 2.94z"/><path d="m50.9 26.32-20.32-11.95a1.34 1.34 0 0 0 -1.85.5l-5.33 9.49a1.47 1.47 0 0 0 1.25 2.19h3.48a1.45 1.45 0 0 0 1.44-1.47v-1.08a1.34 1.34 0 0 1 1.33-1.4h.92a1.33 1.33 0 0 1 1 .46l4.84 5.56a1.38 1.38 0 0 1 0 1.81l-4.83 5.57a1.33 1.33 0 0 1 -1 .46h-.93a1.34 1.34 0 0 1 -1.33-1.35v-1.11a1.45 1.45 0 0 0 -1.44-1.47h-3.43a1.47 1.47 0 0 0 -1.25 2.19l5.29 9.43a1.33 1.33 0 0 0 1.83.49l20.33-11.97a3.7 3.7 0 0 0 0-6.35z"/><path d="m5.9 58.94 18.86-11.07a1.39 1.39 0 0 0 .5-1.88l-5-8.71a1.34 1.34 0 0 0 -2.32 0l-1.62 2.86a1.38 1.38 0 0 0 .5 1.87l1.27.75a1.38 1.38 0 0 1 .5 1.86l-.48.84a1.34 1.34 0 0 1 -.89.65l-7.22 1.5a1.34 1.34 0 0 1 -1.54-.91l-2.38-7.14a1.39 1.39 0 0 1 .11-1.12l.47-.83a1.34 1.34 0 0 1 1.84-.49l1.27.75a1.33 1.33 0 0 0 1.83-.49l1.61-2.83a1.37 1.37 0 0 0 -1.16-2h-9.84a1.35 1.35 0 0 0 -1.34 1.27v22.18a3.36 3.36 0 0 0 5.03 2.94z"/><path d="m77.19 39.69a11.33 11.33 0 0 1 -4.19-.69 5.84 5.84 0 0 1 -2.64-2.1 9.5 9.5 0 0 1 -1.36-3.65 31.72 31.72 0 0 1 -.4-5.44 30.54 30.54 0 0 1 .4-5.37 9.19 9.19 0 0 1 1.37-3.63 5.7 5.7 0 0 1 2.64-2 11.33 11.33 0 0 1 4.18-.67 25.1 25.1 0 0 1 3.11.2 30.71 30.71 0 0 1 3.44.63l-.13 3a33.25 33.25 0 0 0 -6-.53 6.8 6.8 0 0 0 -2.51.4 3.28 3.28 0 0 0 -1.57 1.4 6.75 6.75 0 0 0 -.84 2.6 29 29 0 0 0 -.23 4.07 29.77 29.77 0 0 0 .23 4.1 7.52 7.52 0 0 0 .8 2.63 3.15 3.15 0 0 0 1.51 1.36 6.8 6.8 0 0 0 2.51.4 37.4 37.4 0 0 0 6.08-.5l.11 3.1a30.65 30.65 0 0 1 -6.51.69z"/><path d="m99.86 27.47v8.34a1.87 1.87 0 0 0 .4 1.21 2.21 2.21 0 0 0 1.21.48l-.11 3a7.63 7.63 0 0 1 -4.88-1.35 13.65 13.65 0 0 1 -5.9 1.35q-5.46 0-5.46-5.82a5 5 0 0 1 1.47-4 8.06 8.06 0 0 1 4.58-1.5l4.73-.4v-1.31a2.64 2.64 0 0 0 -.66-2 2.64 2.64 0 0 0 -1.87-.59q-1.17 0-2.64.07t-3.23.22l-1.17.07-.15-2.82a33 33 0 0 1 7.37-1q3.37 0 4.84 1.43t1.47 4.62zm-4 4.08-3.86.37a2.24 2.24 0 0 0 -2.31 2.5q0 2.3 2 2.3a12.45 12.45 0 0 0 3.54-.53l.6-.2z"/><path d="m107.78 39.43v-23.76h-4v23.76z"/><path d="m116.69 39.43v-23.76h-4v23.76z"/><path d="m124.6 39.43v-16.83h-4v16.83zm0-19.8v-4h-4v4z"/><path d="m140.79 23.05-.07 3q-2-.27-3.44-.4t-2.28-.1a4.92 4.92 0 0 0 -2.47.43 1.4 1.4 0 0 0 -.67 1.3 1.29 1.29 0 0 0 .77 1.27 9 9 0 0 0 1.24.4q.9.2 2.31.43a12.65 12.65 0 0 1 2.37.6 4.38 4.38 0 0 1 1.57 1 3.23 3.23 0 0 1 .87 1.47 6.69 6.69 0 0 1 .3 2.17 4.45 4.45 0 0 1 -1.7 3.87 8.2 8.2 0 0 1 -4.91 1.23 17.84 17.84 0 0 1 -2.31-.17q-1.27-.13-2.84-.4l-1-.17.13-3q2 .27 3.44.4t2.34.13a5.35 5.35 0 0 0 2.56-.51 1.53 1.53 0 0 0 .74-1.43 1.48 1.48 0 0 0 -.7-1.4 7.26 7.26 0 0 0 -1.24-.37q-.84-.23-2.21-.47a20.2 20.2 0 0 1 -2.37-.53 5.43 5.43 0 0 1 -1.64-.87 3.68 3.68 0 0 1 -1-1.4 6.39 6.39 0 0 1 -.3-2.13 4.94 4.94 0 0 1 .47-2.23 4.51 4.51 0 0 1 1.27-1.6 5.58 5.58 0 0 1 2-.93 9.23 9.23 0 0 1 2.54-.33 23.47 23.47 0 0 1 2.37.13q1.3.13 2.87.4z"/><path d="m154.3 22.6v3h-4.95v7.3q0 1 0 1.67a2.58 2.58 0 0 0 .29 1 1.27 1.27 0 0 0 .62.53 3.47 3.47 0 0 0 1.06.13l3-.1.18 2.9a22.27 22.27 0 0 1 -3.74.43 9.71 9.71 0 0 1 -2.6-.3 3.68 3.68 0 0 1 -1.69-1 4.09 4.09 0 0 1 -.88-1.9 14.69 14.69 0 0 1 -.26-3v-7.69h-2v-3h2v-4.92h4v4.95z"/><path d="m163.42 22.28q4 0 5.71 2.17t1.74 6.5a16.06 16.06 0 0 1 -.4 3.8 7.07 7.07 0 0 1 -1.27 2.73 5.38 5.38 0 0 1 -2.31 1.67 9.84 9.84 0 0 1 -3.47.53 10 10 0 0 1 -3.47-.53 5.38 5.38 0 0 1 -2.31-1.67 7.07 7.07 0 0 1 -1.27-2.73 16.06 16.06 0 0 1 -.37-3.75 16 16 0 0 1 .37-3.57 7.31 7.31 0 0 1 1.2-2.73 5.51 5.51 0 0 1 2.31-1.73 8.87 8.87 0 0 1 3.54-.69zm-3 13q.74 1.33 3 1.33a4.88 4.88 0 0 0 1.84-.3 2.63 2.63 0 0 0 1.17-1 4.72 4.72 0 0 0 .6-1.77 17.58 17.58 0 0 0 .17-2.6 8.18 8.18 0 0 0 -.84-4.3 3.21 3.21 0 0 0 -2.94-1.27 3.29 3.29 0 0 0 -3 1.27 8.47 8.47 0 0 0 -.8 4.3 9.33 9.33 0 0 0 .79 4.35z"/></g></svg>
<defs>
<style>
.a {
fill: #fff;
}
</style>
</defs>
<title>callisto_logo</title>
<g>
<path class="a" d="M.87,4h0V26.18a1.35,1.35,0,0,0,1.35,1.37l9.91,0a1.37,1.37,0,0,0,1.16-2L12,23.19h0a2,2,0,0,0-2.75-.75h0l-.14.08h0a2,2,0,0,1-2.72-.74,2.06,2.06,0,0,1-.16-1.65h0l2.06-6.28h0a2,2,0,0,1,2.31-1.36h0L17,13.8h0a2,2,0,0,1,1.33,1,2,2,0,0,1-.73,2.77h0l-.14.08h0a2.07,2.07,0,0,0-.74,2.8h0L18,22.65a1.34,1.34,0,0,0,2.32,0l5-8.66a1.37,1.37,0,0,0-.49-1.86L5.9,1.06h0A3.36,3.36,0,0,0,.87,4Z"/>
<path class="a" d="M50.9,26.32h0L30.58,14.37a1.34,1.34,0,0,0-1.85.5L23.4,24.36a1.47,1.47,0,0,0,1.25,2.19h3.48a1.45,1.45,0,0,0,1.44-1.47V24A1.34,1.34,0,0,1,30.9,22.6h.92a1.33,1.33,0,0,1,1,.46l4.84,5.56a1.38,1.38,0,0,1,0,1.81L32.83,36a1.33,1.33,0,0,1-1,.46H30.9a1.34,1.34,0,0,1-1.33-1.35V34a1.45,1.45,0,0,0-1.44-1.47H24.7a1.47,1.47,0,0,0-1.25,2.19l5.29,9.43a1.33,1.33,0,0,0,1.83.49L50.9,32.67h0A3.7,3.7,0,0,0,50.9,26.32Z"/>
<path class="a" d="M5.9,58.94h0L24.76,47.87a1.39,1.39,0,0,0,.5-1.88l-5-8.71a1.34,1.34,0,0,0-2.32,0l-1.62,2.86a1.38,1.38,0,0,0,.5,1.87l1.27.75a1.38,1.38,0,0,1,.5,1.86l-.48.84a1.34,1.34,0,0,1-.89.65L10,47.61a1.34,1.34,0,0,1-1.54-.91L6.08,39.56a1.39,1.39,0,0,1,.11-1.12l.47-.83a1.34,1.34,0,0,1,1.84-.49l1.27.75a1.33,1.33,0,0,0,1.83-.49l1.61-2.83a1.37,1.37,0,0,0-1.16-2l-9.84,0A1.35,1.35,0,0,0,.87,33.82V56h0A3.36,3.36,0,0,0,5.9,58.94Z"/>
<path class="a" d="M77.19,39.69A11.33,11.33,0,0,1,73,39a5.84,5.84,0,0,1-2.64-2.1A9.5,9.5,0,0,1,69,33.25a31.72,31.72,0,0,1-.4-5.44,30.54,30.54,0,0,1,.4-5.37,9.19,9.19,0,0,1,1.37-3.63,5.7,5.7,0,0,1,2.64-2,11.33,11.33,0,0,1,4.18-.67,25.1,25.1,0,0,1,3.11.2,30.71,30.71,0,0,1,3.44.63l-.13,3a33.25,33.25,0,0,0-6-.53,6.8,6.8,0,0,0-2.51.4,3.28,3.28,0,0,0-1.57,1.4,6.75,6.75,0,0,0-.84,2.6,29,29,0,0,0-.23,4.07,29.77,29.77,0,0,0,.23,4.1,7.52,7.52,0,0,0,.8,2.63A3.15,3.15,0,0,0,75,36a6.8,6.8,0,0,0,2.51.4,37.4,37.4,0,0,0,6.08-.5L83.7,39A30.65,30.65,0,0,1,77.19,39.69Z"/>
<path class="a" d="M99.86,27.47v8.34a1.87,1.87,0,0,0,.4,1.21,2.21,2.21,0,0,0,1.21.48l-.11,3a7.63,7.63,0,0,1-4.88-1.35,13.65,13.65,0,0,1-5.9,1.35q-5.46,0-5.46-5.82a5,5,0,0,1,1.47-4,8.06,8.06,0,0,1,4.58-1.5l4.73-.4V27.47a2.64,2.64,0,0,0-.66-2,2.64,2.64,0,0,0-1.87-.59q-1.17,0-2.64.07t-3.23.22l-1.17.07-.15-2.82a33,33,0,0,1,7.37-1q3.37,0,4.84,1.43T99.86,27.47Zm-4,4.08L92,31.92a2.24,2.24,0,0,0-2.31,2.5q0,2.3,2,2.3a12.45,12.45,0,0,0,3.54-.53l.6-.2Z"/>
<path class="a" d="M107.78,39.43V15.67h-4V39.43Z"/>
<path class="a" d="M116.69,39.43V15.67h-4V39.43Z"/>
<path class="a" d="M124.6,39.43V22.6h-4V39.43Zm0-19.8v-4h-4v4Z"/>
<path class="a" d="M140.79,23.05l-.07,3q-2-.27-3.44-.4T135,25.55a4.92,4.92,0,0,0-2.47.43,1.4,1.4,0,0,0-.67,1.3,1.29,1.29,0,0,0,.77,1.27,9,9,0,0,0,1.24.4q.9.2,2.31.43a12.65,12.65,0,0,1,2.37.6,4.38,4.38,0,0,1,1.57,1,3.23,3.23,0,0,1,.87,1.47,6.69,6.69,0,0,1,.3,2.17,4.45,4.45,0,0,1-1.7,3.87,8.2,8.2,0,0,1-4.91,1.23,17.84,17.84,0,0,1-2.31-.17q-1.27-.13-2.84-.4l-1-.17.13-3q2,.27,3.44.4t2.34.13A5.35,5.35,0,0,0,137,36a1.53,1.53,0,0,0,.74-1.43,1.48,1.48,0,0,0-.7-1.4,7.26,7.26,0,0,0-1.24-.37q-.84-.23-2.21-.47a20.2,20.2,0,0,1-2.37-.53,5.43,5.43,0,0,1-1.64-.87,3.68,3.68,0,0,1-1-1.4,6.39,6.39,0,0,1-.3-2.13,4.94,4.94,0,0,1,.47-2.23,4.51,4.51,0,0,1,1.27-1.6,5.58,5.58,0,0,1,2-.93,9.23,9.23,0,0,1,2.54-.33,23.47,23.47,0,0,1,2.37.13q1.3.13,2.87.4Z"/>
<path class="a" d="M154.3,22.6v3h-4.95V32.9q0,1,0,1.67a2.58,2.58,0,0,0,.29,1,1.27,1.27,0,0,0,.62.53,3.47,3.47,0,0,0,1.06.13l3-.1.18,2.9a22.27,22.27,0,0,1-3.74.43,9.71,9.71,0,0,1-2.6-.3,3.68,3.68,0,0,1-1.69-1,4.09,4.09,0,0,1-.88-1.9,14.69,14.69,0,0,1-.26-3V25.57h-2v-3h2V17.65h4V22.6Z"/>
<path class="a" d="M163.42,22.28q4,0,5.71,2.17t1.74,6.5a16.06,16.06,0,0,1-.4,3.8,7.07,7.07,0,0,1-1.27,2.73,5.38,5.38,0,0,1-2.31,1.67,9.84,9.84,0,0,1-3.47.53,10,10,0,0,1-3.47-.53,5.38,5.38,0,0,1-2.31-1.67,7.07,7.07,0,0,1-1.27-2.73A16.06,16.06,0,0,1,156,31a16,16,0,0,1,.37-3.57,7.31,7.31,0,0,1,1.2-2.73,5.51,5.51,0,0,1,2.31-1.73A8.87,8.87,0,0,1,163.42,22.28Zm-3,13q.74,1.33,3,1.33a4.88,4.88,0,0,0,1.84-.3,2.63,2.63,0,0,0,1.17-1,4.72,4.72,0,0,0,.6-1.77,17.58,17.58,0,0,0,.17-2.6,8.18,8.18,0,0,0-.84-4.3,3.21,3.21,0,0,0-2.94-1.27,3.29,3.29,0,0,0-3,1.27,8.47,8.47,0,0,0-.8,4.3A9.33,9.33,0,0,0,160.41,35.29Z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

@ -1 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 425 106"><defs><style>.cls-1{fill:#fff;}</style></defs><title>classic_logo</title><path class="cls-1" d="M124.947,72.479a10.032,10.032,0,0,0,6.65-2.238,7.874,7.874,0,0,0,2.9-5.792h3.65a10.753,10.753,0,0,1-1.967,5.729,12.32,12.32,0,0,1-4.809,4.047,14.494,14.494,0,0,1-6.427,1.46,13.267,13.267,0,0,1-10.712-4.7q-3.949-4.7-3.951-12.632V57.213a21.45,21.45,0,0,1,1.778-8.982,13.688,13.688,0,0,1,5.093-6.03,14.061,14.061,0,0,1,7.761-2.127,13.242,13.242,0,0,1,9.314,3.364,12.265,12.265,0,0,1,3.92,8.855H134.5a9.188,9.188,0,0,0-9.584-8.981,9.467,9.467,0,0,0-7.982,3.713q-2.841,3.712-2.841,10.411v1.11q0,6.57,2.841,10.252A9.532,9.532,0,0,0,124.947,72.479Z"/><path class="cls-1" d="M163.184,75.05h-3.809V26.3h3.809Z"/><path class="cls-1" d="M208.371,75.05a17.958,17.958,0,0,1-.73-4.792,13.237,13.237,0,0,1-5.094,4.014,15.6,15.6,0,0,1-6.554,1.413,11.511,11.511,0,0,1-8.014-2.761,8.994,8.994,0,0,1-3.062-6.983,9.191,9.191,0,0,1,4.173-7.934q4.173-2.92,11.632-2.921h6.887v-3.9a7.522,7.522,0,0,0-2.269-5.792q-2.27-2.112-6.617-2.111a10.357,10.357,0,0,0-6.57,2.031,6.034,6.034,0,0,0-2.6,4.888l-3.808-.032a8.833,8.833,0,0,1,3.808-7.094,14.668,14.668,0,0,1,9.363-3q5.745,0,9.061,2.872a10.308,10.308,0,0,1,3.412,8.014V67.211a20.132,20.132,0,0,0,1.048,7.458v.381Zm-11.933-2.73a12.745,12.745,0,0,0,6.808-1.841,10.826,10.826,0,0,0,4.363-4.918V58.007h-6.792q-5.68.063-8.886,2.078a6.24,6.24,0,0,0-3.206,5.539,6.137,6.137,0,0,0,2.143,4.792A8.065,8.065,0,0,0,196.438,72.32Z"/><path class="cls-1" d="M255.272,66.322A5.413,5.413,0,0,0,253,61.783a17.5,17.5,0,0,0-6.839-2.681,30.851,30.851,0,0,1-7.093-2.222,9.442,9.442,0,0,1-3.745-3.063,7.638,7.638,0,0,1-1.222-4.38,8.166,8.166,0,0,1,3.4-6.712,13.712,13.712,0,0,1,8.7-2.651q5.744,0,9.22,2.841a9.117,9.117,0,0,1,3.475,7.411h-3.808a6.149,6.149,0,0,0-2.524-5.015,11.391,11.391,0,0,0-12.378-.333,5.141,5.141,0,0,0-2.269,4.332,4.684,4.684,0,0,0,1.888,3.983q1.888,1.413,6.888,2.587a32.363,32.363,0,0,1,7.49,2.508,9.706,9.706,0,0,1,3.7,3.205,8.815,8.815,0,0,1-2.3,11.489,14.987,14.987,0,0,1-9.157,2.6,15.377,15.377,0,0,1-9.728-2.905,8.936,8.936,0,0,1-3.729-7.346h3.809a6.6,6.6,0,0,0,2.809,5.188,11.478,11.478,0,0,0,6.839,1.857,10.789,10.789,0,0,0,6.411-1.746A5.237,5.237,0,0,0,255.272,66.322Z"/><path class="cls-1" d="M301.379,66.322a5.413,5.413,0,0,0-2.27-4.539A17.5,17.5,0,0,0,292.27,59.1a30.851,30.851,0,0,1-7.093-2.222,9.442,9.442,0,0,1-3.745-3.063,7.631,7.631,0,0,1-1.223-4.38,8.169,8.169,0,0,1,3.4-6.712,13.717,13.717,0,0,1,8.7-2.651q5.743,0,9.219,2.841A9.115,9.115,0,0,1,305,50.326h-3.809a6.148,6.148,0,0,0-2.523-5.015,11.391,11.391,0,0,0-12.378-.333,5.141,5.141,0,0,0-2.269,4.332,4.682,4.682,0,0,0,1.888,3.983q1.889,1.413,6.888,2.587a32.363,32.363,0,0,1,7.49,2.508,9.7,9.7,0,0,1,3.7,3.205,8.812,8.812,0,0,1-2.3,11.489,14.989,14.989,0,0,1-9.158,2.6A15.376,15.376,0,0,1,282.8,72.78a8.937,8.937,0,0,1-3.73-7.346h3.809a6.6,6.6,0,0,0,2.81,5.188,11.472,11.472,0,0,0,6.838,1.857,10.8,10.8,0,0,0,6.413-1.746A5.238,5.238,0,0,0,301.379,66.322Z"/><path class="cls-1" d="M326.7,30.791a2.55,2.55,0,0,1,.7-1.814,2.49,2.49,0,0,1,1.9-.741,2.492,2.492,0,0,1,2.634,2.555,2.463,2.463,0,0,1-.714,1.8,2.574,2.574,0,0,1-1.92.726,2.517,2.517,0,0,1-1.9-.726A2.491,2.491,0,0,1,326.7,30.791Zm4.476,44.259h-3.809V40.709h3.809Z"/><path class="cls-1" d="M367.379,72.479a10.029,10.029,0,0,0,6.649-2.238,7.875,7.875,0,0,0,2.9-5.792h3.65a10.754,10.754,0,0,1-1.968,5.729,12.317,12.317,0,0,1-4.808,4.047,14.494,14.494,0,0,1-6.427,1.46,13.267,13.267,0,0,1-10.712-4.7q-3.951-4.7-3.951-12.632V57.213a21.466,21.466,0,0,1,1.777-8.982,13.7,13.7,0,0,1,5.094-6.03,14.061,14.061,0,0,1,7.761-2.127,13.244,13.244,0,0,1,9.314,3.364,12.273,12.273,0,0,1,3.92,8.855h-3.65a9.189,9.189,0,0,0-9.584-8.981,9.47,9.47,0,0,0-7.983,3.713q-2.841,3.712-2.841,10.411v1.11q0,6.57,2.841,10.252A9.536,9.536,0,0,0,367.379,72.479Z"/><path class="cls-1" d="M81.333,52.419v2.266a3.585,3.585,0,0,0-.518.512Q69.736,71.745,58.672,88.3H55.65Q45.524,73.15,35.389,58.006a17.114,17.114,0,0,0-2.4-3.321V52.419a3.645,3.645,0,0,0,.519-.512Q44.585,35.359,55.65,18.8h3.022Q68.8,33.954,78.933,49.1A17.067,17.067,0,0,0,81.333,52.419ZM69.947,61.048c-3.775,1.823-7.574,3.6-11.31,5.5a2.869,2.869,0,0,1-2.953,0c-3.736-1.9-7.535-3.678-11.311-5.5-.078-.073-.206-.221-.226-.207-.233.156-.095.271.063.375Q50.348,70.5,56.48,79.781c.493.748.867.75,1.361,0q6.123-9.291,12.27-18.566c.159-.1.3-.22.064-.375C70.154,60.827,70.026,60.975,69.947,61.048Zm0-14.992c.078.073.207.221.227.207.233-.156.094-.271-.064-.375q-6.138-9.28-12.27-18.565c-.492-.748-.866-.75-1.36,0Q50.358,36.613,44.21,45.887c-.158.1-.3.22-.063.376.02.014.149-.134.227-.207,3.775-1.824,7.575-3.6,11.311-5.5a2.865,2.865,0,0,1,2.952,0C62.374,42.456,66.173,44.232,69.948,46.056Zm-28.2,7.5c3.666,1.827,7.127,3.193,10.19,5.174,3.642,2.354,6.792,2.377,10.44.007,3.061-1.987,6.527-3.351,10.2-5.183-3.666-1.828-7.127-3.193-10.19-5.174-3.641-2.354-6.792-2.377-10.44-.008C48.886,50.357,45.419,51.72,41.745,53.553Z"/></svg> <svg viewBox="0 0 425 106" xmlns="http://www.w3.org/2000/svg"><g fill="#fff"><path d="m124.947 72.479a10.032 10.032 0 0 0 6.65-2.238 7.874 7.874 0 0 0 2.9-5.792h3.65a10.753 10.753 0 0 1 -1.967 5.729 12.32 12.32 0 0 1 -4.809 4.047 14.494 14.494 0 0 1 -6.427 1.46 13.267 13.267 0 0 1 -10.712-4.7q-3.949-4.7-3.951-12.632v-1.14a21.45 21.45 0 0 1 1.778-8.982 13.688 13.688 0 0 1 5.093-6.03 14.061 14.061 0 0 1 7.761-2.127 13.242 13.242 0 0 1 9.314 3.364 12.265 12.265 0 0 1 3.92 8.855h-3.647a9.188 9.188 0 0 0 -9.584-8.981 9.467 9.467 0 0 0 -7.982 3.713q-2.841 3.712-2.841 10.411v1.11q0 6.57 2.841 10.252a9.532 9.532 0 0 0 8.013 3.681z"/><path d="m163.184 75.05h-3.809v-48.75h3.809z"/><path d="m208.371 75.05a17.958 17.958 0 0 1 -.73-4.792 13.237 13.237 0 0 1 -5.094 4.014 15.6 15.6 0 0 1 -6.554 1.413 11.511 11.511 0 0 1 -8.014-2.761 8.994 8.994 0 0 1 -3.062-6.983 9.191 9.191 0 0 1 4.173-7.934q4.173-2.92 11.632-2.921h6.887v-3.9a7.522 7.522 0 0 0 -2.269-5.792q-2.27-2.112-6.617-2.111a10.357 10.357 0 0 0 -6.57 2.031 6.034 6.034 0 0 0 -2.6 4.888l-3.808-.032a8.833 8.833 0 0 1 3.808-7.094 14.668 14.668 0 0 1 9.363-3q5.745 0 9.061 2.872a10.308 10.308 0 0 1 3.412 8.014v16.249a20.132 20.132 0 0 0 1.048 7.458v.381zm-11.933-2.73a12.745 12.745 0 0 0 6.808-1.841 10.826 10.826 0 0 0 4.363-4.918v-7.554h-6.792q-5.68.063-8.886 2.078a6.24 6.24 0 0 0 -3.206 5.539 6.137 6.137 0 0 0 2.143 4.792 8.065 8.065 0 0 0 5.57 1.904z"/><path d="m255.272 66.322a5.413 5.413 0 0 0 -2.272-4.539 17.5 17.5 0 0 0 -6.839-2.681 30.851 30.851 0 0 1 -7.093-2.222 9.442 9.442 0 0 1 -3.745-3.063 7.638 7.638 0 0 1 -1.222-4.38 8.166 8.166 0 0 1 3.4-6.712 13.712 13.712 0 0 1 8.7-2.651q5.744 0 9.22 2.841a9.117 9.117 0 0 1 3.475 7.411h-3.808a6.149 6.149 0 0 0 -2.524-5.015 11.391 11.391 0 0 0 -12.378-.333 5.141 5.141 0 0 0 -2.269 4.332 4.684 4.684 0 0 0 1.888 3.983q1.888 1.413 6.888 2.587a32.363 32.363 0 0 1 7.49 2.508 9.706 9.706 0 0 1 3.7 3.205 8.815 8.815 0 0 1 -2.3 11.489 14.987 14.987 0 0 1 -9.157 2.6 15.377 15.377 0 0 1 -9.728-2.905 8.936 8.936 0 0 1 -3.729-7.346h3.809a6.6 6.6 0 0 0 2.809 5.188 11.478 11.478 0 0 0 6.839 1.857 10.789 10.789 0 0 0 6.411-1.746 5.237 5.237 0 0 0 2.435-4.408z"/><path d="m301.379 66.322a5.413 5.413 0 0 0 -2.27-4.539 17.5 17.5 0 0 0 -6.839-2.683 30.851 30.851 0 0 1 -7.093-2.222 9.442 9.442 0 0 1 -3.745-3.063 7.631 7.631 0 0 1 -1.223-4.38 8.169 8.169 0 0 1 3.4-6.712 13.717 13.717 0 0 1 8.7-2.651q5.743 0 9.219 2.841a9.115 9.115 0 0 1 3.472 7.413h-3.809a6.148 6.148 0 0 0 -2.523-5.015 11.391 11.391 0 0 0 -12.378-.333 5.141 5.141 0 0 0 -2.269 4.332 4.682 4.682 0 0 0 1.888 3.983q1.889 1.413 6.888 2.587a32.363 32.363 0 0 1 7.49 2.508 9.7 9.7 0 0 1 3.7 3.205 8.812 8.812 0 0 1 -2.3 11.489 14.989 14.989 0 0 1 -9.158 2.6 15.376 15.376 0 0 1 -9.729-2.902 8.937 8.937 0 0 1 -3.73-7.346h3.809a6.6 6.6 0 0 0 2.81 5.188 11.472 11.472 0 0 0 6.838 1.857 10.8 10.8 0 0 0 6.413-1.746 5.238 5.238 0 0 0 2.439-4.411z"/><path d="m326.7 30.791a2.55 2.55 0 0 1 .7-1.814 2.49 2.49 0 0 1 1.9-.741 2.492 2.492 0 0 1 2.634 2.555 2.463 2.463 0 0 1 -.714 1.8 2.574 2.574 0 0 1 -1.92.726 2.517 2.517 0 0 1 -1.9-.726 2.491 2.491 0 0 1 -.7-1.8zm4.476 44.259h-3.809v-34.341h3.809z"/><path d="m367.379 72.479a10.029 10.029 0 0 0 6.649-2.238 7.875 7.875 0 0 0 2.9-5.792h3.65a10.754 10.754 0 0 1 -1.968 5.729 12.317 12.317 0 0 1 -4.808 4.047 14.494 14.494 0 0 1 -6.427 1.46 13.267 13.267 0 0 1 -10.712-4.7q-3.951-4.7-3.951-12.632v-1.14a21.466 21.466 0 0 1 1.777-8.982 13.7 13.7 0 0 1 5.094-6.03 14.061 14.061 0 0 1 7.761-2.127 13.244 13.244 0 0 1 9.314 3.364 12.273 12.273 0 0 1 3.92 8.855h-3.65a9.189 9.189 0 0 0 -9.584-8.981 9.47 9.47 0 0 0 -7.983 3.713q-2.841 3.712-2.841 10.411v1.11q0 6.57 2.841 10.252a9.536 9.536 0 0 0 8.018 3.681z"/><path d="m81.333 52.419v2.266a3.585 3.585 0 0 0 -.518.512q-11.079 16.548-22.143 33.103h-3.022q-10.126-15.15-20.261-30.294a17.114 17.114 0 0 0 -2.4-3.321v-2.266a3.645 3.645 0 0 0 .519-.512q11.077-16.548 22.142-33.107h3.022q10.128 15.154 20.261 30.3a17.067 17.067 0 0 0 2.4 3.319zm-11.386 8.629c-3.775 1.823-7.574 3.6-11.31 5.5a2.869 2.869 0 0 1 -2.953 0c-3.736-1.9-7.535-3.678-11.311-5.5-.078-.073-.206-.221-.226-.207-.233.156-.095.271.063.375q6.138 9.284 12.27 18.565c.493.748.867.75 1.361 0q6.123-9.291 12.27-18.566c.159-.1.3-.22.064-.375-.021-.013-.149.135-.228.208zm0-14.992c.078.073.207.221.227.207.233-.156.094-.271-.064-.375q-6.138-9.28-12.27-18.565c-.492-.748-.866-.75-1.36 0q-6.122 9.29-12.27 18.564c-.158.1-.3.22-.063.376.02.014.149-.134.227-.207 3.775-1.824 7.575-3.6 11.311-5.5a2.865 2.865 0 0 1 2.952 0c3.737 1.9 7.536 3.676 11.311 5.5zm-28.2 7.5c3.666 1.827 7.127 3.193 10.19 5.174 3.642 2.354 6.792 2.377 10.44.007 3.061-1.987 6.527-3.351 10.2-5.183-3.666-1.828-7.127-3.193-10.19-5.174-3.641-2.354-6.792-2.377-10.44-.008-3.061 1.985-6.528 3.348-10.202 5.181z"/></g></svg>

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

@ -1,7 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="197" height="124"> <svg height="124" width="197" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m33.859 20.795.77-7.702 3.848-6.161 13.082-3.081 11.543-.77 10.773 3.851 3.848 3.08 5.386 2.311h20.008l8.465-.77 8.465-.77 6.156-5.392 12.313-2.31 13.082 3.08 9.234 3.851 1.539 10.013-46.941 13.093z" fill="#e0ceff"/><path d="m23.855 121.689-6.925-.77-8.465-5.391-4.617-8.472-1.539-10.013 23.086-67.006 4.617-7.702 14.621-4.621 15.39-.77 10.774 3.851 7.695 8.472 31.551.77 8.465-1.54 11.543-10.783h13.082l19.238 2.311 9.234 8.472 4.618 13.093 15.39 46.211 2.309 9.242-3.848 16.945-7.695 6.161-6.926 1.54h-8.465l-11.543-7.701-15.39-15.404-7.696-3.851-11.543-2.311h-53.867l-15.39 12.323-15.391 13.864z" fill="#af81ff"/><path d="m24.625 121.689 18.469-36.198 6.926-13.093 7.695-5.392 82.34.77 6.156 3.851 24.625 47.752-2.309 1.54-12.312-5.391-21.547-20.795-28.473-3.081-40.785 2.311-22.316 17.714z" fill="#884def"/><path d="m120.047 73.938a6.93 6.93 0 0 1 -6.926-6.932 6.929 6.929 0 0 1 6.926-6.931 6.929 6.929 0 0 1 6.926 6.931 6.93 6.93 0 0 1 -6.926 6.932zm-43.094 0a6.93 6.93 0 0 1 -6.926-6.932 6.929 6.929 0 0 1 6.926-6.931 6.929 6.929 0 0 1 6.926 6.931 6.93 6.93 0 0 1 -6.926 6.932zm-30.781-21.565c-5.525 0-10.004-4.483-10.004-10.013 0-5.529 4.479-10.012 10.004-10.012s10.004 4.483 10.004 10.012c0 5.53-4.479 10.013-10.004 10.013z" fill="#5ae9ab"/><path d="m173.145 124c-12.89 0-35.399-23.876-35.399-23.876s-5.506-6.161-12.312-6.161h-26.934-26.934c-6.806 0-12.312 6.161-12.312 6.161s-22.509 23.876-35.399 23.876c-17.203 0-23.855-17.346-23.855-23.106 0-5.759 22.316-74.708 22.316-74.708s3.42-8.472 8.465-8.472c0-10.09 10.774-15.403 10.774-15.403s5.061-2.311 18.468-2.311c13.408 0 20.008 7.702 20.008 7.702h36.938s6.6-7.702 20.008-7.702c13.407 0 18.468 2.311 18.468 2.311s10.774 5.313 10.774 15.403c5.045 0 8.465 8.472 8.465 8.472s22.316 68.949 22.316 74.708c0 5.76-6.652 23.106-23.855 23.106zm-36.938-118.609c-9.332 0-17.699 8.472-17.699 8.472h-40.016s-8.367-8.472-17.699-8.472c-23.795 0-24.361 9.146-23.856 10.013.506.867 19.053-3.851 23.856-3.851 10.209 0 17.799 14.633 22.316 14.633h30.782c4.517 0 12.107-14.633 22.316-14.633 4.803 0 23.35 4.718 23.856 3.851.505-.867-.061-10.013-23.856-10.013zm33.09 23.876s-2.081-5.304-6.156-7.702c-4.076-2.398-26.934-3.851-26.934-3.851l-4.617 1.541-10.004 10.012s-4.791 3.081-7.695 3.081h-15.391-15.391c-2.904 0-7.695-3.081-7.695-3.081l-10.004-10.012-4.617-1.541s-22.858 1.453-26.934 3.851c-4.075 2.398-6.156 7.702-6.156 7.702s-22.316 66.674-22.316 70.857c0 1.078 2.684 17.715 18.468 17.715.022 0 13.054-30.708 16.93-33.889 3.876-3.18 4.617 2.311 4.617 2.311s-15.455 30.037-14.621 30.037c5.714-1.7 30.012-24.646 30.012-24.646s4.849-3.851 8.465-3.851h58.484c3.616 0 8.465 3.851 8.465 3.851s24.298 22.946 30.012 24.646c.72 0-10.702-22.389-13.832-28.499l-.02.002-6.926-12.323s-4.293-6.161-9.234-6.161h-5.045c-1.349 4.882-5.808 8.472-11.115 8.472s-9.767-3.59-11.115-8.472h-20.864c-1.348 4.882-5.808 8.472-11.115 8.472s-9.766-3.59-11.115-8.472h-8.123c-2.289 0-6.156 5.391-6.156 5.391s-6.084 2.97-4.618-3.081c.793-1.069 4.443-8.472 10.774-8.472h8.123c1.349-4.882 5.808-8.472 11.115-8.472s9.767 3.59 11.115 8.472h20.864c1.348-4.882 5.808-8.472 11.115-8.472s9.766 3.59 11.115 8.472h5.815c9.845 0 14.621 11.553 14.621 11.553l6.925 12.323-.029.004c5.204 8.596 14.632 30.804 14.651 30.804 15.784 0 18.468-16.637 18.468-17.715 0-4.183-22.316-70.857-22.316-70.857zm-43.863 36.969a5.389 5.389 0 0 0 -5.387-5.391 5.389 5.389 0 0 0 -5.387 5.391 5.389 5.389 0 0 0 5.387 5.391 5.389 5.389 0 0 0 5.387-5.391zm-43.094 0a5.389 5.389 0 0 0 -5.387-5.391 5.389 5.389 0 0 0 -5.387 5.391 5.389 5.389 0 0 0 5.387 5.391 5.389 5.389 0 0 0 5.387-5.391zm77.723-20.795h-8.465v8.472a3.08 3.08 0 0 1 -3.078 3.081 3.08 3.08 0 0 1 -3.079-3.081v-8.472h-8.464a3.08 3.08 0 0 1 0-6.161h8.464v-8.473a3.079 3.079 0 0 1 6.157 0v8.473h8.465c1.7 0 3.078 1.379 3.078 3.08a3.08 3.08 0 0 1 -3.078 3.081zm-113.891 11.553c-8.5 0-15.391-6.897-15.391-15.404s6.891-15.404 15.391-15.404 15.391 6.897 15.391 15.404-6.891 15.404-15.391 15.404zm0-24.646c-5.1 0-9.235 4.138-9.235 9.242s4.135 9.242 9.235 9.242 9.234-4.138 9.234-9.242-4.134-9.242-9.234-9.242z"/></g></svg>
<path fill="#E0CEFF" fill-rule="evenodd" d="M33.859 20.795l.77-7.702 3.848-6.161 13.082-3.081 11.543-.77 10.773 3.851 3.848 3.08 5.386 2.311h20.008l8.465-.77 8.465-.77 6.156-5.392 12.313-2.31 13.082 3.08 9.234 3.851 1.539 10.013-46.941 13.093-81.571-12.323z"/>
<path fill="#AF81FF" fill-rule="evenodd" d="M23.855 121.689l-6.925-.77-8.465-5.391-4.617-8.472-1.539-10.013 23.086-67.006 4.617-7.702 14.621-4.621 15.39-.77 10.774 3.851 7.695 8.472 31.551.77 8.465-1.54 11.543-10.783h13.082l19.238 2.311 9.234 8.472 4.618 13.093 15.39 46.211 2.309 9.242-3.848 16.945-7.695 6.161-6.926 1.54h-8.465l-11.543-7.701-15.39-15.404-7.696-3.851-11.543-2.311H66.949l-15.39 12.323-15.391 13.864-12.313 3.08z"/>
<path fill="#884DEF" fill-rule="evenodd" d="M24.625 121.689l18.469-36.198 6.926-13.093 7.695-5.392 82.34.77 6.156 3.851 24.625 47.752-2.309 1.54-12.312-5.391-21.547-20.795-28.473-3.081-40.785 2.311-22.316 17.714-18.469 10.012z"/>
<path fill="#5AE9AB" fill-rule="evenodd" d="M120.047 73.938a6.93 6.93 0 0 1-6.926-6.932 6.929 6.929 0 0 1 6.926-6.931 6.929 6.929 0 0 1 6.926 6.931 6.93 6.93 0 0 1-6.926 6.932zm-43.094 0a6.93 6.93 0 0 1-6.926-6.932 6.929 6.929 0 0 1 6.926-6.931 6.929 6.929 0 0 1 6.926 6.931 6.93 6.93 0 0 1-6.926 6.932zM46.172 52.373c-5.525 0-10.004-4.483-10.004-10.013 0-5.529 4.479-10.012 10.004-10.012 5.525 0 10.004 4.483 10.004 10.012 0 5.53-4.479 10.013-10.004 10.013z"/>
<path fill-rule="evenodd" d="M173.145 124c-12.89 0-35.399-23.876-35.399-23.876s-5.506-6.161-12.312-6.161H98.5 71.566c-6.806 0-12.312 6.161-12.312 6.161S36.745 124 23.855 124C6.652 124 0 106.654 0 100.894c0-5.759 22.316-74.708 22.316-74.708s3.42-8.472 8.465-8.472c0-10.09 10.774-15.403 10.774-15.403S46.616 0 60.023 0c13.408 0 20.008 7.702 20.008 7.702h36.938S123.569 0 136.977 0c13.407 0 18.468 2.311 18.468 2.311s10.774 5.313 10.774 15.403c5.045 0 8.465 8.472 8.465 8.472S197 95.135 197 100.894c0 5.76-6.652 23.106-23.855 23.106zM136.207 5.391c-9.332 0-17.699 8.472-17.699 8.472H78.492s-8.367-8.472-17.699-8.472c-23.795 0-24.361 9.146-23.856 10.013.506.867 19.053-3.851 23.856-3.851 10.209 0 17.799 14.633 22.316 14.633h30.782c4.517 0 12.107-14.633 22.316-14.633 4.803 0 23.35 4.718 23.856 3.851.505-.867-.061-10.013-23.856-10.013zm33.09 23.876s-2.081-5.304-6.156-7.702c-4.076-2.398-26.934-3.851-26.934-3.851l-4.617 1.541-10.004 10.012s-4.791 3.081-7.695 3.081H98.5 83.109c-2.904 0-7.695-3.081-7.695-3.081L65.41 19.255l-4.617-1.541s-22.858 1.453-26.934 3.851c-4.075 2.398-6.156 7.702-6.156 7.702S5.387 95.941 5.387 100.124c0 1.078 2.684 17.715 18.468 17.715.022 0 13.054-30.708 16.93-33.889 3.876-3.18 4.617 2.311 4.617 2.311s-15.455 30.037-14.621 30.037c5.714-1.7 30.012-24.646 30.012-24.646s4.849-3.851 8.465-3.851h58.484c3.616 0 8.465 3.851 8.465 3.851s24.298 22.946 30.012 24.646c.72 0-10.702-22.389-13.832-28.499l-.02.002-6.926-12.323s-4.293-6.161-9.234-6.161h-5.045c-1.349 4.882-5.808 8.472-11.115 8.472s-9.767-3.59-11.115-8.472H88.068c-1.348 4.882-5.808 8.472-11.115 8.472s-9.766-3.59-11.115-8.472h-8.123c-2.289 0-6.156 5.391-6.156 5.391s-6.084 2.97-4.618-3.081c.793-1.069 4.443-8.472 10.774-8.472h8.123c1.349-4.882 5.808-8.472 11.115-8.472s9.767 3.59 11.115 8.472h20.864c1.348-4.882 5.808-8.472 11.115-8.472s9.766 3.59 11.115 8.472h5.815c9.845 0 14.621 11.553 14.621 11.553l6.925 12.323-.029.004c5.204 8.596 14.632 30.804 14.651 30.804 15.784 0 18.468-16.637 18.468-17.715 0-4.183-22.316-70.857-22.316-70.857zm-43.863 36.969a5.389 5.389 0 0 0-5.387-5.391 5.389 5.389 0 0 0-5.387 5.391 5.389 5.389 0 0 0 5.387 5.391 5.389 5.389 0 0 0 5.387-5.391zm-43.094 0a5.389 5.389 0 0 0-5.387-5.391 5.389 5.389 0 0 0-5.387 5.391 5.389 5.389 0 0 0 5.387 5.391 5.389 5.389 0 0 0 5.387-5.391zm77.723-20.795h-8.465v8.472a3.08 3.08 0 0 1-3.078 3.081 3.08 3.08 0 0 1-3.079-3.081v-8.472h-8.464a3.08 3.08 0 0 1 0-6.161h8.464v-8.473a3.079 3.079 0 0 1 6.157 0v8.473h8.465c1.7 0 3.078 1.379 3.078 3.08a3.08 3.08 0 0 1-3.078 3.081zM46.172 56.994c-8.5 0-15.391-6.897-15.391-15.404s6.891-15.404 15.391-15.404 15.391 6.897 15.391 15.404-6.891 15.404-15.391 15.404zm0-24.646c-5.1 0-9.235 4.138-9.235 9.242 0 5.104 4.135 9.242 9.235 9.242s9.234-4.138 9.234-9.242c0-5.104-4.134-9.242-9.234-9.242z"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 10 KiB

@ -1,17 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60"> <svg height="60" viewBox="0 0 60 60" width="60" xmlns="http://www.w3.org/2000/svg"><g fill="#fff"><path d="m16.87 29.94 5.57-5.55-5.76-5.82-16.1 11.37 16.1 11.37 5.76-5.82z"/><path d="m30.12 43.07-5.55-5.57-5.82 5.76 11.37 16.1 11.36-16.1-5.82-5.76z"/><path d="m43.48 18.57-5.76 5.82 5.57 5.55-5.57 5.55 5.76 5.82 16.1-11.37z"/><path d="m30.12 16.65 5.54 5.57 5.82-5.76-11.36-16.1-11.37 16.1 5.82 5.76z"/><path d="m23.51 23.29h13.14v13.14h-13.14z" transform="matrix(.70710678 -.70710678 .70710678 .70710678 -12.3 30.02)"/></g></svg>
<defs>
<style>
.a {
fill: #fff;
}
</style>
</defs>
<title>Artboard 8 copy 4</title>
<g>
<polygon class="a" points="16.87 29.94 22.44 24.39 16.68 18.57 0.58 29.94 16.68 41.31 22.44 35.49 16.87 29.94"/>
<polygon class="a" points="30.12 43.07 24.57 37.5 18.75 43.26 30.12 59.36 41.48 43.26 35.66 37.5 30.12 43.07"/>
<polygon class="a" points="43.48 18.57 37.72 24.39 43.29 29.94 37.72 35.49 43.48 41.31 59.58 29.94 43.48 18.57"/>
<polygon class="a" points="30.12 16.65 35.66 22.22 41.48 16.46 30.12 0.36 18.75 16.46 24.57 22.22 30.12 16.65"/>
<rect class="a" x="23.51" y="23.29" width="13.14" height="13.14" transform="translate(-12.3 30.02) rotate(-45)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 808 B

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 27 KiB

@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" width="357" height="319">
<path fill="#FFF" fill-rule="evenodd" d="M178.5 148.625c98.583 0 178.5 38.14 178.5 85.187C357 280.86 277.083 319 178.5 319S0 280.86 0 233.812c0-47.047 79.917-85.187 178.5-85.187z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M198.726 152.391l11.347-2.833 16.186 16.115-11.503 3.122-16.03-16.404zm29.411 43.278l-10.899 2.702-8.093-8.057 10.606-2.859 8.386 8.214z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M228.908 155.202l-8.522-8.66 3.39-10.445 10.899-2.702-5.767 21.807zm-29.889-2.654l8.416-32.279 11.054-2.99-8.572 32.567-10.898 2.702zm27.103 12.681l-6.234 22.671-10.743 2.414 6.06-21.651 10.917-3.434z"/>
<path fill="#CAADFF" fill-rule="evenodd" d="M220.044 187.612l5.922-22.095-16.049-15.671 8.728-32.855 7.8 7.901-5.474 21.964 7.957 7.613 5.747-21.074 8.249 7.769-14.787 54.505-8.093-8.057z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M73.617 158.33l9.164-5.341-27.731-20.715-9.358 6.068 27.925 19.988z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M58.09 74.571l-10.08 5.874-2.318 57.897 9.885-5.146 2.513-58.625z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M62.667 92.186l15.879 4.267-4.668 17.472-15.88-4.267 4.669-17.472z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M74.492 100.045l-10.08 5.875-1.34 33.971 9.885-5.146 1.535-34.7z"/>
<path fill="#CAADFF" fill-rule="evenodd" d="M82.585 152.703l-10.417-7.341-6.51-4.588-10.417-7.341 1.641-45.557.486-13.499 16.927 11.929 10.417 7.34-2.127 59.057zM67.298 95.216l-1.154 32.06 6.51 4.587 1.155-32.059-6.511-4.588z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M246.418 40.027l-1.29-22.053 9.75-6.77 1.153 22.802-9.613 6.021zm-18.185-10.632l9.557-6.695 1.38 36.025-9.425 5.952-1.512-35.282zm-1.23-22.611l9.749-6.77.404 13.789-9.613 6.021-.54-13.04z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M238.161 46.997l.028-11.719 27.257 15.921-8.658 6.118-18.627-10.32zM227.525 19.61l8.791-6.864 27.256 15.921-8.658 6.118-27.389-15.175zm40.394 56.573l-8.689 6.086-29.485-17.592 8.823-6.827 29.351 18.333z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M245.467 28.613l8.588-5.56 1.174 14.126-8.588 5.56-1.174-14.126z"/>
<path fill="#CAADFF" fill-rule="evenodd" d="M267.066 62.421l.635 13.493-28.846-16.924-.135-2.873-.017-.012-.126-3.026-.357-7.582.042.025-.802-19.273.011.006-.17-3.623 17.082 9.963-.408-8.935-17.008-10.225-.641-13.41 28.064 16.873.035.731.04.019.255 6.139.311 6.521-.042-.026.376 9.072-.026.011.592 12.648-17.001-9.916.435 9.939 17.701 10.385z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M97.535 45.483l-.716 7.065L112.06 69.08l.716-7.065-15.241-16.532zM120.006 70.246l-.716 7.065 15.848 17.058 1.006-6.784-16.138-17.339zM121.259 41.213l-.716 7.065 14.459 16.461 1.498-6.994-15.241-16.532zM143.73 65.975l-1.108 7.03 16.275 16.704.971-6.394-16.138-17.34z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M112.434 62.656l-.558 6.288 8.201 2.634 3.577-6.328-11.22-2.594zM170.179 87.515l-11.647 1.874 1.084-6.712 11.937-1.586-1.374 6.424zm-35.163 6.622l1.119-7.102 11.153-1.656-.981 6.459-11.291 2.299zm-2.255-19.512l-4.539-7.408 15.81-1.337-1.053 7.239-10.218 1.506z"/>
<path fill="#CAADFF" fill-rule="evenodd" d="M171.662 81.195l-11.978 2.184-15.649-17.091-11.977 2.184 15.649 17.091-11.977 2.184-15.649-17.091 2.411-4.998-9.565-2.815-15.65-17.091 11.977-2.184 15.65 17.091 11.977-2.184-15.65-17.091 11.977-2.184 15.65 17.091-2.412 4.998 9.566 2.815 15.65 17.091z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M120.264 210.586l11.091-10.907 3.852 14.415L124.116 225l-3.852-14.414z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M120.269 210.605l-15.04-3.873 3.846 14.395L124.116 225l-3.847-14.395z"/>
<path fill="#CAADFF" fill-rule="evenodd" d="M116.414 196.175l14.985 3.694-11.136 10.713-14.985-3.694 11.136-10.713z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M30.636 25.199l8.023-8.735 3.53 11.003-8.024 8.735-3.529-11.003z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M30.64 25.214l-11.643-2.548 3.525 10.989 11.643 2.547-3.525-10.988z"/>
<path fill="#CAADFF" fill-rule="evenodd" d="M27.107 14.199l11.593 2.41-8.065 8.587-11.594-2.41 8.066-8.587z"/>
<path fill="#9F68FF" fill-rule="evenodd" d="M322.446 95.746l20.542-5.304-5.259 19.683-20.542 5.304 5.259-19.683z"/>
<path fill="#7441CC" fill-rule="evenodd" d="M322.439 95.772L307.29 80.894l-5.252 19.657 15.149 14.878 5.252-19.657z"/>
<path fill="#CAADFF" fill-rule="evenodd" d="M327.704 76.069l15.206 14.628-20.462 5.044-15.206-14.628 20.462-5.044z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save