Resolve conflicts

pull/6582/head
POA 2 years ago
commit 5c7da095f9
  1. 6
      .github/workflows/e2e-tests.yml
  2. 24
      .github/workflows/publish-docker-image-every-push.yml
  3. 7
      CHANGELOG.md
  4. 3
      apps/block_scout_web/assets/js/lib/add_chain_to_mm.js
  5. 46
      apps/block_scout_web/assets/js/lib/analytics.js
  6. 2
      apps/block_scout_web/assets/js/lib/token_icon.js
  7. 159
      apps/block_scout_web/assets/js/pages/layout.js
  8. 41
      apps/block_scout_web/assets/js/pages/search-results/search.js
  9. 425
      apps/block_scout_web/assets/package-lock.json
  10. 12
      apps/block_scout_web/assets/package.json
  11. 1
      apps/block_scout_web/assets/static/images/icons/token_icon_default.svg
  12. 6
      apps/block_scout_web/assets/webpack.config.js
  13. 4
      apps/block_scout_web/config/config.exs
  14. 4
      apps/block_scout_web/lib/block_scout_web/csp_header.ex
  15. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/api_key/form.html.eex
  16. 4
      apps/block_scout_web/lib/block_scout_web/templates/account/api_key/index.html.eex
  17. 14
      apps/block_scout_web/lib/block_scout_web/templates/account/common/_nav.html.eex
  18. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/custom_abi/form.html.eex
  19. 4
      apps/block_scout_web/lib/block_scout_web/templates/account/custom_abi/index.html.eex
  20. 4
      apps/block_scout_web/lib/block_scout_web/templates/account/public_tags_request/form.html.eex
  21. 4
      apps/block_scout_web/lib/block_scout_web/templates/account/public_tags_request/index.html.eex
  22. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/tag_address/form.html.eex
  23. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/tag_address/index.html.eex
  24. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/tag_transaction/form.html.eex
  25. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/tag_transaction/index.html.eex
  26. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/watchlist/show.html.eex
  27. 2
      apps/block_scout_web/lib/block_scout_web/templates/account/watchlist_address/form.html.eex
  28. 2
      apps/block_scout_web/lib/block_scout_web/templates/api_docs/eth_rpc.html.eex
  29. 24
      apps/block_scout_web/lib/block_scout_web/templates/layout/_account_menu_item.html.eex
  30. 4
      apps/block_scout_web/lib/block_scout_web/templates/search/results.html.eex
  31. 2
      apps/block_scout_web/lib/block_scout_web/templates/tokens/_token_icon.html.eex
  32. 1
      apps/block_scout_web/lib/block_scout_web/templates/tokens/_token_icon_default.html.eex
  33. 20
      apps/block_scout_web/priv/gettext/default.pot
  34. 20
      apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po
  35. 5
      apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/receipt.ex
  36. 11
      apps/explorer/config/dev/arbitrum.exs
  37. 11
      apps/explorer/config/dev/besu.exs
  38. 11
      apps/explorer/config/dev/erigon.exs
  39. 11
      apps/explorer/config/dev/ganache.exs
  40. 11
      apps/explorer/config/dev/nethermind.exs
  41. 11
      apps/explorer/config/dev/rsk.exs
  42. 11
      apps/explorer/config/prod/arbitrum.exs
  43. 11
      apps/explorer/config/prod/besu.exs
  44. 11
      apps/explorer/config/prod/erigon.exs
  45. 11
      apps/explorer/config/prod/ganache.exs
  46. 11
      apps/explorer/config/prod/nethermind.exs
  47. 11
      apps/explorer/config/prod/rsk.exs
  48. 18
      apps/explorer/lib/explorer/chain/events/listener.ex
  49. 2
      apps/explorer/mix.exs
  50. 6
      apps/indexer/lib/indexer/block/fetcher.ex
  51. 6
      docker-compose/envs/common-blockscout.env
  52. 5
      docker/Dockerfile
  53. 12
      docker/Makefile
  54. 2
      mix.exs
  55. 8
      mix.lock

@ -1,8 +1,8 @@
name: Run E2E tests k8s name: Run E2E tests k8s
on: on:
# push: pull_request_review:
pull_request: types: [submitted]
workflow_dispatch: workflow_dispatch:
env: env:
@ -15,6 +15,7 @@ env:
jobs: jobs:
push_to_registry: push_to_registry:
if: github.event.review.state == 'approved'
name: Push Docker image to Docker Hub name: Push Docker image to Docker Hub
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs: outputs:
@ -76,6 +77,7 @@ jobs:
deploy_and_tests: deploy_and_tests:
needs: push_to_registry needs: push_to_registry
if: github.event.review.state == 'approved'
uses: blockscout/blockscout-ci-cd/.github/workflows/e2e_new.yaml@master uses: blockscout/blockscout-ci-cd/.github/workflows/e2e_new.yaml@master
with: with:
blockscoutImage: blockscout/blockscout:pr-${{ needs.push_to_registry.outputs.short-sha }} blockscoutImage: blockscout/blockscout:pr-${{ needs.push_to_registry.outputs.short-sha }}

@ -70,6 +70,30 @@ jobs:
DISABLE_BRIDGE_MARKET_CAP_UPDATER=false DISABLE_BRIDGE_MARKET_CAP_UPDATER=false
CACHE_BRIDGE_MARKET_CAP_UPDATE_INTERVAL= CACHE_BRIDGE_MARKET_CAP_UPDATE_INTERVAL=
SOCKET_ROOT= SOCKET_ROOT=
- name: Build and push Docker image for frontend
uses: docker/build-push-action@v3
with:
context: .
file: ./docker/Dockerfile
push: true
cache-from: type=registry,ref=blockscout/blockscout:buildcache
tags: blockscout/blockscout:frontend-main
build-args: |
CACHE_EXCHANGE_RATES_PERIOD=
DISABLE_READ_API=false
API_PATH=
NETWORK_PATH=
DISABLE_WEBAPP=false
DISABLE_WRITE_API=false
CACHE_ENABLE_TOTAL_GAS_USAGE_COUNTER=
WOBSERVER_ENABLED=false
ADMIN_PANEL_ENABLED=false
CACHE_ADDRESS_WITH_BALANCES_UPDATE_INTERVAL=
DISABLE_BRIDGE_MARKET_CAP_UPDATER=false
CACHE_BRIDGE_MARKET_CAP_UPDATE_INTERVAL=
SOCKET_ROOT=
SESSION_COOKIE_DOMAIN=${{ secrets.FRONTEND_MAIN }}
tests: tests:
needs: push_to_registry needs: push_to_registry
uses: blockscout/blockscout-ci-cd/.github/workflows/e2e_new.yaml@master uses: blockscout/blockscout-ci-cd/.github/workflows/e2e_new.yaml@master

