Merge branch 'ab-refetch-null-value-token-balances' of github.com:poanetwork/blockscout into ab-refetch-null-value-token-balances

pull/2704/head
Victor Baranov 5 years ago
commit f98f19f7b9
  1. 252
      .circleci/config.yml
  2. 3
      .dialyzer-ignore
  3. 100
      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. 4
      apps/block_scout_web/assets/css/_layout.scss
  9. 2
      apps/block_scout_web/assets/css/_typography.scss
  10. 6
      apps/block_scout_web/assets/css/app.scss
  11. 4
      apps/block_scout_web/assets/css/components/_address-overview.scss
  12. 6
      apps/block_scout_web/assets/css/components/_btn_contract.scss
  13. 10
      apps/block_scout_web/assets/css/components/_card.scss
  14. 51
      apps/block_scout_web/assets/css/components/_custom_tooltips_block_details.scss
  15. 4
      apps/block_scout_web/assets/css/components/_dashboard-banner.scss
  16. 10
      apps/block_scout_web/assets/css/components/_erc721_token_image_container.scss
  17. 10
      apps/block_scout_web/assets/css/components/_inventory_token_instance_image_container.scss
  18. 137
      apps/block_scout_web/assets/css/components/_navbar.scss
  19. 1
      apps/block_scout_web/assets/css/components/_tooltip.scss
  20. 1
      apps/block_scout_web/assets/css/non-critical.scss
  21. 4
      apps/block_scout_web/assets/css/theme/_base_variables.scss
  22. 59
      apps/block_scout_web/assets/css/theme/_dai_variables.scss
  23. 45
      apps/block_scout_web/assets/css/theme/_dark-theme.scss
  24. 2
      apps/block_scout_web/assets/css/theme/_ether1_variables.scss
  25. 1
      apps/block_scout_web/assets/css/theme/_ethereum_classic_variables.scss
  26. 1
      apps/block_scout_web/assets/css/theme/_ethereum_variables.scss
  27. 1
      apps/block_scout_web/assets/css/theme/_goerli_variables.scss
  28. 1
      apps/block_scout_web/assets/css/theme/_kovan_variables.scss
  29. 3
      apps/block_scout_web/assets/css/theme/_lukso_variables.scss
  30. 1
      apps/block_scout_web/assets/css/theme/_poa_variables.scss
  31. 1
      apps/block_scout_web/assets/css/theme/_rinkeby_variables.scss
  32. 1
      apps/block_scout_web/assets/css/theme/_ropsten_variables.scss
  33. 2
      apps/block_scout_web/assets/css/theme/_rsk_variables.scss
  34. 2
      apps/block_scout_web/assets/css/theme/_social_variables.scss
  35. 2
      apps/block_scout_web/assets/css/theme/_sokol_variables.scss
  36. 1
      apps/block_scout_web/assets/css/theme/_tomochain_variables.scss
  37. 7
      apps/block_scout_web/assets/js/app.js
  38. 28
      apps/block_scout_web/assets/js/lib/async_listing_load.js
  39. 29
      apps/block_scout_web/assets/js/lib/awesomplete-util.js
  40. 2
      apps/block_scout_web/assets/js/lib/card_tabs.js
  41. 2
      apps/block_scout_web/assets/js/lib/clipboard_buttons.js
  42. 4
      apps/block_scout_web/assets/js/lib/coin_balance_history_chart.js
  43. 3
      apps/block_scout_web/assets/js/lib/currency.js
  44. 2
      apps/block_scout_web/assets/js/lib/indexing.js
  45. 13
      apps/block_scout_web/assets/js/lib/market_history_chart.js
  46. 2
      apps/block_scout_web/assets/js/lib/modals.js
  47. 18
      apps/block_scout_web/assets/js/lib/network_selector.js
  48. 4
      apps/block_scout_web/assets/js/lib/pretty_json.js
  49. 6
      apps/block_scout_web/assets/js/lib/try_api.js
  50. 46
      apps/block_scout_web/assets/js/pages/address.js
  51. 2
      apps/block_scout_web/assets/js/pages/address/coin_balances.js
  52. 4
      apps/block_scout_web/assets/js/pages/address/internal_transactions.js
  53. 18
      apps/block_scout_web/assets/js/pages/address/logs.js
  54. 4
      apps/block_scout_web/assets/js/pages/address/transactions.js
  55. 2
      apps/block_scout_web/assets/js/pages/blocks.js
  56. 26
      apps/block_scout_web/assets/js/pages/chain.js
  57. 9
      apps/block_scout_web/assets/js/pages/dark-mode-switcher.js
  58. 37
      apps/block_scout_web/assets/js/pages/layout.js
  59. 4
      apps/block_scout_web/assets/js/pages/pending_transactions.js
  60. 87
      apps/block_scout_web/assets/js/pages/token_counters.js
  61. 2
      apps/block_scout_web/assets/js/pages/transaction.js
  62. 2
      apps/block_scout_web/assets/js/pages/transactions.js
  63. 12
      apps/block_scout_web/assets/js/pages/verification_form.js
  64. 6
      apps/block_scout_web/assets/js/socket.js
  65. 15281
      apps/block_scout_web/assets/package-lock.json
  66. 63
      apps/block_scout_web/assets/package.json
  67. BIN
      apps/block_scout_web/assets/static/android-chrome-192x192.png
  68. BIN
      apps/block_scout_web/assets/static/android-chrome-512x512.png
  69. BIN
      apps/block_scout_web/assets/static/favicon-16x16.png
  70. BIN
      apps/block_scout_web/assets/static/favicon-32x32.png
  71. 21
      apps/block_scout_web/assets/static/images/average_time.svg
  72. 4
      apps/block_scout_web/assets/static/images/block.svg
  73. 66
      apps/block_scout_web/assets/static/images/blockscout_logo.svg
  74. 24
      apps/block_scout_web/assets/static/images/callisto_logo.svg
  75. 5
      apps/block_scout_web/assets/static/images/classic_ethereum_logo.svg
  76. 2
      apps/block_scout_web/assets/static/images/classic_logo.svg
  77. 1
      apps/block_scout_web/assets/static/images/controller.svg
  78. 13
      apps/block_scout_web/assets/static/images/cube.svg
  79. 6
      apps/block_scout_web/assets/static/images/dai_logo.svg
  80. 18
      apps/block_scout_web/assets/static/images/ellaism_logo.svg
  81. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-block-not-found.png
  82. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-block-not-found@2x.png
  83. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-page-not-found.png
  84. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-page-not-found@2x.png
  85. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-tx-not-found.png
  86. BIN
      apps/block_scout_web/assets/static/images/errors-img/etc-tx-not-found@2x.png
  87. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-block-not-found.png
  88. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-block-not-found@2x.png
  89. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-page-not-found.png
  90. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-page-not-found@2x.png
  91. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-tx-not-found.png
  92. BIN
      apps/block_scout_web/assets/static/images/errors-img/eth-tx-not-found@2x.png
  93. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-block-not-found.png
  94. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-block-not-found@2x.png
  95. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-page-not-found.png
  96. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-page-not-found@2x.png
  97. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-tx-not-found.png
  98. BIN
      apps/block_scout_web/assets/static/images/errors-img/goerli-tx-not-found@2x.png
  99. BIN
      apps/block_scout_web/assets/static/images/errors-img/koan-block-not-found@2x.png
  100. BIN
      apps/block_scout_web/assets/static/images/errors-img/kovan-block-not-found.png
  101. Some files were not shown because too many files have changed in this diff Show More