@ -3,6 +3,8 @@
### Features ### Features
- [#6582](https://github.com/blockscout/blockscout/pull/6582) - Transaction actions indexer - [#6582](https://github.com/blockscout/blockscout/pull/6582) - Transaction actions indexer
- [#6542](https://github.com/blockscout/blockscout/pull/6542) - Init mixpanel and amplitude analytics
- [#6574](https://github.com/blockscout/blockscout/pull/6574), [#6601](https://github.com/blockscout/blockscout/pull/6601) - Allow and manage insecure HTTP connection to the archive node
- [#6433](https://github.com/blockscout/blockscout/pull/6433) - Update error pagess - [#6433](https://github.com/blockscout/blockscout/pull/6433) - Update error pagess
- [#6544](https://github.com/blockscout/blockscout/pull/6544) - API improvements - [#6544](https://github.com/blockscout/blockscout/pull/6544) - API improvements
- [#5561](https://github.com/blockscout/blockscout/pull/5561), [#6523](https://github.com/blockscout/blockscout/pull/6523), [#6549](https://github.com/blockscout/blockscout/pull/6549) - Improve working with contracts implementations - [#5561](https://github.com/blockscout/blockscout/pull/5561), [#6523](https://github.com/blockscout/blockscout/pull/6523), [#6549](https://github.com/blockscout/blockscout/pull/6549) - Improve working with contracts implementations
@ -34,6 +36,7 @@
### Fixes ### Fixes
- [#6603](https://github.com/blockscout/blockscout/pull/6603) - Add to MM button explorer URL fix
- [#6512](https://github.com/blockscout/blockscout/pull/6512) - Allow gasUsed in failed internal txs; Leave error field for staticcall - [#6512](https://github.com/blockscout/blockscout/pull/6512) - Allow gasUsed in failed internal txs; Leave error field for staticcall
- [#6532](https://github.com/blockscout/blockscout/pull/6532) - Fix index creation migration - [#6532](https://github.com/blockscout/blockscout/pull/6532) - Fix index creation migration
- [#6473](https://github.com/blockscout/blockscout/pull/6473) - Fix state changes for contract creation transactions - [#6473](https://github.com/blockscout/blockscout/pull/6473) - Fix state changes for contract creation transactions
@ -65,6 +68,10 @@
### Chore ### Chore
- [#6607](https://github.com/blockscout/blockscout/pull/6607) - Run e2e tests after PR review
- [#6606](https://github.com/blockscout/blockscout/pull/6606) - Add ARG SESSION_COOKIE_DOMAIN to Dockerfile
- [#6600](https://github.com/blockscout/blockscout/pull/6600) - Token stub icon
- [#6588](https://github.com/blockscout/blockscout/pull/6588) - Add latest image build for frontend-main with specific build-args
- [#6584](https://github.com/blockscout/blockscout/pull/6584) - Vacuum package-lock.json - [#6584](https://github.com/blockscout/blockscout/pull/6584) - Vacuum package-lock.json
- [#6581](https://github.com/blockscout/blockscout/pull/6581) - Dark mode switcher localStorage to cookie in order to support new UI - [#6581](https://github.com/blockscout/blockscout/pull/6581) - Dark mode switcher localStorage to cookie in order to support new UI
- [#6572](https://github.com/blockscout/blockscout/pull/6572) - pending_block_operations table: remove fetch_internal_transactions column - [#6572](https://github.com/blockscout/blockscout/pull/6572) - pending_block_operations table: remove fetch_internal_transactions column

@ -8,8 +8,9 @@ export async function addChainToMM ({ btn }) {
const coinName = document.getElementById('js-coin-name').value const coinName = document.getElementById('js-coin-name').value
const subNetwork = document.getElementById('js-subnetwork').value const subNetwork = document.getElementById('js-subnetwork').value
const jsonRPC = document.getElementById('js-json-rpc').value const jsonRPC = document.getElementById('js-json-rpc').value
const path = process.env.NETWORK_PATH || '/'
const blockscoutURL = location.protocol + '//' + location.host + process.env.NETWORK_PATH const blockscoutURL = location.protocol + '//' + location.host + path
if (chainIDFromWallet !== chainIDFromInstance) { if (chainIDFromWallet !== chainIDFromInstance) {
await window.ethereum.request({ await window.ethereum.request({
method: 'wallet_addEthereumChain', method: 'wallet_addEthereumChain',

@ -0,0 +1,46 @@
import mixpanel from 'mixpanel-browser'
import { init as amplitudeInit, track as amplitudeTrack } from '@amplitude/analytics-browser'
const mixpanelToken = process.env.MIXPANEL_TOKEN
const amplitudeApiKey = process.env.AMPLITUDE_API_KEY
let initialized = false
export let mixpanelInitialized = false
export let amplitudeInitialized = false
export function init () {
const mixpanelUrl = process.env.MIXPANEL_URL
const amplitudeUrl = process.env.AMPLITUDE_URL
if (mixpanelToken) {
if (mixpanelUrl) {
mixpanel.init(mixpanelToken, { api_host: mixpanelUrl })
} else {
mixpanel.init(mixpanelToken)
}
mixpanelInitialized = true
}
if (amplitudeApiKey) {
if (amplitudeUrl) {
amplitudeInit(amplitudeApiKey, { serverUrl: amplitudeUrl })
} else {
amplitudeInit(amplitudeApiKey)
}
amplitudeInitialized = true
}
initialized = true
}
export function trackEvent (eventName, eventProperties = {}) {
if (!initialized) {
init()
}
if (mixpanelInitialized) {
mixpanel.track(eventName, eventProperties)
}
if (amplitudeInitialized) {
amplitudeTrack(eventName, eventProperties)
}
}

@ -17,7 +17,7 @@ function getTokenIconUrl (chainID, addressHash) {
if (chainName) { if (chainName) {
return `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${chainName}/assets/${addressHash}/logo.png` return `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${chainName}/assets/${addressHash}/logo.png`
} else { } else {
return null return '/images/icons/token_icon_default.svg'
} }
} }

@ -1,5 +1,157 @@
import $ from 'jquery' import $ from 'jquery'
import { addChainToMM } from '../lib/add_chain_to_mm' import { addChainToMM } from '../lib/add_chain_to_mm'
import * as analytics from '../lib/analytics'
analytics.init()
const simpleEvents = {
'.profile-button': 'Profile click',
'.watchlist-button': 'Watch list click',
'.address-tags-button': 'Address tags click',
'.transaction-tags-button': 'Transaction tags click',
'.api-keys-button': 'API keys click',
'.custom-abi-button': 'Custom ABI click',
'.public-tags-button': 'Public tags click',
'.sign-out-button': 'Sign out click',
'.sign-in-button': 'Sign in click',
'.add-address-button': 'Add address to watch list click',
'.add-address-tag-button': 'Add address tag click',
'.add-transaction-tag-button': 'Add transaction tag click',
'.add-api-key-button': 'Add API key click',
'.add-custom-abi-button': 'Add custom ABI click',
'.add-public-tag-button': 'Request to add public tag click'
}
if (analytics.mixpanelInitialized || analytics.amplitudeInitialized) {
for (const elementClass in simpleEvents) {
$(elementClass).click((_event) => {
analytics.trackEvent(simpleEvents[elementClass])
})
}
}
$('.save-address-button').click((_event) => {
const eventProperties = {
address_hash: $('#watchlist_address_address_hash').val(),
private_tag: $('#watchlist_address_name').val(),
eth_incoming: $('#watchlist_address_watch_coin_input').prop('checked'),
eth_outgoing: $('#watchlist_address_watch_coin_output').prop('checked'),
erc_20_incoming: $('#watchlist_address_watch_erc_20_input').prop('checked'),
erc_20_outgoing: $('#watchlist_address_watch_erc_20_output').prop('checked'),
erc_721_1155_incoming: $('#watchlist_address_watch_erc_721_input').prop('checked'),
erc_721_1155_outgoing: $('#watchlist_address_watch_erc_721_output').prop('checked'),
email_notifications: $('#watchlist_address_notify_email').prop('checked')
}
const eventName = 'New address to watchlist completed'
analytics.trackEvent(eventName, eventProperties)
})
$('.save-address-tag-button').click((_event) => {
const eventName = 'Add address tag completed'
const eventProperties = {
address_hash: $('#tag_address_address_hash').val(),
private_tag: $('#tag_address_name').val()
}
analytics.trackEvent(eventName, eventProperties)
})
$('.save-transaction-tag-button').click((_event) => {
const eventName = 'Add transaction tag completed'
const eventProperties = {
address_hash: $('#tag_transaction_tx_hash').val(),
private_tag: $('#tag_transaction_name').val()
}
analytics.trackEvent(eventName, eventProperties)
})
$('.save-api-key-button').click((_event) => {
const eventName = 'Generate API key completed'
const eventProperties = {
application_name: $('#key_name').val()
}
analytics.trackEvent(eventName, eventProperties)
})
$('.save-custom-abi-button').click((_event) => {
const eventName = 'Custom ABI completed'
const eventProperties = {
smart_contract_address: $('#custom_abi_address_hash').val(),
project_name: $('#custom_abi_name').val(),
custom_abi: $('#custom_abi_abi').val()
}
analytics.trackEvent(eventName, eventProperties)
})
$('.send-public-tag-request-button').click((_event) => {
const eventName = 'Request a public tag completed'
const eventProperties = {
name: $('#public_tags_request_full_name').val(),
email: $('#public_tags_request_email').val(),
company_name: $('#public_tags_request_company').val(),
company_website: $('#public_tags_request_website').val(),
goal: $('#public_tags_request_is_owner_true').prop('checked') ? 'Add tags' : 'Incorrect public tag',
public_tag: $('#public_tags_request_tags').val(),
smart_contracts: $('*[id=public_tags_request_addresses]').map((_i, el) => {
return el.value
}).get(),
reason: $('#public_tags_request_additional_comment').val()
}
analytics.trackEvent(eventName, eventProperties)
})
$(document).ready(() => {
let timer
const waitTime = 500
const observer = new MutationObserver((mutations) => {
if (mutations[0].target.hidden) {
return
}
const $results = $('li[id^="autoComplete_result_"]')
clearTimeout(timer)
timer = setTimeout(() => {
let eventName = 'Occurs searching according to substring at the nav bar'
let eventProperties = {
search: $('.main-search-autocomplete').val() || $('.main-search-autocomplete-mobile').val()
}
analytics.trackEvent(eventName, eventProperties)
eventName = 'Search list displays at the nav bar'
eventProperties = {
resultsNumber: $results.length,
results: $results.map((_i, el) => {
return el.children[1].innerText
})
}
analytics.trackEvent(eventName, eventProperties)
}, waitTime)
$results.click((event) => {
const eventName = 'Search item click at the nav bar'
const eventProperties = {
item: event.currentTarget.innerText
}
analytics.trackEvent(eventName, eventProperties)
})
})
observer.observe($('#autoComplete_list_1')[0], {
attributeFilter: ['hidden'],
childList: true
})
observer.observe($('#autoComplete_list_2')[0], {
attributeFilter: ['hidden']
})
})
$(document).click(function (event) { $(document).click(function (event) {
const clickover = $(event.target) const clickover = $(event.target)
@ -10,6 +162,13 @@ $(document).click(function (event) {
}) })
const search = (value) => { const search = (value) => {
const eventName = 'Occurs searching according to substring at the nav bar'
const eventProperties = {
search: value
}
analytics.trackEvent(eventName, eventProperties)
if (value) { if (value) {
window.location.href = `/search?q=${value}` window.location.href = `/search?q=${value}`
} }

@ -2,6 +2,7 @@ import $ from 'jquery'
import omit from 'lodash.omit' import omit from 'lodash.omit'
import humps from 'humps' import humps from 'humps'
import { createAsyncLoadStore } from '../../lib/async_listing_load' import { createAsyncLoadStore } from '../../lib/async_listing_load'
import * as analytics from '../../lib/analytics'
const $searchInput = $('.search-input') const $searchInput = $('.search-input')
@ -24,6 +25,10 @@ export function reducer (state, action) {
} }
if ($('[data-page="search-results"]').length) { if ($('[data-page="search-results"]').length) {
let searchTimer
let resultsTimer
const waitTime = 500
const store = createAsyncLoadStore(reducer, initialState, 'dataset.identifierHash') const store = createAsyncLoadStore(reducer, initialState, 'dataset.identifierHash')
store.dispatch({ store.dispatch({
@ -33,6 +38,15 @@ if ($('[data-page="search-results"]').length) {
$searchInput.on('input', (event) => { $searchInput.on('input', (event) => {
const value = $(event.target).val() const value = $(event.target).val()
clearTimeout(searchTimer)
searchTimer = setTimeout(() => {
const eventName = 'Occurs searching according to substring at the search page'
const eventProperties = {
search: value
}
analytics.trackEvent(eventName, eventProperties)
}, waitTime)
$('.js-search-results-query-display').text(value) $('.js-search-results-query-display').text(value)
const loc = window.location.pathname const loc = window.location.pathname
@ -47,7 +61,32 @@ if ($('[data-page="search-results"]').length) {
contentType: 'application/json; charset=utf-8' contentType: 'application/json; charset=utf-8'
}).done(response => store.dispatch(Object.assign({ type: 'ITEMS_FETCHED' }, humps.camelizeKeys(response)))) }).done(response => store.dispatch(Object.assign({ type: 'ITEMS_FETCHED' }, humps.camelizeKeys(response))))
.fail(() => store.dispatch({ type: 'REQUEST_ERROR' })) .fail(() => store.dispatch({ type: 'REQUEST_ERROR' }))
.always(() => store.dispatch({ type: 'FINISH_REQUEST' })) .always(() => {
const $results = $('#search_results_table_body tr')
$results.click((event) => {
console.log(event)
const eventName = 'Search item click at the search page'
const eventProperties = {
item: event.currentTarget.innerText
}
analytics.trackEvent(eventName, eventProperties)
event.stopImmediatePropagation()
})
clearTimeout(resultsTimer)
resultsTimer = setTimeout(() => {
const eventName = 'Search list displays at the search page'
const eventProperties = {
resultsNumber: $results.length,
results: $results.map((_i, el) => {
return el.innerText
})
}
analytics.trackEvent(eventName, eventProperties)
}, waitTime)
store.dispatch({ type: 'FINISH_REQUEST' })
})
} }
}) })
} }

@ -7,13 +7,14 @@
"name": "blockscout", "name": "blockscout",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@amplitude/analytics-browser": "^1.6.7",
"@fortawesome/fontawesome-free": "^6.2.1", "@fortawesome/fontawesome-free": "^6.2.1",
"@tarekraafat/autocomplete.js": "^10.2.7", "@tarekraafat/autocomplete.js": "^10.2.7",
"@walletconnect/web3-provider": "^1.8.0", "@walletconnect/web3-provider": "^1.8.0",
"assert": "^2.0.0", "assert": "^2.0.0",
"bignumber.js": "^9.1.1", "bignumber.js": "^9.1.1",
"bootstrap": "^4.6.0", "bootstrap": "^4.6.0",
"chart.js": "^4.0.1", "chart.js": "^4.1.1",
"chartjs-adapter-luxon": "^1.3.0", "chartjs-adapter-luxon": "^1.3.0",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"core-js": "^3.26.1", "core-js": "^3.26.1",
@ -23,7 +24,7 @@
"highlight.js": "^11.7.0", "highlight.js": "^11.7.0",
"https-browserify": "^1.0.0", "https-browserify": "^1.0.0",
"humps": "^2.0.1", "humps": "^2.0.1",
"jquery": "^3.6.2", "jquery": "^3.6.3",
"js-cookie": "^3.0.1", "js-cookie": "^3.0.1",
"lodash.debounce": "^4.0.8", "lodash.debounce": "^4.0.8",
"lodash.differenceby": "^4.8.0", "lodash.differenceby": "^4.8.0",
@ -45,6 +46,7 @@
"lodash.reduce": "^4.6.0", "lodash.reduce": "^4.6.0",
"luxon": "^3.1.1", "luxon": "^3.1.1",
"malihu-custom-scrollbar-plugin": "3.1.5", "malihu-custom-scrollbar-plugin": "3.1.5",
"mixpanel-browser": "^2.45.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"nanomorph": "^5.4.0", "nanomorph": "^5.4.0",
"numeral": "^2.0.6", "numeral": "^2.0.6",
@ -59,7 +61,7 @@
"redux": "^4.2.0", "redux": "^4.2.0",
"stream-browserify": "^3.0.0", "stream-browserify": "^3.0.0",
"stream-http": "^3.1.1", "stream-http": "^3.1.1",
"sweetalert2": "^11.6.15", "sweetalert2": "^11.6.16",
"urijs": "^1.19.11", "urijs": "^1.19.11",
"url": "^0.11.0", "url": "^0.11.0",
"util": "^0.12.5", "util": "^0.12.5",
@ -76,7 +78,7 @@
"copy-webpack-plugin": "^11.0.0", "copy-webpack-plugin": "^11.0.0",
"css-loader": "^5.2.7", "css-loader": "^5.2.7",
"css-minimizer-webpack-plugin": "^4.2.2", "css-minimizer-webpack-plugin": "^4.2.2",
"eslint": "^8.29.0", "eslint": "^8.30.0",
"eslint-config-standard": "^17.0.0", "eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
@ -87,7 +89,7 @@
"mini-css-extract-plugin": "^2.7.2", "mini-css-extract-plugin": "^2.7.2",
"postcss": "^8.4.20", "postcss": "^8.4.20",
"postcss-loader": "^7.0.2", "postcss-loader": "^7.0.2",
"sass": "^1.56.2", "sass": "^1.57.1",
"sass-loader": "^13.2.0", "sass-loader": "^13.2.0",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"webpack": "^5.75.0", "webpack": "^5.75.0",
@ -105,6 +107,84 @@
"../../../deps/phoenix_html": { "../../../deps/phoenix_html": {
"version": "3.0.4" "version": "3.0.4"
}, },
"node_modules/@amplitude/analytics-browser": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-browser/-/analytics-browser-1.6.7.tgz",
"integrity": "sha512-XbiSH01hMpNrS7ymv5u5GB5Fwk1EO2EgWV3SZ0ck3ajKQZQg1/Q1p0TggrB79pSG047xYIdVQjoD0XzAtPdOug==",
"dependencies": {
"@amplitude/analytics-client-common": "^0.5.1",
"@amplitude/analytics-core": "^0.11.1",
"@amplitude/analytics-types": "^0.14.0",
"@amplitude/ua-parser-js": "^0.7.31",
"tslib": "^2.4.1"
}
},
"node_modules/@amplitude/analytics-browser/node_modules/tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
},
"node_modules/@amplitude/analytics-client-common": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-client-common/-/analytics-client-common-0.5.1.tgz",
"integrity": "sha512-RmIRJ1JG7Kre1bNY6x+mSp/LjnWNZngwL50zI9DsLuYw5fOmHCzJHn1Ntte+rQDlQ7dTr3jMg1zeP6+76CMw2Q==",
"dependencies": {
"@amplitude/analytics-connector": "^1.4.5",
"@amplitude/analytics-core": "^0.11.1",
"@amplitude/analytics-types": "^0.14.0",
"tslib": "^2.4.1"
}
},
"node_modules/@amplitude/analytics-client-common/node_modules/tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
},
"node_modules/@amplitude/analytics-connector": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.6.tgz",
"integrity": "sha512-6jD2pOosRD4y8DT8StUCz7yTd5ZDkdOU9/AWnlWKM5qk90Mz7sdZrdZ9H7sA/L3yOJEpQOYZgQplQdWWUzyWug==",
"dependencies": {
"@amplitude/ua-parser-js": "0.7.31"
}
},
"node_modules/@amplitude/analytics-core": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-core/-/analytics-core-0.11.1.tgz",
"integrity": "sha512-G+GgYFwxhD5DjYDKuC6jRcsO/kqJw4hLTlJ0x2mwppxVuMqQ44wRvdQ1hhzMRY02AGnmr0OR1xDtft8CabiIag==",
"dependencies": {
"@amplitude/analytics-types": "^0.14.0",
"tslib": "^2.4.1"
}
},
"node_modules/@amplitude/analytics-core/node_modules/tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
},
"node_modules/@amplitude/analytics-types": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-0.14.0.tgz",
"integrity": "sha512-O3E/KHyWCb4HAlYevqgCzqQdS+0LhbJV2IeVGox2eyCge+/lGwtGdJV2rJNWcoGf3p+BhnbqJBlhkPMs12iniA=="
},
"node_modules/@amplitude/ua-parser-js": {
"version": "0.7.31",
"resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
"integrity": "sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/ua-parser-js"
},
{
"type": "paypal",
"url": "https://paypal.me/faisalman"
}
],
"engines": {
"node": "*"
}
},
"node_modules/@ampproject/remapping": { "node_modules/@ampproject/remapping": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@ -1809,15 +1889,15 @@
"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
}, },
"node_modules/@eslint/eslintrc": { "node_modules/@eslint/eslintrc": {
"version": "1.3.3", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz",
"integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
"debug": "^4.3.2", "debug": "^4.3.2",
"espree": "^9.4.0", "espree": "^9.4.0",
"globals": "^13.15.0", "globals": "^13.19.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
@ -1838,9 +1918,9 @@
"dev": true "dev": true
}, },
"node_modules/@eslint/eslintrc/node_modules/globals": { "node_modules/@eslint/eslintrc/node_modules/globals": {
"version": "13.17.0", "version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
@ -1864,18 +1944,6 @@
"js-yaml": "bin/js-yaml.js" "js-yaml": "bin/js-yaml.js"
} }
}, },
"node_modules/@eslint/eslintrc/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/@eslint/eslintrc/node_modules/type-fest": { "node_modules/@eslint/eslintrc/node_modules/type-fest": {
"version": "0.20.2", "version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@ -2290,14 +2358,14 @@
} }
}, },
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.6", "version": "0.11.8",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
"integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@humanwhocodes/object-schema": "^1.2.1", "@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1", "debug": "^4.1.1",
"minimatch": "^3.0.4" "minimatch": "^3.0.5"
}, },
"engines": { "engines": {
"node": ">=10.10.0" "node": ">=10.10.0"
@ -3134,6 +3202,11 @@
"@jridgewell/sourcemap-codec": "^1.4.10" "@jridgewell/sourcemap-codec": "^1.4.10"
} }
}, },
"node_modules/@kurkle/color": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.1.tgz",
"integrity": "sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw=="
},
"node_modules/@metamask/safe-event-emitter": { "node_modules/@metamask/safe-event-emitter": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz",
@ -5166,9 +5239,12 @@
} }
}, },
"node_modules/chart.js": { "node_modules/chart.js": {
"version": "4.0.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.0.1.tgz", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.1.1.tgz",
"integrity": "sha512-5/8/9eBivwBZK81mKvmIwTb2Pmw4D/5h1RK9fBWZLLZ8mCJ+kfYNmV9rMrGoa5Hgy2/wVDBMLSUDudul2/9ihA==", "integrity": "sha512-P0pCosNXp+LR8zO/QTkZKT6Hb7p0DPFtypEeVOf+6x06hX13NIb75R0DXUA4Ksx/+48chDQKtCCmRCviQRTqsA==",
"dependencies": {
"@kurkle/color": "^0.3.0"
},
"engines": { "engines": {
"pnpm": "^7.0.0" "pnpm": "^7.0.0"
} }
@ -6716,13 +6792,13 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.29.0", "version": "8.30.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz",
"integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint/eslintrc": "^1.3.3", "@eslint/eslintrc": "^1.4.0",
"@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/config-array": "^0.11.8",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0", "ajv": "^6.10.0",
@ -6741,7 +6817,7 @@
"file-entry-cache": "^6.0.1", "file-entry-cache": "^6.0.1",
"find-up": "^5.0.0", "find-up": "^5.0.0",
"glob-parent": "^6.0.2", "glob-parent": "^6.0.2",
"globals": "^13.15.0", "globals": "^13.19.0",
"grapheme-splitter": "^1.0.4", "grapheme-splitter": "^1.0.4",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.0.0", "import-fresh": "^3.0.0",
@ -6906,18 +6982,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/eslint-plugin-import/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/eslint-plugin-import/node_modules/ms": { "node_modules/eslint-plugin-import/node_modules/ms": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -6979,19 +7043,6 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/eslint-plugin-n/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"peer": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/eslint-plugin-n/node_modules/semver": { "node_modules/eslint-plugin-n/node_modules/semver": {
"version": "7.3.7", "version": "7.3.7",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
@ -7238,9 +7289,9 @@
} }
}, },
"node_modules/eslint/node_modules/globals": { "node_modules/eslint/node_modules/globals": {
"version": "13.15.0", "version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
@ -7288,18 +7339,6 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/eslint/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/eslint/node_modules/p-locate": { "node_modules/eslint/node_modules/p-locate": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
@ -7349,9 +7388,9 @@
} }
}, },
"node_modules/espree": { "node_modules/espree": {
"version": "9.4.0", "version": "9.4.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
"integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"acorn": "^8.8.0", "acorn": "^8.8.0",
@ -11357,9 +11396,9 @@
} }
}, },
"node_modules/jquery": { "node_modules/jquery": {
"version": "3.6.2", "version": "3.6.3",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.2.tgz", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
"integrity": "sha512-/e7ulNIEEYk1Z/l4X0vpxGt+B/dNsV8ghOPAWZaJs8pkGvsSC0tm33aMGylXcj/U7y4IcvwtMXPMyBFZn/gK9A==" "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg=="
}, },
"node_modules/jquery-mousewheel": { "node_modules/jquery-mousewheel": {
"version": "3.1.13", "version": "3.1.13",
@ -12305,9 +12344,9 @@
"integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
}, },
"node_modules/minimatch": { "node_modules/minimatch": {
"version": "3.0.8", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
@ -12321,6 +12360,11 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
}, },
"node_modules/mixpanel-browser": {
"version": "2.45.0",
"resolved": "https://registry.npmjs.org/mixpanel-browser/-/mixpanel-browser-2.45.0.tgz",
"integrity": "sha512-PQ1DaTk68yyYtLA0iejmzPA9iNDhT4uIZpqZjRTw7HWpYfl123fydHb2laKanaKjm8YDmrGGz3+xZ4Q6joogyg=="
},
"node_modules/mkdirp": { "node_modules/mkdirp": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@ -14429,9 +14473,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"node_modules/sass": { "node_modules/sass": {
"version": "1.56.2", "version": "1.57.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.56.2.tgz", "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
"integrity": "sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w==", "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"chokidar": ">=3.0.0 <4.0.0", "chokidar": ">=3.0.0 <4.0.0",
@ -15385,9 +15429,9 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
}, },
"node_modules/sweetalert2": { "node_modules/sweetalert2": {
"version": "11.6.15", "version": "11.6.16",
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.6.15.tgz", "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.6.16.tgz",
"integrity": "sha512-FqMy1gRGHEI5G145NE5XSP059TziCJu9Xf9/mkki/aKu5pLNcYzjggOzKO5Ex10EBgAGDXQ99jyGfYYzGCYXRQ==", "integrity": "sha512-T2FO8LptErsjE4r0WMfiSk4YbeUvPadNaUZ/cADMEOnws000znrf8zFX9S5e/spvzJDyRI5En73WQyDZhGypxQ==",
"funding": { "funding": {
"type": "individual", "type": "individual",
"url": "https://github.com/sponsors/limonte" "url": "https://github.com/sponsors/limonte"
@ -17014,6 +17058,77 @@
} }
}, },
"dependencies": { "dependencies": {
"@amplitude/analytics-browser": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-browser/-/analytics-browser-1.6.7.tgz",
"integrity": "sha512-XbiSH01hMpNrS7ymv5u5GB5Fwk1EO2EgWV3SZ0ck3ajKQZQg1/Q1p0TggrB79pSG047xYIdVQjoD0XzAtPdOug==",
"requires": {
"@amplitude/analytics-client-common": "^0.5.1",
"@amplitude/analytics-core": "^0.11.1",
"@amplitude/analytics-types": "^0.14.0",
"@amplitude/ua-parser-js": "^0.7.31",
"tslib": "^2.4.1"
},
"dependencies": {
"tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
}
}
},
"@amplitude/analytics-client-common": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-client-common/-/analytics-client-common-0.5.1.tgz",
"integrity": "sha512-RmIRJ1JG7Kre1bNY6x+mSp/LjnWNZngwL50zI9DsLuYw5fOmHCzJHn1Ntte+rQDlQ7dTr3jMg1zeP6+76CMw2Q==",
"requires": {
"@amplitude/analytics-connector": "^1.4.5",
"@amplitude/analytics-core": "^0.11.1",
"@amplitude/analytics-types": "^0.14.0",
"tslib": "^2.4.1"
},
"dependencies": {
"tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
}
}
},
"@amplitude/analytics-connector": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.4.6.tgz",
"integrity": "sha512-6jD2pOosRD4y8DT8StUCz7yTd5ZDkdOU9/AWnlWKM5qk90Mz7sdZrdZ9H7sA/L3yOJEpQOYZgQplQdWWUzyWug==",
"requires": {
"@amplitude/ua-parser-js": "0.7.31"
}
},
"@amplitude/analytics-core": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-core/-/analytics-core-0.11.1.tgz",
"integrity": "sha512-G+GgYFwxhD5DjYDKuC6jRcsO/kqJw4hLTlJ0x2mwppxVuMqQ44wRvdQ1hhzMRY02AGnmr0OR1xDtft8CabiIag==",
"requires": {
"@amplitude/analytics-types": "^0.14.0",
"tslib": "^2.4.1"
},
"dependencies": {
"tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
"integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
}
}
},
"@amplitude/analytics-types": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-0.14.0.tgz",
"integrity": "sha512-O3E/KHyWCb4HAlYevqgCzqQdS+0LhbJV2IeVGox2eyCge+/lGwtGdJV2rJNWcoGf3p+BhnbqJBlhkPMs12iniA=="
},
"@amplitude/ua-parser-js": {
"version": "0.7.31",
"resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz",
"integrity": "sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg=="
},
"@ampproject/remapping": { "@ampproject/remapping": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@ -18201,15 +18316,15 @@
"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
}, },
"@eslint/eslintrc": { "@eslint/eslintrc": {
"version": "1.3.3", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz",
"integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==",
"dev": true, "dev": true,
"requires": { "requires": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
"debug": "^4.3.2", "debug": "^4.3.2",
"espree": "^9.4.0", "espree": "^9.4.0",
"globals": "^13.15.0", "globals": "^13.19.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
@ -18224,9 +18339,9 @@
"dev": true "dev": true
}, },
"globals": { "globals": {
"version": "13.17.0", "version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
@ -18241,15 +18356,6 @@
"argparse": "^2.0.1" "argparse": "^2.0.1"
} }
}, },
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"type-fest": { "type-fest": {
"version": "0.20.2", "version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@ -18476,14 +18582,14 @@
"integrity": "sha512-viouXhegu/TjkvYQoiRZK3aax69dGXxgEjpvZW81wIJdxm5Fnvp3VVIP4VHKqX4SvFw6qpmkILkD4RJWAdrt7A==" "integrity": "sha512-viouXhegu/TjkvYQoiRZK3aax69dGXxgEjpvZW81wIJdxm5Fnvp3VVIP4VHKqX4SvFw6qpmkILkD4RJWAdrt7A=="
}, },
"@humanwhocodes/config-array": { "@humanwhocodes/config-array": {
"version": "0.11.6", "version": "0.11.8",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
"integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
"dev": true, "dev": true,
"requires": { "requires": {
"@humanwhocodes/object-schema": "^1.2.1", "@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1", "debug": "^4.1.1",
"minimatch": "^3.0.4" "minimatch": "^3.0.5"
} }
}, },
"@humanwhocodes/module-importer": { "@humanwhocodes/module-importer": {
@ -19116,6 +19222,11 @@
"@jridgewell/sourcemap-codec": "^1.4.10" "@jridgewell/sourcemap-codec": "^1.4.10"
} }
}, },
"@kurkle/color": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.1.tgz",
"integrity": "sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw=="
},
"@metamask/safe-event-emitter": { "@metamask/safe-event-emitter": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz",
@ -20774,9 +20885,12 @@
"dev": true "dev": true
}, },
"chart.js": { "chart.js": {
"version": "4.0.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.0.1.tgz", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.1.1.tgz",
"integrity": "sha512-5/8/9eBivwBZK81mKvmIwTb2Pmw4D/5h1RK9fBWZLLZ8mCJ+kfYNmV9rMrGoa5Hgy2/wVDBMLSUDudul2/9ihA==" "integrity": "sha512-P0pCosNXp+LR8zO/QTkZKT6Hb7p0DPFtypEeVOf+6x06hX13NIb75R0DXUA4Ksx/+48chDQKtCCmRCviQRTqsA==",
"requires": {
"@kurkle/color": "^0.3.0"
}
}, },
"chartjs-adapter-luxon": { "chartjs-adapter-luxon": {
"version": "1.3.0", "version": "1.3.0",
@ -21959,13 +22073,13 @@
} }
}, },
"eslint": { "eslint": {
"version": "8.29.0", "version": "8.30.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz",
"integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@eslint/eslintrc": "^1.3.3", "@eslint/eslintrc": "^1.4.0",
"@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/config-array": "^0.11.8",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0", "ajv": "^6.10.0",
@ -21984,7 +22098,7 @@
"file-entry-cache": "^6.0.1", "file-entry-cache": "^6.0.1",
"find-up": "^5.0.0", "find-up": "^5.0.0",
"glob-parent": "^6.0.2", "glob-parent": "^6.0.2",
"globals": "^13.15.0", "globals": "^13.19.0",
"grapheme-splitter": "^1.0.4", "grapheme-splitter": "^1.0.4",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.0.0", "import-fresh": "^3.0.0",
@ -22095,9 +22209,9 @@
} }
}, },
"globals": { "globals": {
"version": "13.15.0", "version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
@ -22127,15 +22241,6 @@
"p-locate": "^5.0.0" "p-locate": "^5.0.0"
} }
}, },
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"p-locate": { "p-locate": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
@ -22267,15 +22372,6 @@
"esutils": "^2.0.2" "esutils": "^2.0.2"
} }
}, },
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"ms": { "ms": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -22318,16 +22414,6 @@
"dev": true, "dev": true,
"peer": true "peer": true
}, },
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"peer": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"semver": { "semver": {
"version": "7.3.7", "version": "7.3.7",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
@ -22407,9 +22493,9 @@
"dev": true "dev": true
}, },
"espree": { "espree": {
"version": "9.4.0", "version": "9.4.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
"integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
"dev": true, "dev": true,
"requires": { "requires": {
"acorn": "^8.8.0", "acorn": "^8.8.0",
@ -25491,9 +25577,9 @@
} }
}, },
"jquery": { "jquery": {
"version": "3.6.2", "version": "3.6.3",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.2.tgz", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
"integrity": "sha512-/e7ulNIEEYk1Z/l4X0vpxGt+B/dNsV8ghOPAWZaJs8pkGvsSC0tm33aMGylXcj/U7y4IcvwtMXPMyBFZn/gK9A==" "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg=="
}, },
"jquery-mousewheel": { "jquery-mousewheel": {
"version": "3.1.13", "version": "3.1.13",
@ -26301,9 +26387,9 @@
"integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
}, },
"minimatch": { "minimatch": {
"version": "3.0.8", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true, "dev": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
@ -26314,6 +26400,11 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
}, },
"mixpanel-browser": {
"version": "2.45.0",
"resolved": "https://registry.npmjs.org/mixpanel-browser/-/mixpanel-browser-2.45.0.tgz",
"integrity": "sha512-PQ1DaTk68yyYtLA0iejmzPA9iNDhT4uIZpqZjRTw7HWpYfl123fydHb2laKanaKjm8YDmrGGz3+xZ4Q6joogyg=="
},
"mkdirp": { "mkdirp": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@ -27847,9 +27938,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
}, },
"sass": { "sass": {
"version": "1.56.2", "version": "1.57.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.56.2.tgz", "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
"integrity": "sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w==", "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
"dev": true, "dev": true,
"requires": { "requires": {
"chokidar": ">=3.0.0 <4.0.0", "chokidar": ">=3.0.0 <4.0.0",
@ -28542,9 +28633,9 @@
} }
}, },
"sweetalert2": { "sweetalert2": {
"version": "11.6.15", "version": "11.6.16",
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.6.15.tgz", "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.6.16.tgz",
"integrity": "sha512-FqMy1gRGHEI5G145NE5XSP059TziCJu9Xf9/mkki/aKu5pLNcYzjggOzKO5Ex10EBgAGDXQ99jyGfYYzGCYXRQ==" "integrity": "sha512-T2FO8LptErsjE4r0WMfiSk4YbeUvPadNaUZ/cADMEOnws000znrf8zFX9S5e/spvzJDyRI5En73WQyDZhGypxQ=="
}, },
"symbol-tree": { "symbol-tree": {
"version": "3.2.4", "version": "3.2.4",

@ -20,12 +20,13 @@
}, },
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^6.2.1", "@fortawesome/fontawesome-free": "^6.2.1",
"@amplitude/analytics-browser": "^1.6.7",
"@tarekraafat/autocomplete.js": "^10.2.7", "@tarekraafat/autocomplete.js": "^10.2.7",
"@walletconnect/web3-provider": "^1.8.0", "@walletconnect/web3-provider": "^1.8.0",
"assert": "^2.0.0", "assert": "^2.0.0",
"bignumber.js": "^9.1.1", "bignumber.js": "^9.1.1",
"bootstrap": "^4.6.0", "bootstrap": "^4.6.0",
"chart.js": "^4.0.1", "chart.js": "^4.1.1",
"chartjs-adapter-luxon": "^1.3.0", "chartjs-adapter-luxon": "^1.3.0",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"core-js": "^3.26.1", "core-js": "^3.26.1",
@ -35,7 +36,7 @@
"highlight.js": "^11.7.0", "highlight.js": "^11.7.0",
"https-browserify": "^1.0.0", "https-browserify": "^1.0.0",
"humps": "^2.0.1", "humps": "^2.0.1",
"jquery": "^3.6.2", "jquery": "^3.6.3",
"js-cookie": "^3.0.1", "js-cookie": "^3.0.1",
"lodash.debounce": "^4.0.8", "lodash.debounce": "^4.0.8",
"lodash.differenceby": "^4.8.0", "lodash.differenceby": "^4.8.0",
@ -57,6 +58,7 @@
"lodash.reduce": "^4.6.0", "lodash.reduce": "^4.6.0",
"luxon": "^3.1.1", "luxon": "^3.1.1",
"malihu-custom-scrollbar-plugin": "3.1.5", "malihu-custom-scrollbar-plugin": "3.1.5",
"mixpanel-browser": "^2.45.0",
"moment": "^2.29.4", "moment": "^2.29.4",
"nanomorph": "^5.4.0", "nanomorph": "^5.4.0",
"numeral": "^2.0.6", "numeral": "^2.0.6",
@ -71,7 +73,7 @@
"redux": "^4.2.0", "redux": "^4.2.0",
"stream-browserify": "^3.0.0", "stream-browserify": "^3.0.0",
"stream-http": "^3.1.1", "stream-http": "^3.1.1",
"sweetalert2": "^11.6.15", "sweetalert2": "^11.6.16",
"urijs": "^1.19.11", "urijs": "^1.19.11",
"url": "^0.11.0", "url": "^0.11.0",
"util": "^0.12.5", "util": "^0.12.5",
@ -88,7 +90,7 @@
"copy-webpack-plugin": "^11.0.0", "copy-webpack-plugin": "^11.0.0",
"css-loader": "^5.2.7", "css-loader": "^5.2.7",
"css-minimizer-webpack-plugin": "^4.2.2", "css-minimizer-webpack-plugin": "^4.2.2",
"eslint": "^8.29.0", "eslint": "^8.30.0",
"eslint-config-standard": "^17.0.0", "eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
@ -99,7 +101,7 @@
"mini-css-extract-plugin": "^2.7.2", "mini-css-extract-plugin": "^2.7.2",
"postcss": "^8.4.20", "postcss": "^8.4.20",
"postcss-loader": "^7.0.2", "postcss-loader": "^7.0.2",
"sass": "^1.56.2", "sass": "^1.57.1",
"sass-loader": "^13.2.0", "sass-loader": "^13.2.0",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"webpack": "^5.75.0", "webpack": "^5.75.0",

@ -0,0 +1 @@
<svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m0 0h24v24h-24z"/></clipPath><g clip-path="url(#a)"><rect fill="#e2e8f0" height="24" rx="8" width="24"/><path d="m7.22437 8.07626v-2.02841h9.55683v2.02841h-3.5625v9.60794h-2.4318v-9.60794z" fill="#a0aec0"/></g></svg>

After

Width:  |  Height:  |  Size: 380 B

@ -166,7 +166,11 @@ const appJs =
new ContextReplacementPlugin(/moment[\/\\]locale$/, /en/), new ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env.SOCKET_ROOT': JSON.stringify(process.env.SOCKET_ROOT), 'process.env.SOCKET_ROOT': JSON.stringify(process.env.SOCKET_ROOT),
'process.env.NETWORK_PATH': JSON.stringify(process.env.NETWORK_PATH) 'process.env.NETWORK_PATH': JSON.stringify(process.env.NETWORK_PATH),
'process.env.MIXPANEL_TOKEN': JSON.stringify(process.env.MIXPANEL_TOKEN),
'process.env.MIXPANEL_URL': JSON.stringify(process.env.MIXPANEL_URL),
'process.env.AMPLITUDE_API_KEY': JSON.stringify(process.env.AMPLITUDE_API_KEY),
'process.env.AMPLITUDE_URL': JSON.stringify(process.env.AMPLITUDE_URL)
}), }),
new webpack.ProvidePlugin({ new webpack.ProvidePlugin({
process: 'process/browser', process: 'process/browser',

@ -99,6 +99,10 @@ config :block_scout_web, BlockScoutWeb.ApiRouter,
config :block_scout_web, BlockScoutWeb.WebRouter, enabled: System.get_env("DISABLE_WEBAPP") != "true" config :block_scout_web, BlockScoutWeb.WebRouter, enabled: System.get_env("DISABLE_WEBAPP") != "true"
config :block_scout_web, BlockScoutWeb.CSPHeader,
mixpanel_url: System.get_env("MIXPANEL_URL", "https://api-js.mixpanel.com"),
amplitude_url: System.get_env("AMPLITUDE_URL", "https://api2.amplitude.com/2/httpapi")
# Configures Ueberauth local settings # Configures Ueberauth local settings
config :ueberauth, Ueberauth, config :ueberauth, Ueberauth,
providers: [ providers: [

@ -9,9 +9,11 @@ defmodule BlockScoutWeb.CSPHeader do
def init(opts), do: opts def init(opts), do: opts
def call(conn, _opts) do def call(conn, _opts) do
config = Application.get_env(:block_scout_web, __MODULE__)
Controller.put_secure_browser_headers(conn, %{ Controller.put_secure_browser_headers(conn, %{
"content-security-policy" => "\ "content-security-policy" => "\
connect-src 'self' #{websocket_endpoints(conn)} wss://*.bridge.walletconnect.org/ https://request-global.czilladx.com/ https://raw.githubusercontent.com/trustwallet/assets/ https://registry.walletconnect.org/data/wallets.json https://*.poa.network;\ connect-src 'self' #{config[:mixpanel_url]} #{config[:amplitude_url]} #{websocket_endpoints(conn)} wss://*.bridge.walletconnect.org/ https://request-global.czilladx.com/ https://raw.githubusercontent.com/trustwallet/assets/ https://registry.walletconnect.org/data/wallets.json https://*.poa.network;\
default-src 'self';\ default-src 'self';\
script-src 'self' 'unsafe-inline' 'unsafe-eval' https://coinzillatag.com https://www.google.com https://www.gstatic.com;\ script-src 'self' 'unsafe-inline' 'unsafe-eval' https://coinzillatag.com https://www.google.com https://www.gstatic.com;\
style-src 'self' 'unsafe-inline' 'unsafe-eval' https://fonts.googleapis.com;\ style-src 'self' 'unsafe-inline' 'unsafe-eval' https://fonts.googleapis.com;\

@ -23,7 +23,7 @@
<br> <br>
<div class="form-group float-right form-input"> <div class="form-group float-right form-input">
<a class="btn btn-line" href="<%= api_key_path(@conn, :index) %>"><%= gettext "Back to API keys (Cancel)"%></a> <a class="btn btn-line" href="<%= api_key_path(@conn, :index) %>"><%= gettext "Back to API keys (Cancel)"%></a>
<%= submit gettext("Save"), class: "button button-primary button-sm ml-3" %> <%= submit gettext("Save"), class: "save-api-key-button button button-primary button-sm ml-3" %>
</div> </div>
<% end %> <% end %>
</div> </div>

@ -41,11 +41,11 @@
</div> </div>
</div> </div>
<%= if Enum.count(@api_keys) < Key.get_max_api_keys_count() do %> <%= if Enum.count(@api_keys) < Key.get_max_api_keys_count() do %>
<a class="button button-primary button-sm" href="<%= api_key_path(@conn, :new) %>"><%= gettext "Add API key" %></a> <a class="add-api-key-button button button-primary button-sm" href="<%= api_key_path(@conn, :new) %>"><%= gettext "Add API key" %></a>
<% end %> <% end %>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script defer data-cfasync="false" src="<%= static_path(@conn, "/js/delete-item-handler.js") %>"></script> <script defer data-cfasync="false" src="<%= static_path(@conn, "/js/delete-item-handler.js") %>"></script>
</section> </section>

@ -1,25 +1,25 @@
<div class="col-2 mb-3 navbar-account"> <div class="col-2 mb-3 navbar-account">
<ul class="nav account flex-column nav-pills"> <ul class="nav account flex-column nav-pills">
<li class="nav-item account"> <li class="nav-item account">
<a class="<%= nav_class(@active_item, :profile) %>" aria-current="page" href="<%= auth_path(@conn, :profile) %>"><%= gettext "Profile" %></a> <a class="profile-button <%= nav_class(@active_item, :profile) %>" aria-current="page" href="<%= auth_path(@conn, :profile) %>"><%= gettext "Profile" %></a>
</li> </li>
<li class="nav-item account"> <li class="nav-item account">
<a class="<%= nav_class(@active_item, :watchlist) %>" href="<%= watchlist_path(@conn, :show) %>"><%= gettext "Watch list" %></a> <a class="watchlist-button <%= nav_class(@active_item, :watchlist) %>" href="<%= watchlist_path(@conn, :show) %>"><%= gettext "Watch list" %></a>
</li> </li>
<li class="nav-item account"> <li class="nav-item account">
<a class="<%= nav_class(@active_item, :address_tags) %>" href="<%= tag_address_path(@conn, :index) %>"><%= gettext "Address Tags" %></a> <a class="address-tags-button <%= nav_class(@active_item, :address_tags) %>" href="<%= tag_address_path(@conn, :index) %>"><%= gettext "Address Tags" %></a>
</li> </li>
<li class="nav-item account"> <li class="nav-item account">
<a class="<%= nav_class(@active_item, :transaction_tags) %>" href="<%= tag_transaction_path(@conn, :index) %>"><%= gettext "Transaction Tags" %></a> <a class="transaction-tags-button <%= nav_class(@active_item, :transaction_tags) %>" href="<%= tag_transaction_path(@conn, :index) %>"><%= gettext "Transaction Tags" %></a>
</li> </li>
<li class="nav-item account"> <li class="nav-item account">
<a class="<%= nav_class(@active_item, :api_keys) %>" href="<%= api_key_path(@conn, :index) %>"><%= gettext "API keys" %></a> <a class="api-keys-button <%= nav_class(@active_item, :api_keys) %>" href="<%= api_key_path(@conn, :index) %>"><%= gettext "API keys" %></a>
</li> </li>
<li class="nav-item account"> <li class="nav-item account">
<a class="<%= nav_class(@active_item, :custom_abis) %>" href="<%= custom_abi_path(@conn, :index) %>"><%= gettext "Custom ABI" %></a> <a class="custom-abi-button <%= nav_class(@active_item, :custom_abis) %>" href="<%= custom_abi_path(@conn, :index) %>"><%= gettext "Custom ABI" %></a>
</li> </li>
<li class="nav-item account"> <li class="nav-item account">
<a class="<%= nav_class(@active_item, :public_tags) %>" href="<%= public_tags_request_path(@conn, :index) %>"><%= gettext "Public tags" %></a> <a class="public-tags-button <%= nav_class(@active_item, :public_tags) %>" href="<%= public_tags_request_path(@conn, :index) %>"><%= gettext "Public tags" %></a>
</li> </li>
</ul> </ul>
</div> </div>

@ -28,7 +28,7 @@
<br> <br>
<div class="form-group float-right form-input"> <div class="form-group float-right form-input">
<a class="btn btn-line" href="<%= custom_abi_path(@conn, :index) %>"><%= gettext "Back to Custom ABI (Cancel)"%></a> <a class="btn btn-line" href="<%= custom_abi_path(@conn, :index) %>"><%= gettext "Back to Custom ABI (Cancel)"%></a>
<%= submit gettext("Save"), class: "button button-primary button-sm ml-3" %> <%= submit gettext("Save"), class: "save-custom-abi-button button button-primary button-sm ml-3" %>
</div> </div>
<% end %> <% end %>
</div> </div>

@ -41,11 +41,11 @@
</div> </div>
</div> </div>
<%= if Enum.count(@custom_abis) < CustomABI.get_max_custom_abis_count() do %> <%= if Enum.count(@custom_abis) < CustomABI.get_max_custom_abis_count() do %>
<a class="button button-primary button-sm" href="<%= custom_abi_path(@conn, :new) %>"><%= gettext "Add Custom ABI" %></a> <a class="add-custom-abi-button button button-primary button-sm" href="<%= custom_abi_path(@conn, :new) %>"><%= gettext "Add Custom ABI" %></a>
<% end %> <% end %>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script defer data-cfasync="false" src="<%= static_path(@conn, "/js/delete-item-handler.js") %>"></script> <script defer data-cfasync="false" src="<%= static_path(@conn, "/js/delete-item-handler.js") %>"></script>
</section> </section>

@ -60,7 +60,7 @@
<br> <br>
<div class="form-group float-left form-input"> <div class="form-group float-left form-input">
<a class="btn btn-line" href="<%= public_tags_request_path(@conn, :index) %>"><%= gettext "Cancel"%></a> <a class="btn btn-line" href="<%= public_tags_request_path(@conn, :index) %>"><%= gettext "Cancel"%></a>
<%= submit gettext("Send request"), class: "button button-primary button-sm ml-3" %> <%= submit gettext("Send request"), class: "send-public-tag-request-button button button-primary button-sm ml-3" %>
</div> </div>
<% end %> <% end %>
</div> </div>
@ -69,4 +69,4 @@
</div> </div>
</div> </div>
<script defer data-cfasync="false" src="<%= static_path(@conn, "/js/public-tags-request-form.js") %>"></script> <script defer data-cfasync="false" src="<%= static_path(@conn, "/js/public-tags-request-form.js") %>"></script>
</section> </section>

@ -34,11 +34,11 @@
</div> </div>
</div> </div>
<%= if Enum.count(@public_tags_requests) < PublicTagsRequest.get_max_public_tags_request_count() do %> <%= if Enum.count(@public_tags_requests) < PublicTagsRequest.get_max_public_tags_request_count() do %>
<a class="button button-primary button-sm" href="<%= public_tags_request_path(@conn, :new) %>"><%= gettext "Request to add public tag" %></a> <a class="add-public-tag-button button button-primary button-sm" href="<%= public_tags_request_path(@conn, :new) %>"><%= gettext "Request to add public tag" %></a>
<% end %> <% end %>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script defer data-cfasync="false" src="<%= static_path(@conn, "/js/delete-item-handler.js") %>"></script> <script defer data-cfasync="false" src="<%= static_path(@conn, "/js/delete-item-handler.js") %>"></script>
</section> </section>

@ -22,7 +22,7 @@
<div class="form-group float-right form-input"> <div class="form-group float-right form-input">
<a class="btn btn-line" href="<%= tag_address_path(@conn, :index) %>"><%= gettext "Back to Address Tags (Cancel)"%></a> <a class="btn btn-line" href="<%= tag_address_path(@conn, :index) %>"><%= gettext "Back to Address Tags (Cancel)"%></a>
<%= submit gettext("Save"), class: "button button-primary button-sm ml-3" %> <%= submit gettext("Save"), class: "save-address-tag-button button button-primary button-sm ml-3" %>
</div> </div>
<% end %> <% end %>
</div> </div>

@ -34,7 +34,7 @@
</div> </div>
</div> </div>
<%= if Enum.count(@address_tags) < TagAddress.get_max_tags_count() do %> <%= if Enum.count(@address_tags) < TagAddress.get_max_tags_count() do %>
<a class="button button-primary button-sm" href="<%= tag_address_path(@conn, :new) %>"><%= gettext "Add address tag" %></a> <a class="add-address-tag-button button button-primary button-sm" href="<%= tag_address_path(@conn, :new) %>"><%= gettext "Add address tag" %></a>
<% end %> <% end %>
</div> </div>
</div> </div>

@ -22,7 +22,7 @@
<div class="form-group float-right form-input"> <div class="form-group float-right form-input">
<a class="btn btn-line" href="<%= tag_transaction_path(@conn, :index) %>"><%= gettext "Back to Transaction Tags (Cancel)"%></a> <a class="btn btn-line" href="<%= tag_transaction_path(@conn, :index) %>"><%= gettext "Back to Transaction Tags (Cancel)"%></a>
<%= submit gettext("Save"), class: "button button-primary button-sm ml-3" %> <%= submit gettext("Save"), class: "save-transaction-tag-button button button-primary button-sm ml-3" %>
</div> </div>
<% end %> <% end %>
</div> </div>

@ -34,7 +34,7 @@
</div> </div>
</div> </div>
<%= if Enum.count(@tx_tags) < TagTransaction.get_max_tags_count() do %> <%= if Enum.count(@tx_tags) < TagTransaction.get_max_tags_count() do %>
<a class="button button-primary button-sm" href="<%= tag_transaction_path(@conn, :new) %>"><%= gettext "Add transaction tag" %></a> <a class="add-transaction-tag-button button button-primary button-sm" href="<%= tag_transaction_path(@conn, :new) %>"><%= gettext "Add transaction tag" %></a>
<% end %> <% end %>
</div> </div>
</div> </div>

@ -35,7 +35,7 @@
</div> </div>
</div> </div>
<%= if Enum.count(@watchlist.watchlist_addresses) < WatchlistAddress.get_max_watchlist_addresses_count() do %> <%= if Enum.count(@watchlist.watchlist_addresses) < WatchlistAddress.get_max_watchlist_addresses_count() do %>
<a class="button button-primary button-sm" href="<%= watchlist_address_path(@conn, :new) %>"><%= gettext "Add address" %></a> <a class="add-address-button button button-primary button-sm" href="<%= watchlist_address_path(@conn, :new) %>"><%= gettext "Add address" %></a>
<% end %> <% end %>
</div> </div>
</div> </div>

@ -80,7 +80,7 @@
<a class="btn btn-line" href="<%= watchlist_path(@conn, :show) %>"> <a class="btn btn-line" href="<%= watchlist_path(@conn, :show) %>">
<%= gettext "Back to Watch list (Cancel)" %> <%= gettext "Back to Watch list (Cancel)" %>
</a> </a>
<%= submit gettext("Save"), class: "button button-primary button-sm ml-3" %> <%= submit gettext("Save"), class: "#{if @method == :create, do: "save-address-button "}button button-primary button-sm ml-3" %>
</div> </div>
<% end %> <% end %>
</div> </div>

@ -1,7 +1,7 @@
<section class="container"> <section class="container">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<h1 class="card-title margin-bottom-sm"><%= gettext("ETH RPC API Documentation") %></h2> <h1 class="card-title margin-bottom-sm"><%= gettext("ETH RPC API Documentation") %></h1>
<p class="api-text-monospace" data-endpoint-url="<%= eth_rpc_api_url() %>">[ <%= gettext "Base URL:" %> <%= eth_rpc_api_url()%> ]</p> <p class="api-text-monospace" data-endpoint-url="<%= eth_rpc_api_url() %>">[ <%= gettext "Base URL:" %> <%= eth_rpc_api_url()%> ]</p>
<p class="card-subtitle margin-bottom-0"> <p class="card-subtitle margin-bottom-0">
<%= gettext "This API is provided to support some rpc methods in the exact format specified for ethereum nodes, which can be found " %> <%= gettext "This API is provided to support some rpc methods in the exact format specified for ethereum nodes, which can be found " %>

@ -8,26 +8,26 @@
</a> </a>
<div class="dropdown-menu" aria-labelledby="navbarBlocksDropdown"> <div class="dropdown-menu" aria-labelledby="navbarBlocksDropdown">
<div class="header dropdown-item"> <div class="header dropdown-item">
<%= "Signed in as " <> Plug.Conn.get_session(@conn, :current_user)[:nickname] %> <%= gettext("Signed in as ") <> Plug.Conn.get_session(@conn, :current_user)[:nickname] %>
</div> </div>
<a href="<%= auth_path(@conn, :profile) %>" class= "dropdown-item"><%= gettext "Profile" %></a> <a href="<%= auth_path(@conn, :profile) %>" class= "profile-button dropdown-item"><%= gettext "Profile" %></a>
<a href="<%= watchlist_path(@conn, :show) %>" class= "dropdown-item"><%= gettext "Watch list" %></a> <a href="<%= watchlist_path(@conn, :show) %>" class= "watchlist-button dropdown-item"><%= gettext "Watch list" %></a>
<a href="<%= tag_address_path(@conn, :index) %>" class= "dropdown-item"><%= gettext "Address Tags" %></a> <a href="<%= tag_address_path(@conn, :index) %>" class= "address-tags-button dropdown-item"><%= gettext "Address Tags" %></a>
<a href="<%= tag_transaction_path(@conn, :index) %>" class= "dropdown-item"><%= gettext "Transaction Tags" %></a> <a href="<%= tag_transaction_path(@conn, :index) %>" class= "transaction-tags-button dropdown-item"><%= gettext "Transaction Tags" %></a>
<a href="<%= api_key_path(@conn, :index) %>" class= "dropdown-item"><%= gettext "API keys" %></a> <a href="<%= api_key_path(@conn, :index) %>" class= "api-keys-button dropdown-item"><%= gettext "API keys" %></a>
<a href="<%= custom_abi_path(@conn, :index) %>" class= "dropdown-item"><%= gettext "Custom ABI" %></a> <a href="<%= custom_abi_path(@conn, :index) %>" class= "custom-abi-button dropdown-item"><%= gettext "Custom ABI" %></a>
<a href="<%= public_tags_request_path(@conn, :index) %>" class= "dropdown-item"><%= gettext "Public Tags" %></a> <a href="<%= public_tags_request_path(@conn, :index) %>" class= "public-tags-button dropdown-item"><%= gettext "Public Tags" %></a>
<a href="<%= BlockScoutWeb.LayoutView.sign_out_link %>" class= "dropdown-item"><%= gettext "Sign out" %></a> <a href="<%= BlockScoutWeb.LayoutView.sign_out_link %>" class= "sign-out-button dropdown-item"><%= gettext "Sign out" %></a>
</div> </div>
</li> </li>
<% else %> <% else %>
<li> <li>
<a class="nav-link topnav-nav-link" href="<%= BlockScoutWeb.LayoutView.sign_in_link %>" id="navbarBlocksDropdown" role="button" aria-haspopup="true"> <a class="sign-in-button nav-link topnav-nav-link" href="<%= BlockScoutWeb.LayoutView.sign_in_link %>" id="navbarBlocksDropdown" role="button" aria-haspopup="true">
<span class="nav-link-icon"> <span class="nav-link-icon">
<%= render BlockScoutWeb.IconsView, "_accounts_icon.html" %> <%= render BlockScoutWeb.IconsView, "_accounts_icon.html" %>
</span> </span>
Sign in <%= gettext "Sign in" %>
</a> </a>
</li> </li>
<% end %> <% end %>
<% end %> <% end %>

@ -38,7 +38,7 @@
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody data-items data-selector="search-results-list"> <tbody id='search_results_table_body' data-items data-selector="search-results-list">
<%= render BlockScoutWeb.CommonComponentsView, "_table-loader.html", columns_num: 5 %> <%= render BlockScoutWeb.CommonComponentsView, "_table-loader.html", columns_num: 5 %>
</tbody> </tbody>
</table> </table>
@ -48,4 +48,4 @@
</div> </div>
</div> </div>
<script defer data-cfasync="false" src="<%= static_path(@conn, "/js/search-results.js") %>"></script> <script defer data-cfasync="false" src="<%= static_path(@conn, "/js/search-results.js") %>"></script>
</section> </section>

@ -1,2 +1,2 @@
<% token_icon_url = Explorer.Chain.get_token_icon_url_by(@chain_id, @address) %> <% token_icon_url = Explorer.Chain.get_token_icon_url_by(@chain_id, @address) %>
<img width=15 height=15 src="<%= token_icon_url %>" style="margin-top: -2px; min-height: 15px; min-width: 15px; border: none; outline: none;<%= if assigns[:style], do: @style %>" class="<%= if assigns[:additional_classes] do @additional_classes |> Enum.join(" ") end %>" alt="" onerror="this.style.visibility='hidden'"/> <img width=15 height=15 src="<%= token_icon_url %>" style="margin-top: -2px; min-height: 15px; min-width: 15px; border: none; outline: none;<%= if assigns[:style], do: @style %>" class="<%= if assigns[:additional_classes] do @additional_classes |> Enum.join(" ") end %>" alt="" onerror="if (this.src != '/images/icons/token_icon_default.svg') this.src = '/images/icons/token_icon_default.svg';"/>

@ -0,0 +1 @@
<img width=15 height=15 src="/images/icons/token_icon_default.svg" style="margin-top: -2px; min-height: 15px; min-width: 15px; border: none; outline: none;<%= if assigns[:style], do: @style %>" class="<%= if assigns[:additional_classes] do @additional_classes |> Enum.join(" ") end %>" alt=""/>

@ -3443,6 +3443,16 @@ msgstr ""
msgid "truffle flattener" msgid "truffle flattener"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:29
#, elixir-autogen, elixir-format
msgid "Sign in"
msgstr ""
#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:11
#, elixir-autogen, elixir-format
msgid "Signed in as "
msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:8 #: lib/block_scout_web/templates/transaction/not_found.html.eex:8
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "1. If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page." msgid "1. If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page."
@ -3453,6 +3463,11 @@ msgstr ""
msgid "2. It could still be in the TX Pool of a different node, waiting to be broadcasted." msgid "2. It could still be in the TX Pool of a different node, waiting to be broadcasted."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:10
#, elixir-autogen, elixir-format
msgid "3. During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it."
msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:11 #: lib/block_scout_web/templates/transaction/not_found.html.eex:11
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "4. If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information." msgid "4. If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information."
@ -3496,11 +3511,6 @@ msgstr ""
msgid "Your request contained an error, perhaps a mistyped tx/block/address hash. Try again, and check the developer tools console for more info." msgid "Your request contained an error, perhaps a mistyped tx/block/address hash. Try again, and check the developer tools console for more info."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:10
#, elixir-autogen, elixir-format
msgid "3. During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it."
msgstr ""
#: lib/block_scout_web/templates/transaction/_actions.html.eex:25 #: lib/block_scout_web/templates/transaction/_actions.html.eex:25
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{qty} of <span class=\"text-muted\">Token ID [%{link_to_id}]</span>" msgid "%{qty} of <span class=\"text-muted\">Token ID [%{link_to_id}]</span>"

@ -3443,6 +3443,16 @@ msgstr ""
msgid "truffle flattener" msgid "truffle flattener"
msgstr "" msgstr ""
#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:29
#, elixir-autogen, elixir-format
msgid "Sign in"
msgstr ""
#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:11
#, elixir-autogen, elixir-format
msgid "Signed in as "
msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:8 #: lib/block_scout_web/templates/transaction/not_found.html.eex:8
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "1. If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page." msgid "1. If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page."
@ -3453,6 +3463,11 @@ msgstr ""
msgid "2. It could still be in the TX Pool of a different node, waiting to be broadcasted." msgid "2. It could still be in the TX Pool of a different node, waiting to be broadcasted."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:10
#, elixir-autogen, elixir-format, fuzzy
msgid "3. During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it."
msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:11 #: lib/block_scout_web/templates/transaction/not_found.html.eex:11
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "4. If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information." msgid "4. If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information."
@ -3496,11 +3511,6 @@ msgstr ""
msgid "Your request contained an error, perhaps a mistyped tx/block/address hash. Try again, and check the developer tools console for more info." msgid "Your request contained an error, perhaps a mistyped tx/block/address hash. Try again, and check the developer tools console for more info."
msgstr "" msgstr ""
#: lib/block_scout_web/templates/transaction/not_found.html.eex:10
#, elixir-autogen, elixir-format, fuzzy
msgid "3. During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it."
msgstr ""
#: lib/block_scout_web/templates/transaction/_actions.html.eex:25 #: lib/block_scout_web/templates/transaction/_actions.html.eex:25
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{qty} of <span class=\"text-muted\">Token ID [%{link_to_id}]</span>" msgid "%{qty} of <span class=\"text-muted\">Token ID [%{link_to_id}]</span>"

@ -304,6 +304,11 @@ defmodule EthereumJSONRPC.Receipt do
:ignore :ignore
end end
# Metis fields
defp entry_to_elixir({key, _}) when key in ~w(l1GasUsed l1GasPrice l1FeeScalar l1Fee) do
:ignore
end
# GoQuorum specific transaction receipt fields # GoQuorum specific transaction receipt fields
defp entry_to_elixir({key, _}) when key in ~w(isPrivacyMarkerTransaction) do defp entry_to_elixir({key, _}) when key in ~w(isPrivacyMarkerTransaction) do
:ignore :ignore

@ -1,12 +1,21 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
transport_options: [ transport_options: [
http: EthereumJSONRPC.HTTP.HTTPoison, http: EthereumJSONRPC.HTTP.HTTPoison,
url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL") || "http://localhost:8545", url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL") || "http://localhost:8545",
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Arbitrum variant: EthereumJSONRPC.Arbitrum
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545", eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545",
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545" trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545"
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Besu variant: EthereumJSONRPC.Besu
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545", eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545",
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545" trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545"
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Erigon variant: EthereumJSONRPC.Erigon
], ],

@ -1,12 +1,21 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
transport_options: [ transport_options: [
http: EthereumJSONRPC.HTTP.HTTPoison, http: EthereumJSONRPC.HTTP.HTTPoison,
url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL") || "http://localhost:7545", url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL") || "http://localhost:7545",
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Ganache variant: EthereumJSONRPC.Ganache
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545", eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545",
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545" trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545"
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Nethermind variant: EthereumJSONRPC.Nethermind
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545", eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545",
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545" trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") || "http://localhost:8545"
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.RSK variant: EthereumJSONRPC.RSK
], ],

@ -1,12 +1,21 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
transport_options: [ transport_options: [
http: EthereumJSONRPC.HTTP.HTTPoison, http: EthereumJSONRPC.HTTP.HTTPoison,
url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL"), url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL"),
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Arbitrum variant: EthereumJSONRPC.Arbitrum
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"), eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"),
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL")
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Besu variant: EthereumJSONRPC.Besu
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"), eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"),
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL")
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Erigon variant: EthereumJSONRPC.Erigon
], ],

@ -1,12 +1,21 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
transport_options: [ transport_options: [
http: EthereumJSONRPC.HTTP.HTTPoison, http: EthereumJSONRPC.HTTP.HTTPoison,
url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL"), url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL"),
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Ganache variant: EthereumJSONRPC.Ganache
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"), eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"),
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL")
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.Nethermind variant: EthereumJSONRPC.Nethermind
], ],

@ -1,5 +1,14 @@
import Config import Config
hackney_opts_base = [pool: :ethereum_jsonrpc]
hackney_opts =
if System.get_env("ETHEREUM_JSONRPC_HTTP_INSECURE", "") == "true" do
[:insecure] ++ hackney_opts_base
else
hackney_opts_base
end
config :explorer, config :explorer,
json_rpc_named_arguments: [ json_rpc_named_arguments: [
transport: EthereumJSONRPC.HTTP, transport: EthereumJSONRPC.HTTP,
@ -11,7 +20,7 @@ config :explorer,
eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"), eth_getBalance: System.get_env("ETHEREUM_JSONRPC_TRACE_URL"),
trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL") trace_replayTransaction: System.get_env("ETHEREUM_JSONRPC_TRACE_URL")
], ],
http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: hackney_opts]
], ],
variant: EthereumJSONRPC.RSK variant: EthereumJSONRPC.RSK
], ],