@ -33,9 +33,9 @@ jobs:
- restore_cache:
keys:
- v7-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.lock" }}
- v7-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.exs" }}
- v7-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}
- v8-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.lock" }}
- v8-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.exs" }}
- v8-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}
- run: mix deps.get
@ -83,17 +83,17 @@ jobs:
# `deps` needs to be cached with `_build` because `_build` will symlink into `deps`
- save_cache:
key: v7-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.lock" }}
key: v8-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.lock" }}
paths:
- deps
- _build
- save_cache:
key: v7-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.exs" }}
key: v8-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}-{{ checksum "mix.exs" }}
paths:
- deps
- _build
- save_cache:
key: v7-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}
key: v8-mix-compile-{{ checksum "OTP_VERSION.lock" }}-{{ checksum "ELIXIR_VERSION.lock" }}
paths:
- deps
- _build
@ -229,7 +229,7 @@ jobs:
eslint:
docker:
# Ensure .tool-versions matches
- image: circleci/node:9.10.1
- image: circleci/node:12.13.0-browsers-legacy
working_directory: ~/app
@ -271,7 +271,7 @@ jobs:
jest:
docker:
# Ensure .tool-versions matches
- image: circleci/node:9.10.1
- image: circleci/node:12.13.0-browsers-legacy
working_directory: ~/app
@ -333,114 +333,114 @@ jobs:
name: Scan block_scout_web for vulnerabilities
command: mix sobelow --config
working_directory: "apps/block_scout_web"
test_geth_http_websocket:
docker:
# Ensure .tool-versions matches
- image: circleci/elixir:1.9.1-node-browsers
environment:
MIX_ENV: test
# match POSTGRES_PASSWORD for postgres image below
PGPASSWORD: postgres
# match POSTGRES_USER for postgres image below
PGUSER: postgres
ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.HTTPWebSocket"
ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Geth"
- image: circleci/postgres:10.3-alpine
environment:
# Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database
POSTGRES_DB: explorer_test
# match PGPASSWORD for elixir image above
POSTGRES_PASSWORD: postgres
# match PGUSER for elixir image above
POSTGRES_USER: postgres
working_directory: ~/app
steps:
- attach_workspace:
at: .
- run:
command: ./bin/install_chrome_headless.sh
no_output_timeout: 2400
- run: mix local.hex --force
- run: mix local.rebar --force
- run:
name: Wait for DB
command: dockerize -wait tcp://localhost:5432 -timeout 1m
- run:
name: mix test --exclude no_geth
command: |
# Don't submit coverage report for forks, but let the build succeed
if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then
mix coveralls.html --exclude no_geth --parallel --umbrella
else
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
(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
- store_artifacts:
path: cover/excoveralls.html
- store_test_results:
path: _build/test/junit
test_geth_mox:
docker:
# Ensure .tool-versions matches
- image: circleci/elixir:1.9.1-node-browsers
environment:
MIX_ENV: test
# match POSTGRES_PASSWORD for postgres image below
PGPASSWORD: postgres
# match POSTGRES_USER for postgres image below
PGUSER: postgres
ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.Mox"
ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox"
- image: circleci/postgres:10.3-alpine
environment:
# Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database
POSTGRES_DB: explorer_test
# match PGPASSWORD for elixir image above
POSTGRES_PASSWORD: postgres
# match PGUSER for elixir image above
POSTGRES_USER: postgres
working_directory: ~/app
steps:
- attach_workspace:
at: .
- run:
command: ./bin/install_chrome_headless.sh
no_output_timeout: 2400
- run: mix local.hex --force
- run: mix local.rebar --force
- run:
name: Wait for DB
command: dockerize -wait tcp://localhost:5432 -timeout 1m
- run:
name: mix test --exclude no_geth
command: |
# Don't submit coverage report for forks, but let the build succeed
if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then
mix coveralls.html --exclude no_geth --parallel --umbrella
else
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
(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
- store_artifacts:
path: cover/excoveralls.html
- store_test_results:
path: _build/test/junit
# test_geth_http_websocket:
# docker:
# # Ensure .tool-versions matches
# - image: circleci/elixir:1.9.1-node-browsers
# environment:
# MIX_ENV: test
# # match POSTGRES_PASSWORD for postgres image below
# PGPASSWORD: postgres
# # match POSTGRES_USER for postgres image below
# PGUSER: postgres
# ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.HTTPWebSocket"
# ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Geth"
# - image: circleci/postgres:10.3-alpine
# environment:
# # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database
# POSTGRES_DB: explorer_test
# # match PGPASSWORD for elixir image above
# POSTGRES_PASSWORD: postgres
# # match PGUSER for elixir image above
# POSTGRES_USER: postgres
# working_directory: ~/app
# steps:
# - attach_workspace:
# at: .
# - run:
# command: ./bin/install_chrome_headless.sh
# no_output_timeout: 2400
# - run: mix local.hex --force
# - run: mix local.rebar --force
# - run:
# name: Wait for DB
# command: dockerize -wait tcp://localhost:5432 -timeout 1m
# - run:
# name: mix test --exclude no_geth
# command: |
# # Don't submit coverage report for forks, but let the build succeed
# if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then
# mix coveralls.html --exclude no_geth --parallel --umbrella
# else
# 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
# (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
# - store_artifacts:
# path: cover/excoveralls.html
# - store_test_results:
# path: _build/test/junit
# test_geth_mox:
# docker:
# # Ensure .tool-versions matches
# - image: circleci/elixir:1.9.1-node-browsers
# environment:
# MIX_ENV: test
# # match POSTGRES_PASSWORD for postgres image below
# PGPASSWORD: postgres
# # match POSTGRES_USER for postgres image below
# PGUSER: postgres
# ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Geth.Mox"
# ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox"
# - image: circleci/postgres:10.3-alpine
# environment:
# # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database
# POSTGRES_DB: explorer_test
# # match PGPASSWORD for elixir image above
# POSTGRES_PASSWORD: postgres
# # match PGUSER for elixir image above
# POSTGRES_USER: postgres
# working_directory: ~/app
# steps:
# - attach_workspace:
# at: .
# - run:
# command: ./bin/install_chrome_headless.sh
# no_output_timeout: 2400
# - run: mix local.hex --force
# - run: mix local.rebar --force
# - run:
# name: Wait for DB
# command: dockerize -wait tcp://localhost:5432 -timeout 1m
# - run:
# name: mix test --exclude no_geth
# command: |
# # Don't submit coverage report for forks, but let the build succeed
# if [[ -z "$COVERALLS_REPO_TOKEN" ]]; then
# mix coveralls.html --exclude no_geth --parallel --umbrella
# else
# 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
# (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
# - store_artifacts:
# path: cover/excoveralls.html
# - store_test_results:
# path: _build/test/junit
test_parity_http_websocket:
docker:
# Ensure .tool-versions matches
@ -573,8 +573,8 @@ workflows:
requires:
- test_parity_http_websocket
- test_parity_mox
- test_geth_http_websocket
- test_geth_mox
# - test_geth_http_websocket
# - test_geth_mox
- credo:
requires:
- build
@ -593,8 +593,8 @@ workflows:
- sobelow
- test_parity_http_websocket
- test_parity_mox
- test_geth_http_websocket
- test_geth_mox
# - test_geth_http_websocket
# - test_geth_mox
- dialyzer:
requires:
- build
@ -619,9 +619,9 @@ workflows:
- test_parity_mox:
requires:
- build
- test_geth_http_websocket:
requires:
- build
- test_geth_mox:
requires:
- build
# - test_geth_http_websocket:
# requires:
# - build
# - test_geth_mox:
# requires:
# - 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 test 5 == 'infinity' can never evaluate to 'true'
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,23 +1,119 @@
## Current
### 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
- [#2704](https://github.com/poanetwork/blockscout/pull/2704) - refetch null values in token balances
- [#2690](https://github.com/poanetwork/blockscout/pull/2690) - do not stich json rpc config into module for net version cache
### 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
- [#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
- [#2726](https://github.com/poanetwork/blockscout/pull/2726) - Remove internal_transaction block_number setting from blocks runner
- [#2717](https://github.com/poanetwork/blockscout/pull/2717) - Improve speed of nonconsensus data removal
- [#2679](https://github.com/poanetwork/blockscout/pull/2679) - added fixed height for card chain blocks and card chain transactions
- [#2678](https://github.com/poanetwork/blockscout/pull/2678) - fixed dashboard banner height bug
- [#2672](https://github.com/poanetwork/blockscout/pull/2672) - added new theme for xUSDT
- [#2667](https://github.com/poanetwork/blockscout/pull/2667) - Add ETS-based cache for accounts page
- [#2666](https://github.com/poanetwork/blockscout/pull/2666) - fetch token counters in parallel
- [#2665](https://github.com/poanetwork/blockscout/pull/2665) - new menu layout for mobile devices
- [#2663](https://github.com/poanetwork/blockscout/pull/2663) - Fetch address counters in parallel
- [#2642](https://github.com/poanetwork/blockscout/pull/2642) - add ERC721 coin instance page
- [#2762](https://github.com/poanetwork/blockscout/pull/2762) - on-fly fetching of token instances
- [#2470](https://github.com/poanetwork/blockscout/pull/2470) - Allow Realtime Fetcher to wait for small skips
### 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
- [#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
- [#2768](https://github.com/poanetwork/blockscout/pull/2768) - Remove nonconsensus blocks from cache after internal transactions importing
- [#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
- [#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
- [#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
- [#2745](https://github.com/poanetwork/blockscout/pull/2745) - optimize addresses page
- [#2742](https://github.com/poanetwork/blockscout/pull/2742) -
fixed menu hovers in dark mode desktop view
- [#2737](https://github.com/poanetwork/blockscout/pull/2737) - switched hardcoded subnetwork value to elixir expression for mobile menu
- [#2736](https://github.com/poanetwork/blockscout/pull/2736) - do not update cache if no blocks were inserted
- [#2731](https://github.com/poanetwork/blockscout/pull/2731) - fix library verification
- [#2718](https://github.com/poanetwork/blockscout/pull/2718) - Include all addresses taking part in transactions in wallets' addresses counter
- [#2709](https://github.com/poanetwork/blockscout/pull/2709) - Fix stuck label and value for uncle block height
- [#2707](https://github.com/poanetwork/blockscout/pull/2707) - fix for dashboard banner chart legend items
- [#2706](https://github.com/poanetwork/blockscout/pull/2706) - fix empty total_supply in coin gecko response
- [#2701](https://github.com/poanetwork/blockscout/pull/2701) - Exclude nonconsensus blocks from avg block time calculation by default
- [#2696](https://github.com/poanetwork/blockscout/pull/2696) - do not update fetched_coin_balance with nil
- [#2693](https://github.com/poanetwork/blockscout/pull/2693) - remove non consensus internal transactions
- [#2691](https://github.com/poanetwork/blockscout/pull/2691) - fix exchange rate websocket update for Rootstock
- [#2688](https://github.com/poanetwork/blockscout/pull/2688) - fix try it out section
- [#2687](https://github.com/poanetwork/blockscout/pull/2687) - remove non-consensus token transfers, logs when inserting new consensus blocks
- [#2684](https://github.com/poanetwork/blockscout/pull/2684) - do not filter pending logs
- [#2682](https://github.com/poanetwork/blockscout/pull/2682) - Use Task.start instead of Task.async in caches
- [#2671](https://github.com/poanetwork/blockscout/pull/2671) - fixed buttons color at smart contract section
- [#2691](https://github.com/poanetwork/blockscout/pull/2691) - fix exchange rate websocket update for Rootstock
- [#2704](https://github.com/poanetwork/blockscout/pull/2704) - refetch null values in token balances
- [#2660](https://github.com/poanetwork/blockscout/pull/2660) - set correct last value for coin balances chart data
- [#2619](https://github.com/poanetwork/blockscout/pull/2619) - Enforce DB transaction's order to prevent deadlocks
- [#2738](https://github.com/poanetwork/blockscout/pull/2738) - do not fail block `internal_transactions_indexed_at` field update
### 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
- [#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
- [#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
- [#2740](https://github.com/poanetwork/blockscout/pull/2740) - add verify contract rpc doc
## 2.0.4-beta

@ -2,7 +2,7 @@
## 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
@ -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".*
## Checklist for your PR
## Checklist for your Pull Request (PR)
<!--
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).
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
- [ ] 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.
- [ ] I checked whether I should update the docs and did so if necessary
- [ ] 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 add new indices into DB, I checked, that they don't redundant with PGHero or other tools
- [ ] 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 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 are not redundant with PGHero or other tools

@ -1,6 +1,6 @@
<p align="center">
<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>
</p>
@ -12,9 +12,9 @@
</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.
@ -22,39 +22,26 @@ You can also access the dev chatroom on our [Gitter Channel](https://gitter.im/p
## 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.
## Supported Projects
| **Hosted Mainnets** | **Hosted Testnets** | **Additional Chains using BlockScout** | **Additional Chains using BlockScout** |
|--------------------------------------------------------|-------------------------------------------------------|------------------------------------------------------|----------------------------------------------------------------|
| [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/) |
| [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/) |
| [Ethereum Mainnet](https://blockscout.com/eth/mainnet) | [LUKSO L14 Testnet](https://blockscout.com/lukso/l14) | [Kotti Testnet](https://kottiexplorer.ethernode.io/) | |
| [POA Core Network](https://blockscout.com/poa/core) | [POA Sokol Testnet](https://blockscout.com/poa/sokol) | [Fuse Network](https://explorer.fuse.io/) | |
| [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).
BlockScout supports a number of projects. Hosted instances include POA Network, xDai Chain, Ethereum Classic, Sokol & Kovan testnets, and other EVM chains.
- [List of hosted mainnets, testnets, and additional chains using BlockScout](https://docs.blockscout.com/for-projects/supported-projects)
- [Hosted instance versions](https://docs.blockscout.com/about/use-cases/hosted-blockscout)
## Getting Started
See the [project documentation](https://poanetwork.github.io/blockscout) for instructions:
- [Requirements](https://poanetwork.github.io/blockscout/#/requirements)
- [Ansible deployment](https://poanetwork.github.io/blockscout/#/ansible-deployment)
- [Manual deployment](https://poanetwork.github.io/blockscout/#/manual-deployment)
- [ENV variables](https://poanetwork.github.io/blockscout/#/env-variables)
- [Configuration options](https://poanetwork.github.io/blockscout/#/dev-env)
See the [project documentation](https://docs.blockscout.com/) for instructions:
- [Requirements](https://docs.blockscout.com/for-developers/information-and-settings/requirements)
- [Ansible deployment](https://docs.blockscout.com/for-developers/ansible-deployment)
- [Manual deployment](https://docs.blockscout.com/for-developers/manual-deployment)
- [ENV variables](https://docs.blockscout.com/for-developers/information-and-settings/env-variables)
- [Configuration options](https://docs.blockscout.com/for-developers/configuration-options)
## 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:
* 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 ..`
* 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: [
'env'
]
"presets": ["@babel/preset-env"]
}

@ -8,3 +8,7 @@
background-color: #fbfafc;
}
}
.logs-hash {
line-height: 24px !important;
}

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

@ -16,6 +16,7 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
// Bootstrap Core CSS
@import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins";
@import "theme/variables";
@ -60,7 +61,6 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
// Custom SCSS
@import "layout";
@import "typography";
@import "images-preload";
@import "code";
@import "helpers";
@import "elements";
@ -100,6 +100,7 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
@import "components/form";
@import "components/btn_copy";
@import "components/btn_qr";
@import "components/btn_contract";
@import "components/btn_address_card";
@import "components/btn_dropdown_line";
@import "components/transaction";
@ -109,11 +110,12 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
@import "components/log-search";
@import "components/radio";
@import "components/modal_variables";
@import "components/network-selector";
@import "components/new_smart_contract";
@import "components/radio_big";
@import "components/btn_no_border";
@import "components/custom_tooltips_block_details";
@import "components/_erc721_token_image_container";
@import "components/_inventory_token_instance_image_container";
@import "theme/dark-theme";

@ -79,4 +79,8 @@
&:last-child {
margin-bottom: 0;
}
}
.logs-decoded {
line-height: 25px!important;
}

@ -0,0 +1,6 @@
$btn-contract-color: $primary !default;
$btn-contract-dimensions: 31px !default;
.btn-contract-icon {
@include square-icon-button($btn-contract-color, $btn-contract-dimensions);
}

@ -34,7 +34,9 @@ $card-tab-icon-color-active: #fff !default;
.card-background-1 {
background-color: $card-background-1;
color: $card-background-1-text-color;
@include media-breakpoint-down(sm) {
margin-left: 15px;
}
a:not(.dropdown-item),
a:not(.dropdown-item):hover {
color: $card-background-1-text-color;
@ -249,3 +251,9 @@ $card-tab-icon-color-active: #fff !default;
}
}
}
.mob-transaction {
@include media-breakpoint-down(sm) {
margin-left: 15px!important;
}
}

@ -1,4 +1,5 @@
/* Custom Tooltips for Block Details Page */
$tooltip-background-color: $btn-line-color !default;
.tooltipCustom {
position: relative;
@ -8,23 +9,20 @@
.tooltipCustom .tooltiptextTopMiner {
visibility: hidden;
position: absolute;
width: 50%;
width: 100%;
background-color: white;
color: black;
color: $tooltip-background-color;
text-align: center;
border-radius: 6px;
left: 25%;
left: 0%;
bottom: 100%;
padding: 15px 0px;
padding: 15px;
display: inline-block;
z-index: 1;
font-family: Nunito;
margin-bottom: 15px;
opacity: 0;
transition: opacity 0.5s;
@include media-breakpoint-down(lg) {
left: 60%;
}
}
.tooltipCustom .tooltiptextTopMiner::after {
@ -43,44 +41,5 @@
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*/

@ -72,7 +72,7 @@ $dashboard-banner-chart-axis-font-color: $dashboard-stats-item-value-color !defa
}
.dashboard-banner-chart-legend {
display: flex;
display: grid;
grid-template-columns: 1fr 1fr;
padding-bottom: 12px;
@ -81,7 +81,7 @@ $dashboard-banner-chart-axis-font-color: $dashboard-stats-item-value-color !defa
padding-left: 12px;
padding-top: 3px;
position: relative;
padding-right: 60px;
padding-right: 12px;
@include media-breakpoint-down(md) {
display: flex;

@ -0,0 +1,10 @@
/* ERC721 image block */
.erc721-image {
display: flex;
justify-content: center;
}
.erc721-image img {
height: 150px;
}
/* ERC721 image block end */

@ -0,0 +1,10 @@
/* ERC721 image block */
.inventory-erc721-image {
display: flex;
justify-content: center;
}
.inventory-erc721-image img {
height: 50px;
}
/* ERC721 image block end */

@ -25,6 +25,7 @@ $navbar-logo-width: auto !default;
.navbar-nav {
.nav-link {
outline: none;
align-items: center;
color: $header-links-color;
display: flex;
@ -259,139 +260,3 @@ $navbar-logo-width: auto !default;
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;
color: $tooltip-color;
padding: 15px;
font-size: 12px;
}
.arrow::before {

@ -1,5 +1,6 @@
// Bootstrap Core CSS
@import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins";
@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.
// 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;
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas,
"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
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`

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

@ -234,7 +234,7 @@ $labels-dark: #8a8dba; // header nav, labels
}
}
.btn-copy-icon, .btn-qr-icon, .btn-address-card-icon {
.btn-copy-icon, .btn-qr-icon, .btn-address-card-icon .btn-contract-icon {
border-color: $dark-primary;
path {
fill: $dark-primary;
@ -504,7 +504,7 @@ $labels-dark: #8a8dba; // header nav, labels
border-top-color: darken($labels-dark, 30);
border-bottom-color: darken($labels-dark, 30);
}
// Form Controlls
.form-control {
background-color: $dark-light;
@ -749,7 +749,7 @@ $labels-dark: #8a8dba; // header nav, labels
color: #fff;
}
}
// alerts
.alert-link {
color: $labels-dark;
@ -786,41 +786,16 @@ $labels-dark: #8a8dba; // header nav, labels
}
.dark-theme-applied .dropdown-item {
background-color: $dark-light!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;
width: 100%;
background-color: #35335d!important;
}
.dark-theme-applied .dropdown-item:hover:before {
content: "|";
height: 50px;
width: 50%;
opacity: 1;
background: none;
right: 17%;
color: $dark-primary;
position: relative;
background-color: #3f426c !important;
}
.dark-theme-applied .navbar.navbar-primary .navbar-nav .nav-link:hover,
.dark-theme-applied .navbar.navbar-primary .navbar-nav .nav-link.activeLink,
.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 .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;
}
.dark-theme-applied .dropdown-item.active.header, .dark-theme-applied .dropdown-item.header:hover, .dark-theme-applied .dropdown-item.header:focus {
background-color: $dark-light !important;
}

@ -37,7 +37,7 @@ $btn-line-bg: #fff; // button bg
$btn-line-color: #4b021e; // button border and font color && hover bg color
$btn-copy-color: #4b021e; // btn copy
$btn-qr-color: #4b021e; // btn qr-code
$btn-contract-color: #4b021e;
//links & tile
.tile a { color: $tertiary !important; } // links color for badges
.tile-type-block {

@ -35,6 +35,7 @@ $btn-line-color: $tertiary; // button border and font color && hover bg color
$btn-copy-color: $tertiary; // btn copy
$btn-qr-color: $tertiary; // btn qr-code
$btn-address-card-icon-color: $tertiary; // btn address color
$btn-contract-color: $tertiary;
//links & tile
$tile-body-a-color: $tertiary;

@ -38,6 +38,7 @@ $btn-line-color: $secondary; // button border and font color && hover bg color
$btn-copy-color: $secondary; // btn copy
$btn-qr-color: $secondary; // btn qr-code
$btn-address-card-icon-color: $secondary; // btn address color
$btn-contract-color: $secondary;
//links & tile
$tile-body-a-color: $secondary;

@ -44,6 +44,7 @@ $btn-line-color: $sub-accent-color; // button border and font color && hover bg
$btn-copy-color: $sub-accent-color; // btn copy
$btn-qr-color: $sub-accent-color; // btn qr-code
$btn-address-card-icon-color: $sub-accent-color; // btn address color
$btn-contract-color: $sub-accent-color;
//links & tile
$tile-body-a-color: $sub-accent-color;

@ -39,6 +39,7 @@ $btn-line-color: $tertiary; // button border and font color && hover bg color
$btn-copy-color: $tertiary; // btn copy
$btn-qr-color: $tertiary; // btn qr-code
$btn-address-card-icon-color: $tertiary; // btn address color
$btn-contract-color: $tertiary;
//links & tile
$tile-body-a-color: $tertiary;

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

@ -41,6 +41,7 @@ $btn-line-color: $primary; // button border and font color && hover bg color
$btn-copy-color: $primary; // btn copy
$btn-qr-color: $primary; // btn qr-code
$btn-address-card-icon-color: $primary; // btn address color
$btn-contract-color: $primary;
//links & tile
$tile-body-a-color: $primary;

@ -38,6 +38,7 @@ $btn-line-color: $secondary; // button border and font color && hover bg color
$btn-copy-color: $secondary; // btn copy
$btn-qr-color: $secondary; // btn qr-code
$btn-address-card-icon-color: $secondary; // btn address color
$btn-contract-color: $secondary;
//links & tile
$tile-body-a-color: $secondary;

@ -38,6 +38,7 @@ $btn-line-color: $secondary; // button border and font color && hover bg color
$btn-copy-color: $secondary; // btn copy
$btn-qr-color: $secondary; // btn qr-code
$btn-address-card-icon-color: $secondary; // btn address color
$btn-contract-color: $secondary;
//links & tile
$tile-body-a-color: $secondary;

@ -39,7 +39,7 @@ $btn-line-color: $secondary; // button border and font color && hover bg color
$btn-copy-color: $secondary; // btn copy
$btn-qr-color: $secondary; // btn qr-code
$btn-address-card-icon-color: $secondary; // btn address color
$btn-contract-color: $secondary;
// card
$card-background-1: $secondary;
$card-tab-active: $secondary;

@ -5,4 +5,4 @@ $tertiary: #53a9ff;
$footer-background-color: $primary;
$footer-title-color: #fff;
$footer-text-color: #fff;
$footer-item-disc-color: $secondary;
$footer-item-disc-color: $secondary;

@ -50,7 +50,7 @@ $btn-line-color: $sub-accent-color; // button border and font color && hover bg
$btn-copy-color: $sub-accent-color; // btn copy
$btn-qr-color: $sub-accent-color; // btn qr-code
$btn-address-card-icon-color: $sub-accent-color; // btn address color
$btn-contract-color: $sub-accent-color;
//links & tile
$tile-body-a-color: $sub-accent-color;
$tile-type-block-color: $sub-accent-color;

@ -1,3 +1,4 @@
$primary: #211841;
$secondary: #f16950;
$tertiary: #8b84bc;
$btn-contract-color: $primary;

@ -20,9 +20,6 @@ import 'bootstrap'
import './locale'
// support of preload in Firefox
import '../node_modules/fg-loadcss/dist/cssrelpreload.min'
import './pages/address'
import './pages/address/coin_balances'
import './pages/address/transactions'
@ -34,10 +31,9 @@ import './pages/chain'
import './pages/pending_transactions'
import './pages/transaction'
import './pages/transactions'
import './pages/favorites'
import './pages/network-search'
import './pages/layout'
import './pages/verification_form'
import './pages/token_counters'
import './pages/dark-mode-switcher'
import './pages/admin/tasks.js'
@ -64,4 +60,3 @@ import './lib/modals'
import './lib/try_api'
import './lib/try_eth_api'
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)
return store
}
@ -280,20 +280,20 @@ function firstPageLoad (store) {
const $element = $('[data-async-listing]')
function loadItemsNext () {
const path = store.getState().nextPagePath
store.dispatch({type: 'START_REQUEST'})
$.getJSON(path, {type: 'JSON'})
.done(response => store.dispatch(Object.assign({type: 'ITEMS_FETCHED'}, humps.camelizeKeys(response))))
.fail(() => store.dispatch({type: 'REQUEST_ERROR'}))
.always(() => store.dispatch({type: 'FINISH_REQUEST'}))
store.dispatch({ type: 'START_REQUEST' })
$.getJSON(path, { type: 'JSON' })
.done(response => store.dispatch(Object.assign({ type: 'ITEMS_FETCHED' }, humps.camelizeKeys(response))))
.fail(() => store.dispatch({ type: 'REQUEST_ERROR' }))
.always(() => store.dispatch({ type: 'FINISH_REQUEST' }))
}
function loadItemsPrev () {
const path = store.getState().prevPagePath
store.dispatch({type: 'START_REQUEST'})
$.getJSON(path, {type: 'JSON'})
.done(response => store.dispatch(Object.assign({type: 'ITEMS_FETCHED'}, humps.camelizeKeys(response))))
.fail(() => store.dispatch({type: 'REQUEST_ERROR'}))
.always(() => store.dispatch({type: 'FINISH_REQUEST'}))
store.dispatch({ type: 'START_REQUEST' })
$.getJSON(path, { type: 'JSON' })
.done(response => store.dispatch(Object.assign({ type: 'ITEMS_FETCHED' }, humps.camelizeKeys(response))))
.fail(() => store.dispatch({ type: 'REQUEST_ERROR' }))
.always(() => store.dispatch({ type: 'FINISH_REQUEST' }))
}
loadItemsNext()
@ -305,14 +305,14 @@ function firstPageLoad (store) {
$element.on('click', '[data-next-page-button]', (event) => {
event.preventDefault()
loadItemsNext()
store.dispatch({type: 'NAVIGATE_TO_OLDER'})
store.dispatch({ type: 'NAVIGATE_TO_OLDER' })
event.stopImmediatePropagation()
})
$element.on('click', '[data-prev-page-button]', (event) => {
event.preventDefault()
loadItemsPrev()
store.dispatch({type: 'NAVIGATE_TO_NEWER'})
store.dispatch({ type: 'NAVIGATE_TO_NEWER' })
event.stopImmediatePropagation()
})
}
@ -320,6 +320,6 @@ function firstPageLoad (store) {
const $element = $('[data-async-load]')
if ($element.length) {
const store = createStore(asyncReducer)
connectElements({store, elements})
connectElements({ store, elements })
firstPageLoad(store)
}

@ -38,13 +38,13 @@ window.AwesompleteUtil = (function () {
var lv = Array.isArray(data)
? { label: data[0], value: data[1] }
: 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.
function _fire (target, name, detail) {
// $.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.
@ -74,7 +74,7 @@ window.AwesompleteUtil = (function () {
}
}
// 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,
// 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.
@ -222,7 +222,7 @@ window.AwesompleteUtil = (function () {
awe.utilprops.url,
awe.utilprops.urlEnd,
awe.utilprops.loadall ? '' : val,
_onLoad.bind({awe: awe, xhr: xhr, queryVal: val}),
_onLoad.bind({ awe: awe, xhr: xhr, queryVal: val }),
xhr
)
} else {
@ -401,15 +401,15 @@ window.AwesompleteUtil = (function () {
// for arrays at top and subtop level
if (level < 2 && prop) {
// 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 (label && (prop + '.').lastIndexOf(label + '.', 0) === 0) { result['label'] = result[prop] }
if (label && (prop + '.').lastIndexOf(label + '.', 0) === 0) { result.label = result[prop] }
}
if (level === 0) {
// 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.
if (value && !('value' in result)) { result['value'] = null }
if (label && !('label' in result)) { result['label'] = null }
if (value && !('value' in result)) { result.value = null }
if (label && !('label' in result)) { result.label = null }
}
return result
}
@ -506,17 +506,18 @@ window.AwesompleteUtil = (function () {
var boundOnKeydown = _onKeydown.bind(awe)
var boundOnInput = _onInput.bind(awe)
var boundSelect = _select.bind(awe)
var boundDetach = _detach.bind({awe: awe,
var boundDetach = _detach.bind({
awe: awe,
boundMatch: boundMatch,
boundOnInput: boundOnInput,
boundOnKeydown: boundOnKeydown,
boundSelect: boundSelect
})
var events = {
'keydown': boundOnKeydown,
'input': boundOnInput
keydown: boundOnKeydown,
input: boundOnInput
}
events['blur'] = events[_AWE_CLOSE] = events[_AWE_LOAD] = boundMatch
events.blur = events[_AWE_CLOSE] = events[_AWE_LOAD] = boundMatch
events[_AWE_SELECT] = boundSelect
$.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.
// dataField can be null.
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.
@ -585,7 +586,7 @@ window.AwesompleteUtil = (function () {
// Create function for combobox button (btnId) to toggle dropdown list.
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.

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

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

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

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

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

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

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

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

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

@ -55,10 +55,6 @@ function handleSuccess (query, xhr, clickedButton) {
clickedButton.prop('disabled', false)
}
function dropDomain (url) {
return new URL(url).pathname
}
// Show 'Try it out' UI for a module/action.
$('button[data-selector*="btn-try-api"]').click(event => {
const clickedButton = $(event.target)
@ -128,7 +124,7 @@ $('button[data-try-api-ui-button-type="execute"]').click(event => {
}
$.ajax({
url: dropDomain(composeRequestUrl(query)),
url: composeRequestUrl(query),
success: (_data, _status, xhr) => {
handleSuccess(query, xhr, clickedButton)
},

@ -18,7 +18,8 @@ export const initialState = {
balanceCard: null,
fetchedCoinBalanceBlockNumber: null,
transactionCount: null,
validationCount: null
validationCount: null,
countersFetched: false
}
export function reducer (state = initialState, action) {
@ -34,6 +35,13 @@ export function reducer (state = initialState, action) {
channelDisconnected: true
})
}
case 'COUNTERS_FETCHED': {
return Object.assign({}, state, {
transactionCount: action.transactionCount,
validationCount: action.validationCount,
countersFetched: true
})
}
case 'RECEIVED_NEW_BLOCK': {
if (state.channelDisconnected) return state
@ -81,13 +89,20 @@ const elements = {
return { transactionCount: numeral($el.text()).value() }
},
render ($el, state, oldState) {
if (oldState.transactionCount === state.transactionCount) return
$el.empty().append(numeral(state.transactionCount).format())
if (state.countersFetched && state.transactionCount) {
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"]': {
load ($el) {
return {fetchedCoinBalanceBlockNumber: numeral($el.text()).value()}
return { fetchedCoinBalanceBlockNumber: numeral($el.text()).value() }
},
render ($el, state, oldState) {
if (oldState.fetchedCoinBalanceBlockNumber === state.fetchedCoinBalanceBlockNumber) return
@ -99,12 +114,29 @@ const elements = {
return { validationCount: numeral($el.text()).value() }
},
render ($el, state, oldState) {
if (oldState.validationCount === state.validationCount) return
$el.empty().append(numeral(state.validationCount).format())
if (state.countersFetched && state.validationCount) {
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"]')
if ($addressDetailsPage.length) {
const store = createStore(reducer)
@ -149,4 +181,6 @@ if ($addressDetailsPage.length) {
type: 'RECEIVED_UPDATED_BALANCE',
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 addressHash = $('[data-page="address-details"]')[0].dataset.pageAddressHash
store.dispatch({type: 'PAGE_LOAD', addressHash})
store.dispatch({ type: 'PAGE_LOAD', addressHash })
connectElements({ store, elements })
const addressChannel = socket.channel(`addresses:${addressHash}`, {})

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

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

@ -32,12 +32,12 @@ export function reducer (state, action) {
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': {
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:
return state

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

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

@ -9,12 +9,3 @@ $('.dark-mode-changer').click(function () {
// reload each theme switch
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()
}
})
$(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')
connectElements({ store, elements })
const transactionsChannel = socket.channel(`transactions:new_transaction`)
const transactionsChannel = socket.channel('transactions:new_transaction')
transactionsChannel.join()
transactionsChannel.onError(() => store.dispatch({
type: 'CHANNEL_DISCONNECTED'
@ -118,7 +118,7 @@ if ($transactionPendingListPage.length) {
}), 1000)
})
const pendingTransactionsChannel = socket.channel(`transactions:new_pending_transaction`)
const pendingTransactionsChannel = socket.channel('transactions:new_pending_transaction')
pendingTransactionsChannel.join()
pendingTransactionsChannel.onError(() => store.dispatch({
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)
connectElements({ store, elements })
const blocksChannel = socket.channel(`blocks:new_block`, {})
const blocksChannel = socket.channel('blocks:new_block', {})
blocksChannel.join()
blocksChannel.on('new_block', (msg) => store.dispatch({
type: 'RECEIVED_NEW_BLOCK',

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

@ -67,7 +67,7 @@ const elements = {
})
$('.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) {
nextContractLibrary.addClass('active')
@ -121,6 +121,14 @@ if ($contractVerificationPage.length) {
$(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-contract-library-form-group').removeClass('active')
$('.js-contract-library-form-group').first().addClass('active')
@ -130,7 +138,7 @@ if ($contractVerificationPage.length) {
})
$('.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) {
nextContractLibrary.addClass('active')

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

File diff suppressed because it is too large Load Diff

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

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">
<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>
<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>

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">
<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>
<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>

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

@ -0,0 +1 @@
<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>

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">
<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>
<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>

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

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

Loading…
Cancel
Save