@ -25,10 +25,13 @@ defmodule Explorer.Chain.Events.Listener do
end end
def handle_info({:notification, _pid, _ref, _topic, payload}, state) do def handle_info({:notification, _pid, _ref, _topic, payload}, state) do
payload expanded_payload = expand_payload(payload)
|> expand_payload()
|> decode_payload!() if expanded_payload != nil do
|> broadcast() expanded_payload
|> decode_payload!()
|> broadcast()
end
{:noreply, state} {:noreply, state}
end end
@ -69,7 +72,12 @@ defmodule Explorer.Chain.Events.Listener do
nil nil
%{data: data} = notification -> %{data: data} = notification ->
Repo.delete(notification) try do
Repo.delete(notification)
rescue
Ecto.StaleEntryError -> nil
end
data data
end end
end end

@ -113,7 +113,7 @@ defmodule Explorer.Mixfile do
# `Timex.Duration` for `Explorer.Counters.AverageBlockTime.average_block_time/0` # `Timex.Duration` for `Explorer.Counters.AverageBlockTime.average_block_time/0`
{:timex, "~> 3.7.1"}, {:timex, "~> 3.7.1"},
{:con_cache, "~> 1.0"}, {:con_cache, "~> 1.0"},
{:tesla, "~> 1.4.4"}, {:tesla, "~> 1.5.0"},
{:cbor, "~> 1.0"}, {:cbor, "~> 1.0"},
{:cloak_ecto, "~> 1.2.0"}, {:cloak_ecto, "~> 1.2.0"},
{:redix, "~> 1.1"} {:redix, "~> 1.1"}

@ -244,7 +244,11 @@ defmodule Indexer.Block.Fetcher do
{import_time, result} = :timer.tc(fn -> callback_module.import(state, options_with_broadcast) end) {import_time, result} = :timer.tc(fn -> callback_module.import(state, options_with_broadcast) end)
no_blocks_to_import = length(options_with_broadcast.blocks.params) no_blocks_to_import = length(options_with_broadcast.blocks.params)
Prometheus.Instrumenter.block_import(import_time / no_blocks_to_import, callback_module)
if no_blocks_to_import != 0 do
Prometheus.Instrumenter.block_import(import_time / no_blocks_to_import, callback_module)
end
result result
end end

@ -154,4 +154,8 @@ VISUALIZE_SOL2UML_SERVICE_URL=http://host.docker.internal:8050/
# ACCOUNT_SENDGRID_TEMPLATE= # ACCOUNT_SENDGRID_TEMPLATE=
ACCOUNT_CLOAK_KEY= ACCOUNT_CLOAK_KEY=
ACCOUNT_ENABLED=false ACCOUNT_ENABLED=false
ACCOUNT_REDIS_URL=redis://redis_db:6379 ACCOUNT_REDIS_URL=redis://redis_db:6379
# MIXPANEL_TOKEN=
# MIXPANEL_URL=
# AMPLITUDE_API_KEY=
# AMPLITUDE_URL=

@ -34,6 +34,11 @@ ARG WOBSERVER_ENABLED
ARG ADMIN_PANEL_ENABLED ARG ADMIN_PANEL_ENABLED
ARG CACHE_ADDRESS_WITH_BALANCES_UPDATE_INTERVAL ARG CACHE_ADDRESS_WITH_BALANCES_UPDATE_INTERVAL
ARG SOCKET_ROOT ARG SOCKET_ROOT
ARG SESSION_COOKIE_DOMAIN
ARG MIXPANEL_TOKEN
ARG MIXPANEL_URL
ARG AMPLITUDE_API_KEY
ARG AMPLITUDE_URL
# Cache elixir deps # Cache elixir deps
ADD mix.exs mix.lock ./ ADD mix.exs mix.lock ./

@ -556,6 +556,18 @@ endif
ifdef VISUALIZE_SOL2UML_SERVICE_URL ifdef VISUALIZE_SOL2UML_SERVICE_URL
BLOCKSCOUT_CONTAINER_PARAMS += -e 'VISUALIZE_SOL2UML_SERVICE_URL=$(VISUALIZE_SOL2UML_SERVICE_URL)' BLOCKSCOUT_CONTAINER_PARAMS += -e 'VISUALIZE_SOL2UML_SERVICE_URL=$(VISUALIZE_SOL2UML_SERVICE_URL)'
endif endif
ifdef MIXPANEL_TOKEN
BLOCKSCOUT_CONTAINER_PARAMS += -e 'MIXPANEL_TOKEN=$(MIXPANEL_TOKEN)'
endif
ifdef MIXPANEL_URL
BLOCKSCOUT_CONTAINER_PARAMS += -e 'MIXPANEL_URL=$(MIXPANEL_URL)'
endif
ifdef AMPLITUDE_API_KEY
BLOCKSCOUT_CONTAINER_PARAMS += -e 'AMPLITUDE_API_KEY=$(AMPLITUDE_API_KEY)'
endif
ifdef AMPLITUDE_URL
BLOCKSCOUT_CONTAINER_PARAMS += -e 'AMPLITUDE_URL=$(AMPLITUDE_URL)'
endif
HAS_BLOCKSCOUT_IMAGE := $(shell docker images | grep -sw "${BS_CONTAINER_IMAGE} ") HAS_BLOCKSCOUT_IMAGE := $(shell docker images | grep -sw "${BS_CONTAINER_IMAGE} ")

@ -94,7 +94,7 @@ defmodule BlockScout.Mixfile do
[ [
{:prometheus_ex, git: "https://github.com/lanodan/prometheus.ex", branch: "fix/elixir-1.14", override: true}, {:prometheus_ex, git: "https://github.com/lanodan/prometheus.ex", branch: "fix/elixir-1.14", override: true},
{:absinthe_plug, git: "https://github.com/blockscout/absinthe_plug.git", tag: "1.5.3", override: true}, {:absinthe_plug, git: "https://github.com/blockscout/absinthe_plug.git", tag: "1.5.3", override: true},
{:tesla, "~> 1.4.4"}, {:tesla, "~> 1.5.0"},
# Documentation # Documentation
{:ex_doc, "~> 0.29.0", only: :dev, runtime: false}, {:ex_doc, "~> 0.29.0", only: :dev, runtime: false},
{:number, "~> 1.0.3"} {:number, "~> 1.0.3"}

@ -29,15 +29,15 @@
"credo": {:hex, :credo, "1.6.7", "323f5734350fd23a456f2688b9430e7d517afb313fbd38671b8a4449798a7854", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "41e110bfb007f7eda7f897c10bf019ceab9a0b269ce79f015d54b0dcf4fc7dd3"}, "credo": {:hex, :credo, "1.6.7", "323f5734350fd23a456f2688b9430e7d517afb313fbd38671b8a4449798a7854", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "41e110bfb007f7eda7f897c10bf019ceab9a0b269ce79f015d54b0dcf4fc7dd3"},
"csv": {:hex, :csv, "2.5.0", "c47b5a5221bf2e56d6e8eb79e77884046d7fd516280dc7d9b674251e0ae46246", [:mix], [{:parallel_stream, "~> 1.0.4 or ~> 1.1.0", [hex: :parallel_stream, repo: "hexpm", optional: false]}], "hexpm", "e821f541487045c7591a1963eeb42afff0dfa99bdcdbeb3410795a2f59c77d34"}, "csv": {:hex, :csv, "2.5.0", "c47b5a5221bf2e56d6e8eb79e77884046d7fd516280dc7d9b674251e0ae46246", [:mix], [{:parallel_stream, "~> 1.0.4 or ~> 1.1.0", [hex: :parallel_stream, repo: "hexpm", optional: false]}], "hexpm", "e821f541487045c7591a1963eeb42afff0dfa99bdcdbeb3410795a2f59c77d34"},
"dataloader": {:hex, :dataloader, "1.0.10", "a42f07641b1a0572e0b21a2a5ae1be11da486a6790f3d0d14512d96ff3e3bbe9", [:mix], [{:ecto, ">= 3.4.3 and < 4.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:telemetry, "~> 1.0 or ~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "54cd70cec09addf4b2ace14cc186a283a149fd4d3ec5475b155951bf33cd963f"}, "dataloader": {:hex, :dataloader, "1.0.10", "a42f07641b1a0572e0b21a2a5ae1be11da486a6790f3d0d14512d96ff3e3bbe9", [:mix], [{:ecto, ">= 3.4.3 and < 4.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:telemetry, "~> 1.0 or ~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "54cd70cec09addf4b2ace14cc186a283a149fd4d3ec5475b155951bf33cd963f"},
"db_connection": {:hex, :db_connection, "2.4.2", "f92e79aff2375299a16bcb069a14ee8615c3414863a6fef93156aee8e86c2ff3", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4fe53ca91b99f55ea249693a0229356a08f4d1a7931d8ffa79289b145fe83668"}, "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"},
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
"decorator": {:hex, :decorator, "1.4.0", "a57ac32c823ea7e4e67f5af56412d12b33274661bb7640ec7fc882f8d23ac419", [:mix], [], "hexpm", "0a07cedd9083da875c7418dea95b78361197cf2bf3211d743f6f7ce39656597f"}, "decorator": {:hex, :decorator, "1.4.0", "a57ac32c823ea7e4e67f5af56412d12b33274661bb7640ec7fc882f8d23ac419", [:mix], [], "hexpm", "0a07cedd9083da875c7418dea95b78361197cf2bf3211d743f6f7ce39656597f"},
"deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
"dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"}, "dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"},
"digital_token": {:hex, :digital_token, "0.4.0", "2ad6894d4a40be8b2890aad286ecd5745fa473fa5699d80361a8c94428edcd1f", [:mix], [{:cldr_utils, "~> 2.17", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "a178edf61d1fee5bb3c34e14b0f4ee21809ee87cade8738f87337e59e5e66e26"}, "digital_token": {:hex, :digital_token, "0.4.0", "2ad6894d4a40be8b2890aad286ecd5745fa473fa5699d80361a8c94428edcd1f", [:mix], [{:cldr_utils, "~> 2.17", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "a178edf61d1fee5bb3c34e14b0f4ee21809ee87cade8738f87337e59e5e66e26"},
"earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"},
"ecto": {:hex, :ecto, "3.9.2", "017db3bc786ff64271108522c01a5d3f6ba0aea5c84912cfb0dd73bf13684108", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "21466d5177e09e55289ac7eade579a642578242c7a3a9f91ad5c6583337a9d15"}, "ecto": {:hex, :ecto, "3.9.4", "3ee68e25dbe0c36f980f1ba5dd41ee0d3eb0873bccae8aeaf1a2647242bffa35", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "de5f988c142a3aa4ec18b85a4ec34a2390b65b24f02385c1144252ff6ff8ee75"},
"ecto_sql": {:hex, :ecto_sql, "3.9.1", "9bd5894eecc53d5b39d0c95180d4466aff00e10679e13a5cfa725f6f85c03c22", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5fd470a4fff2e829bbf9dcceb7f3f9f6d1e49b4241e802f614de6b8b67c51118"}, "ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"},
"elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"}, "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"ex_abi": {:hex, :ex_abi, "0.5.16", "735f14937bc3c8fd53c38f02936ef8bf93d26a0b999cb0230b105d901530acaf", [:mix], [{:ex_keccak, "~> 0.6.0", [hex: :ex_keccak, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "82ee815f438c5d29ddc3e151a23a9eb5e906f3472cc6f5005b6f5a7f37332efe"}, "ex_abi": {:hex, :ex_abi, "0.5.16", "735f14937bc3c8fd53c38f02936ef8bf93d26a0b999cb0230b105d901530acaf", [:mix], [{:ex_keccak, "~> 0.6.0", [hex: :ex_keccak, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "82ee815f438c5d29ddc3e151a23a9eb5e906f3472cc6f5005b6f5a7f37332efe"},
@ -127,7 +127,7 @@
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
"statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"},
"telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"}, "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"},
"tesla": {:hex, :tesla, "1.4.4", "bb89aa0c9745190930366f6a2ac612cdf2d0e4d7fff449861baa7875afd797b2", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "d5503a49f9dec1b287567ea8712d085947e247cb11b06bc54adb05bfde466457"}, "tesla": {:hex, :tesla, "1.5.0", "7ee3616be87024a2b7231ae14474310c9b999c3abb1f4f8dbc70f86bd9678eef", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "1d0385e41fbd76af3961809088aef15dec4c2fdaab97b1c93c6484cb3695a122"},
"timex": {:hex, :timex, "3.7.9", "790cdfc4acfce434e442f98c02ea6d84d0239073bfd668968f82ac63e9a6788d", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "64691582e5bb87130f721fc709acfb70f24405833998fabf35be968984860ce1"}, "timex": {:hex, :timex, "3.7.9", "790cdfc4acfce434e442f98c02ea6d84d0239073bfd668968f82ac63e9a6788d", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "64691582e5bb87130f721fc709acfb70f24405833998fabf35be968984860ce1"},
"toml": {:hex, :toml, "0.6.2", "38f445df384a17e5d382befe30e3489112a48d3ba4c459e543f748c2f25dd4d1", [:mix], [], "hexpm", "d013e45126d74c0c26a38d31f5e8e9b83ea19fc752470feb9a86071ca5a672fa"}, "toml": {:hex, :toml, "0.6.2", "38f445df384a17e5d382befe30e3489112a48d3ba4c459e543f748c2f25dd4d1", [:mix], [], "hexpm", "d013e45126d74c0c26a38d31f5e8e9b83ea19fc752470feb9a86071ca5a672fa"},
"tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"}, "tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"},

Loading…
Cancel
Save